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 }