好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java内部类原理、概述与用法实例详解

本文实例讲述了java内部类原理、概述与用法。分享给大家供大家参考,具体如下:

内部类的概述

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/*

   内部类概述:

     把类定义在其他类的内部,这个类就被称为内部类。

     举例:在类a中定义了一个类b,类b就是内部类。

   内部的访问特点:

     a:内部类可以直接访问外部类的成员,包括私有。

     b:外部类要访问内部类的成员,必须创建对象。

*/

class outer {

   private int num = 10 ;

   class inner {

     public void show() {

       //内部类可以直接访问外部类的成员,包括私有。

       system.out.println(num);

     }

   }

   public void method() {

     //找不到符号

     //show();

     //外部类要访问内部类的成员,必须创建对象。

     inner i = new inner();

     i.show();

   }

}

class innerclassdemo {

   public static void main(string[] args) {

   }

}

内部类位置

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

/*

   内部类位置

     成员位置:在成员位置定义的类,被称为成员内部类。

     局部位置:在局部位置定义的类,被称为局部内部类。

   成员位置:在成员位置定义的类,被称为成员内部类。

*/

class outer {

   private int num = 10;

   //成员位置

   /*

   class inner {

   }

   */

   public void method() {

     //局部位置

     class inner {

     }

   }

}

class innerclassdemo2 {

   public static void main(string[] args) {

   }

}

如何直接访问成员内部类的成员

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/*

   成员内部类:

     如何直接访问内部类的成员。

     外部类名.内部类名 对象名 = 外部类对象.内部类对象;

*/

class outer {

   private int num = 10 ;

   class inner {

     public void show() {

       system.out.println(num);

     }

   }

}

class innerclassdemo3 {

   public static void main(string[] args) {

     //需求:我要访问inner类的show()方法

     //格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;

     outer.inner oi = new outer(). new inner();

     oi.show();

   }

}

成员内部类的修饰符:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/*

   成员内部类的修饰符:

     private 为了保证数据的安全性

     static 为了方便访问数据

       注意:静态内部类访问的外部类数据必须用静态修饰。

   案例:我有一个人(人有身体,身体内有心脏。)

     class body {

       private class heart {

         public void operator() {

           system.out.println("心脏搭桥");

         }

       }

       public void method() {

         if(如果你是外科医生) {

           heart h = new heart();

           h.operator();

         }

       }

     }

     按照我们刚才的讲解,来使用一下

     body.heart bh = new body().new heart();

     bh.operator();

     //加了private后,就不能被访问了,那么,怎么玩呢?

     body b = new body();

     b.method();

*/

class outer {

   private int num = 10 ;

   private static int num2 = 100 ;

   //内部类用静态修饰是因为内部类可以看出是外部类的成员

   public static class inner {

     public void show() {

       //system.out.println(num);

       system.out.println(num2);

     }

     public static void show2() {

       //system.out.println(num);//报错。静态内部类访问的外部类数据必须用静态修饰。

       system.out.println(num2);

     }

   }

}

class innerclassdemo4 {

   public static void main(string[] args) {

     //使用内部类

     // 限定的新静态类

     //outer.inner oi = new outer().new inner();//这个访问方式错误

     //oi.show();

     //oi.show2();

     //成员内部类被静态修饰后的访问方式是:

     //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();

     outer.inner oi = new outer.inner();

     oi.show();

     oi.show2();

     //show2()的另一种调用方式。因为静态方法,可以通过类名调用。

     outer.inner.show2();

   }

}

内部类和外部类没有继承关系。

通过外部类名限定this对象

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/*

   案例:

     要求请填空分别输出30,20,10。

   注意:

     1:内部类和外部类没有继承关系。

     2:通过外部类名限定this对象

       outer.this

*/

class outer {

   public int num = 10 ;

   class inner {

     public int num = 20 ;

     public void show() {

       int num = 30 ;

       system.out.println(num);

       system.out.println( this .num);

       //system.out.println(new outer().num);

       system.out.println(outer. this .num);

     }

   }

}

class innerclasstest {

   public static void main(string[] args) {

     outer.inner oi = new outer(). new inner();

     oi.show();

   }

}

