Java中的内部类
分类:
1.成员内部类
2.局部内部类(包含匿名内部类)
成员内部类
定义格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
注意事项:内部类使用外部类可以随意访问;外部类使用内部类需要借助内部类对象
当内部类名为heart 外部类名为body时 编译后的文件如图所示:
调用方法如图:
内部类的重名问题:
public class Outer{
int num = 10;
public class Inner{
int num = 20;
public void methodInner(){
int num = 30; // 内部类方法的局部变量
System.out.println(num); //就近原则 输出值 30
System.out.println(this.num); //内部类的成员变量 输出值 20
//错误写法
System.out.println(super.num); //!!!!错误写法 内部类的父类是Object 不是Outer
//想输出外部类的 num值 格式应为
System.out.println(Outer.this.num); // 外部类名.this.num
}
}
}
局部内部类
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类
格式:
public class Out{
public void OutMethod(){
class Inner{ //局部内部类
public void InnerMethod(){
}
}
}
Inner inner = new Inner(); //创建局部内部类对象
inner.InnerMethod();
}
public class Demo{
public static void main(String[] args){
Outer obj = new Outer();
obj.methodOuter();
//仅可通过 创建外部对象 调用含有内部类的方法
}
}
注意事项:
定义类时 权限修饰符使用规则
1.外部类:public / (default)
2.成员内部类 public / protected / (default) / private
3.局部内部类:什么都不能写!!!!!!!
匿名内部类(最重要)
如果接口的实现类,或者是父类的子类,只需要使用唯一的一次
那么这种情况下就可以省略掉该类的定义而改为匿名内部类
格式:
接口名称 对象名 = new 接口名(){
里面覆盖重写所有抽象方法
}
public interface Myinterface{
void method(); //抽象方法
}
//正常接口的实现
public class MyiterfaceImpl implements Myinterface{
@Override
public void method(){
System.out.println("实现类覆盖重写了方法");
}
}
public class Demo{
public static void main(String[] args){
//使用匿名内部类
MyInterface obj = new MyInterface{
@Override
public void method(){
System.out.println("匿名内部类实现了方法");
}
};
obj.method(); //实现调用
}
}
匿名内部类的注意事项:
匿名内部类,在创建对象的时候只能使用唯一的一次