Java中的内部类

Java内部类分为:1、成员内部类;2、局部内部类(包含匿名内部类);

一、成员内部类的定义与使用:

 1 public class Body {
 2 
 3     //内部类
 4     public class Heart {
 5 
 6         //内部类的方法
 7         public void beat() {
 8             System.out.println("心脏跳动");
 9             //内部类可以访问外部类的成员变量
10             System.out.println("我的名字:" + name);
11         }
12 
13     }
14 
15     //外部类的成员变量
16     private String name;
17 
18     //外部类的成员方法
19     public void methodBody() {
20         System.out.println("外部类的方法");
21         Heart h = new Heart();
22         h.beat();
23     }
24 
25 }

使用成员内部类有两种方式:

1、间接方式:在外部类的成员方法中,使用内部类,然后main只是调用外部类的该方法(21~22行)。

2、直接方式:公式:外部类名称.内部类名称 对象名 = new 外部类名称().new内部类名称();

 1 public static void main(String[] args) {
 2 
 3         //间接方式
 4         Body b = new Body();
 5         b.methodBody();
 6 
 7         //直接方式
 8         Body.Heart h = new Body().new Heart();
 9         h.beat();
10 
11     }

 访问重名对象的规则:

 1 public class Outer {
 2 
 3     int num = 10;
 4 
 5     public class Inner {
 6 
 7         int num = 30;
 8 
 9         public void methodInner() {
10             int num = 30;
11             System.out.println(num);//输出30
12             System.out.println(this.num);//输出20
13             System.out.println(Outer.this.num);//输出10
14         }
15         
16     }
17     
18 }

 二、局部内部类

如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。只有当前方法能够使用,出了方法之外就不能使用。

 1 public class Outer {
 2 
 3     public void methodOuter() {
 4         class Inner {
 5             private int num = 10;
 6 
 7             public void methodInner() {
 8                 System.out.println(num);//输出10
 9             }
10         }
11 
12         Inner in = new Inner();
13         in.methodInner();
14     }
15 
16 }

类的权限修饰符:

public > protected > (default) > private

1、外部类:public / default

2、成员内部类:public / protected / (default) / private

3、局部内部类:什么都不能写(但是≠default)

 局部内部类访问方法中的局部变量应注意:

 1 /*
 2  * 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】。
 3  *
 4  * 备注:从java8开始,只要局部变量事实不变,那么final关键字可以省略
 5  *
 6  * 原因:
 7  * 1、new出来的对象在堆内存当中。
 8  * 2、局部变量是跟着方法走,在栈内存当中。
 9  * 3、方法结束之后,立刻出栈,局部变量就会立刻消失。
10  * 4、new出来的对象会在堆内存当中持续存在,知道垃圾回收消失。
11  * */
12 public class Outer {
13 
14     public void methodOuter() {
15         final int num = 10;//所在方法的局部变量
16 
17         class Inner {
18             public void methodInner() {
19                 System.out.println(num);
20             }
21         }
22     }
23 
24 }

三、匿名内部类(属于局部内部类)

 1 public interface MyInterface {
 2 
 3     public abstract void method();
 4 
 5 }
 6 
 7 public class DemoMain{
 8 
 9     public static void main(String[] args) {
10 
11         MyInterface m = new MyInterface() {
12             @Override
13             public void method() {
14                 System.out.println("实现了接口的抽象方法");
15             }
16         };
17 
18         m.method();
19     }
20 
21 }
posted @ 2020-06-17 16:36  maider  阅读(176)  评论(0编辑  收藏  举报