目录
//成员内部类的调用,外部类.内部类 对象名=new 外部.new 内部();
* 内部类:
* 定义(寄生)一个主类(宿主)里面的类
* 作用:
* 当一个类的内部中有一个部分需要一个完整的结构进行描述,而这一部分只为这个类进行服务,则内部结构可以用内部类完成
* 优点:
* 提供了更好的封装性,内部类可以用private,protected等修饰
* 方便访问外部类的成员,包括私有的成员
* 内部类的分类
* 静态内部类
* 成员内部类
* 局部内部类
* 匿名内部类
外部类
class Outer {
//外部类的成员
public static String o = "外部类的静态成员"; private String u = "外部类的实例成员"; //无参构造器 public Outer(){} //有参构造器 public Outer(String u) { this.u = u; }
/**
* 静态内部类:
* static修饰
* 直接访问外部类的静态成员,间接(对象)访问外部类的实例成员
* 一个类中需要一个完整的部分
*/
public static class Static { private String name = "静态内部类"; // 可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员 public Static() { //System.out.println(u);// 报错 System.out.println(name); System.out.println("可以访问"+o);//外部类的静态成员 } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/**
* 成员内部类:(实例内部类)
* 无static修饰,属于外部类的对象(实例)
* jdk16之前不能定义静态,JDK16之后才可以
* 可以直接访问外部类的静态成员和实例成员
*/
public class Member { private String name = "成员内部类"; public static String s = "JDK16之后支持静态"; public Member(){ System.out.println(name); System.out.println(s); //可以访问外部类的静态成员和实例成员 System.out.println("可以访问"+o); System.out.println("可以访问"+u); }
}
//成员内部类访问寄生的外部类对象:外部类.this.
class Outer { private int num=150; public class Member { private int num=110; public class inMember{ int num=78; public void show(){ System.out.println(num);//78 就近原则 System.out.println(this.num);//110 System.out.println(Outer.this.num);//150 } } } }
主函数
public class Main {
public static void main(String[] args) {
// 静态内部类的调用:外部类.内部类
Outer.Static s = new Outer.Static();
System.out.println("------分割线-------");
//成员内部类的调用,外部类.内部类 对象名=new 外部.new 内部();
//成员内部类属于外部类的对象
Outer.Member m=new Outer().new Member(); Outer.Member m1=new Outer("外部类的有参构造器").new Member();
/**
* 局部内部类
* 在方法,代码块,构造器等执行体中的,(脱裤子放屁)
* 可以抽象,接口
* 文件名:外部类$N内部类.class
*/
class Part{} interface Part1{} abstract class Part2{}
//局部内部类调用:
Part p=new Part();
/**
* 匿名内部类
* 没有名字的内部类
* 写出来就会带出匿名内部类的对象
* 方便创建子类对象,简化代码编写
*/
//格式:new 类|抽象类名|接口名(){ 重写方法;};
Anom a=new Anom() { public void run(){ System.out.println("匿名内部类运行"); } }; a.run();//匿名内部类运行
}
}
匿名内部类用到的抽象类
abstract class Anom{ abstract void run(); }