特点
1.内部类也会生成class文件
2.内部类可以访问外部类的私有成员
组成
成员内部类
1.与方法和属性同级别
2.依赖外部类,必须先new一个外部类对象才能new内部类对象
3.当外部类与内部类有重名属性时,优先访问内部类。
4.成员内部类不可以定义静态成员,但可以定义静态常量
public class Outer{
private String name = "张三";
private int age = 20;
class Inner{
private String address = "北京";
private String phone = "110";
private String name = "李四";
public void show(){
sout(Outer.this.name);
sout(age);
sout(name);
sout(address);
sout(phone);
}
}
}
public class Test{
psvm(String[] args){
Outer outer = new Outer();
Inner inner = outer.new Inner();
Inner inner = new Outer(.new Inner();
inner.show();
}
}
静态内部类
1.不依赖外部类
2.操作与类似于普通类
3.级别,与外部类相同
public class Outer{
private String name = "xxx";
private int age = 20;
static class Inner{
private String address = "上海";
private String phone = "111";
private static int count = 1000;
public void show(){
Outer outer = new Outer();
sout(outer.name);
sout(outer.age);
sout(address);
sout(phone);
sout(Inner.count);
}
}
}
public class Test{
psvm(String[] args){
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
局部内部类
1.定义在方法内部
2.与方法内部局部变量同等级
3.要在该方法内部创建局部内部类对象
4.局部内部类访问该方法的变量时,该变量必须加final,而jdk1.8之后默认添加了final
5.不能包含静态成员
public class Outer{
private String name = "刘德华";
private int age = 35;
public void show(){
String address = "sz";
class Inner{
private String phone = "11234";
private String email = "ldh@qq.com";
public void show2(){
sout(name);
sout(age);
sout(this.phone);
sout(this.email);
}
}
Inner inner = new Inner();
inner.show2();
}
匿名内部类
1.没有名字的局部内部类
2.一切特征与局部内部类相同
3.多用于实现接口和继承父类
Usb usb = new Usb(){
@Override
public void service(){
sout("连接电脑成功,fan开始工作")
}
};
usb.service();