局部位置的内部类访问局部变量问题

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/*

   局部内部类

     a:可以直接访问外部类的成员

     b:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能

   注意事项:

     局部内部类访问局部变量的注意事项?

     a:局部内部类访问局部变量必须用final修饰

     b:为什么呢?

       局部变量是随着方法的调用而调用,随着调用完毕而消失。

       而堆内存inner的内容并不会立即消失。所以,我们加final修饰。

       加入final修饰后,这个变量就成了常量。既然是常量。你消失了。

       我在内存中存储的是数据20,所以,我还是有数据在使用。

*/

class outer {

   private int num = 10 ;

   public void method() {

     //int num2 = 20;

     final int num2 = 20 ; //局部内部类访问局部变量必须用final修饰

     class inner {

       public void show() {

         system.out.println(num);

         //从内部类中访问本地变量num2; 需要被声明为最终类型

         system.out.println(num2); //20

       }

     }

     //system.out.println(num2);

     inner i = new inner();

     i.show();

   }

}

class innerclassdemo5 {

   public static void main(string[] args) {

     outer o = new outer();

     o.method();

   }

}

匿名内部类格式,方法调用

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/*

   匿名内部类

     就是内部类的简化写法。

   前提:存在一个类或者接口

     这里的类可以是具体类也可以是抽象类。

   格式:

     new 类名或者接口名(){

       重写方法;

     }

   本质是什么呢?

     是一个继承了该类或者实现了该接口的子类的匿名对象。

*/

interface inter {

   public abstract void show();

   public abstract void show2();

}

class outer {

   public void method() {

     inter i = new inter() { //多态

       public void show() {

         system.out.println( "show" );

       }

       public void show2() {

         system.out.println( "show2" );

       }

     };

     i.show(); //是一个继承了该类或者实现了该接口的子类的匿名对象。所以可以调用方法

     i.show2();

   }

}

class innerclassdemo6 {

   public static void main(string[] args) {

     outer o = new outer();

     o.method();

   }

}

匿名内部类在开发中的使用

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/*

   匿名内部类在开发中的使用

*/

interface person {

   public abstract void study();

}

class persondemo {

   //接口名作为形式参数

   //其实这里需要的不是接口,而是该接口的实现类的对象

   public void method(person p) {

     p.study();

   }

}

//实现类

class student implements person {

   public void study() {

     system.out.println( "好好学习,天天向上" );

   }

}

class innerclasstest2 {

   public static void main(string[] args) {

     //测试

     persondemo pd = new persondemo();

     person p = new student();

     pd.method(p);

     system.out.println( "--------------------" );

     //匿名内部类在开发中的使用

     //匿名内部类的本质是继承类或者实现了接口的子类匿名对象

     //用完一次就消失

     person ss = new person(){

       public void study() {

         system.out.println( "好好学习,天天向上" );

       }

     };

     pd.method(ss);

     // pd.method(new person(){

       // public void study() {

         // system.out.println("好好学习,天天向上");

       // }

     // });

   }

}

案例

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

/*

   案例:

     按照要求,补齐代码

       interface inter { void show(); }

       class outer { //补齐代码 }

       class outerdemo {

         public static void main(string[] args) {

            outer.method().show();

          }

       }

       要求在控制台输出]helloworld]

*/

interface inter {

   void show();

   //记得默认有 public abstract

}

class outer {

   //补齐代码

   public static inter method() {

     //子类对象 -- 子类匿名对象

     return new inter() {

       public void show() {

         system.out.println("helloworld");

       }

     };

   }

}

class outerdemo {

   public static void main(string[] args) {

     outer.method().show();

     /*

       1:outer.method()可以看出method()应该是outer中的一个静态方法。

       2:outer.method().show()可以看出method()方法的返回值是一个对象。

         又由于接口inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。

     */

   }

}

希望本文所述对大家java程序设计有所帮助。

原文链接:https://HdhCmsTestcnblogs测试数据/baiyangyuanzi/p/6831624.html

查看更多关于Java内部类原理、概述与用法实例详解的详细内容...

  阅读:11次