分类:
- 成员内部类
- 局部内部类(包含匿名内部类)
注意:内用外,随意访问;外用内,需要内部类对象
成员内部类 (可用全部修饰符)
public class Body {//外部类
public class Heart{//成员内部类
public void beat(){
System.out.println("内部类的方法");
System.out.println(name);//内部类可以访问外部类资源
}
}
private String name = "外部类name";
//通过外部类方法间接使用内部类方法
public void methodBody(){
Heart heart = new Heart();
heart.beat();
System.out.println("外部类的方法");
}
}
内部类调用方式1
main方法
public class DemoMain {
public static void main(String[] args) {
Body body = new Body();
body.methodBody();
}
}
输出:
内部类的方法
外部类name
外部类的方法
内部类调用方式2
直接创建内部类对象
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
main方法
public class DemoMain {
public static void main(String[] args) {
//外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()
Body.Heart heart = new Body().new Heart();
//对象直接调用内部类方法
heart.beat();
}
}
输出
内部类的方法
外部类name
内部类和外部类字段重名
内部类访问外部类同名字段
外部类.this.外部类成员字段名
public class Body {//外部类
private String name = "外部类name";
public class Heart{//成员内部类
private String name = "内部类name";
public void beat(){
String name = "内部类方法中的name";
System.out.println(name);//内部类方法中的name
System.out.println(this.name);//内部类中的name
System.out.println(Body.this.name);//外部类的name
}
}
}
局部内部类 (什么修饰符都不能写)
在类方法内部创建类
注意:如果想访问所在方法的局部变量,那这个局部变量必须是final
原因:1.new出来的对象在堆内存中
2.局部变量是跟着方法,在栈内存,方法结束后,立即出栈,局部变量会消失
3.new出来的对象,在堆中,直到垃圾回收
public class Outer {
public void methodOuter(){
class Inner{
int num = 10;//final可不写,但必须保证num值不变
public void methodInner(){
System.out.println(num);
}
}
//在方法内部创建内部类对象,调用内部类方法,外部类方法被调用时,内部类也被调用
Inner inner = new Inner();
inner.methodInner();
}
}
匿名内部类
定义格式
接口名称 对象名 = new 接口名称(){
//覆盖重写所有抽象方法
}