Java内部类
成员内部类:
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 } } }
静态内部类:
1、内部类如果使用static声明,则此内部类就称为静态内部类。(其实也相当于外部类)可以通过外部类.内部类来访问。
2、静态内部类使用场合:内部类不需要外部类的实例(注意区分成员内部类),静态内部类存在仅仅为外部类提供服务或者逻辑上属于外部类,且逻辑上可以单独存在。
3、静态内部类的特征:
静态内部类不会持有外部类的引用
静态内部类可以直接访问外部的静态变量(直接写变量名),如果访问外部类的非静态成员变量必须通过外部类的实例访问
4、Java中只有内部类才可以是静态的
使用格式:Outer.Inner inner = new Outer.Inner();
public class Company { String companyNam; static String country; static class Clear{ String name; public Clear() { // TODO Auto-generated constructor stub } public Clear(String name) { super(); this.name = name; } public void work(String name){ String na=new Company().companyNam="联想"; country="中国"; System.out.println(name+"为"+na+"打扫卫生,该公司属于"+country); } } }
public class Test { public static void main(String[] args) { Company.Clear zcl=new Company.Clear(); zcl.work("shen_hua"); } }
局部内部类:
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.局部内部类:什么都不写