内部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
我们新建一个Innerclass包
定义一个Outer类(外部)
在里面写一个属性和方法
private int id;
public void out(){
System.out.println("这是外部类的方法")
}
然后我们在Outer类里面在写一个Inner类
public void Ourter{
private int id;
public void out(){
System.out.println("这是外部类的方法")
}
class inner{
public void in(){
System.out.println("这是内部类方法")
}
}
}
然后我们在新建一个Application类
new一下外部类
Outer outer = new Outer();
而内部类是需要通过外部类来实例化
Outer.Inner inner = outer.new Inner();
内部类可以获取外部类的属性和方法
黑色为外部类 蓝色为内部类
然后再Application类里面输入inner.getID()就可以调用了
静态内部类
我们在内部类的前面加上static 就会发现id报错了
是因为在Outer外部类的后面,先实例化了Inner类在实例化Outer,那个时候int id 这个属性还没有所以会爆错
除非把上面的Outer类也给加上一个static
静态内部类无法访问非静态外部类
我们在写一个class A{}
就会发现旁边InnerClass包下的Outer类的A和Outer展开了
这个跟内部类不一样
这个只能算是Outer类下面多了一个A类
这个类不可以是public开头, 因为一个java文件里面只能有一个public class
但是可以有多个class类,但是只能有一个public class
局部内部类
我们在Outer类里面写一个mrthod方法
在该方法里面写一个class Inner 也是一个内部类
叫做局部内部类
匿名内部类
我们在写一个Test类
在这个类下发在写一个Apple类
里面输出一个 1
然后在Text类的main方法里面
new一个Apple
Apple apple = new Apple();
//Apple 引用 apple 名称 new Apple()实际类型
其中apple是名称
我们可以没有名字却可以初始化类
我们直接new一个Apple 在引用eat方法
这样他就没有名字,
不要将实例保存在变量中
接口也是没有名字
我们在下发输入一个、
interface UserService{
void hello();
}
然在Test的main方法中
new UserService{
@Override
public void hello(){
}
};
重写一下hello
然后就会自动变成
UserService userService = new UserService() {
@Override
public void hello() {
}
}
这方法也是没有名字的