成员内部类:
public class Body { // 外部类 public class Heart { // 成员内部类 // 内部类的方法 public void beat() { System.out.println("心脏跳动"); System.out.println("我叫:" + name); } } // 外部类成员变量 private String name; // 外部类成员方法 public void methodBody() { System.out.println("外部类方法"); // 注意:内用外,随意访问,外用内,需要内部类对象 Heart heart = new Heart(); heart.beat(); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class Test { public static void main(String[] args) { // 间接方式使用内部类(在外部类中使用内部类) Body body = new Body(); body.setName("lily"); body.methodBody(); // 直接方式使用内部类(直接创建内部类对象) Body.Heart heart = new Body().new Heart(); heart.beat(); } }
编译后的.class文件:
关于成员内部类访问变量问题:
public class Outer { int num = 10; // 外部类成员变量 int age = 90; public class Inner { int num = 20; // 内部类成员变量 public void methodInner() { int num = 30; // 内部类方法的局部变量 // 先找方法內的局部变量,找不到会自动向上查找 System.out.println(age); // 90 // 出现重名问题,要访问特定的变量 System.out.println(num); // 30 System.out.println(this.num); // 20 System.out.println(Outer.this.num); // 10 } } }
局部内部类:
public class Outer { public void methodOuter() { class Inner { // 局部内部类 // 局部内部类如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】 final int num = 10; // 从java 8+开始,只要局部变量事实不变,那么final关键字可以省略 public void methodInner() { System.out.println(num); // 10 } } // 局部内部类只能在方法内部创建对象,进行使用 Inner inner = new Inner(); inner.methodInner(); } }
匿名内部类:
public interface MyInterface { void method(); }
public class Test { public static void main(String[] args) { MyInterface obj = new MyInterface() { @Override public void method() { System.out.println("匿名内部类实现了方法!"); } }; obj.method(); // 匿名内部类实现了方法! } }
定义一个类的时候,权限修饰符规则:
1.外部类:public / (default)
2.成员内部类:public / protected / (default) / private
3.局部内部类:什么都不写
原文:https://www.cnblogs.com/roadlandscape/p/12079182.html