内部类:在一个类中再次创建的类称为内部类,另一个类称为外部类;内部类分为有名内部类和匿名内部类
有名内部类:有自己名称的内部类,编译后生成 外部类$内部类.class文件
public class Student{//外部类
class Grade{//有名内部类
public void benefit() {
System.out.println("成绩好得益于学习");
}
}
{
Grade grade = new Grade();//在代码块中相当于Grade grade = this.new Grade();
}
public static void main(String[] args) {
Student student = new Student();
Grade grade = student.new Grade();//在创建内部类对象时需要依靠外部类对象
grade.benefit();
}
}
匿名内部类:没有自己名字的内部类,需要依靠创建对象来定义,必须和创建对象同时存在。匿名内部类一定是创建对象的类的子类,或者一定是接口的实现类。编译后生成 外部类$数值.class文件(数值从1开始,几个匿名内部类就有几个数值)
格式:new 父类构造器([参数列表]) | 接口{
匿名内部类类体
}
public class Body {
public void beat() {
System.out.println("心脏正在跳动");
}
static Body body = new Body(){//是Body类的子类
@Override
public void beat() {//重写了父类中的方法
System.out.println("心脏正在跳动");
}
};
public static void main(String[] args) {
body.beat();//方法通过父类对象调用
}
}
public interface Body {
public void beat();
}
public class Test implements Body{
static Body body = new Body(){//是Body接口的实现类
@Override
public void beat() {//重写了接口中的虚拟方法
System.out.println("心脏正在跳动");
}
};
public static void main(String[] args) {
body.beat();//通过接口对象进行调用
}
}
匿名内部类常用于重写父类和接口中的方法,当然也可以定义新的属性与方法,但是此方法上的上转型对象无法调用
关于修饰符问题
public class Test {//外部类与接口修饰符只能是public或默认
public class Child{//内部类与接口修饰符4种均可
}
private class Parent{
}
public static void main(String[] args) {
class Brother{//与局部变量一样,局部内部类不允许添加任何修饰符
}
}
}