1.内部类概念
2.成员内部类
成员内部类一般表示非static修饰的内部类
static修饰的内部类一般叫静态内部类
用Outer.Inner oi = new Outer().new Inner(); 创建内部类时, 堆内存中内部类对象中会自动创建一个外部类对象的地址值Outer this.
3.静态内部类
只要是静态的东西, 都可以用(类名.)来获得. 静态内部类也一样.
扫描二维码关注公众号,回复:
15136163 查看本文章
其中等式右边的new是用来表示Inner的, 不是outer.
4.局部内部类
5.匿名内部类
其实更准确的应该叫匿名内部类的对象.
实现接口的类也可以被赋值给接口类(多态), 相当于实现父类的子类也可以被赋值给父类.
创建出来的对象的类型主要看等式右边new之后的类型
匿名内部类在类中就是成员内部类, 在方法中就是局部内部类
// 接口
package cn.ncepu.demo1.a02innerdemo2;
public interface Swim {
public abstract void swim();
}
// 父类
package cn.ncepu.demo1.a02innerdemo2;
public abstract class Person implements Swim{
@Override
public void swim() {
System.out.println("这是正常的类实现接口");
}
public abstract void eat();
}
// 子类
package cn.ncepu.demo1.a02innerdemo2;
public class Student extends Person {
@Override
public void eat() {
System.out.println("老方法:创建一个子类来继承父类");
}
}
// 测试类
package cn.ncepu.demo1.a02innerdemo2;
public class Test {
public static void main(String[] args) {
// 匿名内部类(接口)
// 两个大括号之间真正代表了匿名内部类, Swim是接口的名字, new是创建该匿名内部类的对象
// 所以实现接口需要重写所有抽象方法
new Swim(){
@Override
public void swim() {
System.out.println("这是匿名内部类的实现接口的方法");
}
};// 需要;号
// 匿名内部类(类), 正常实现类是 类名 变量名 = new 类名();
// 两个大括号之间真正代表了匿名内部类, Person是匿名内部类的父类的名字, new是创建该匿名内部类(子类)的对象
// 所以继承父类需要重写所有抽象方法
// 接口多态, p的类型主要看等式右边new表示的类型
Person p = new Person(){
@Override
public void eat() {
System.out.println("这是匿名内部类的继承父类的方法");
}
};
// 所以可以用匿名类对象直接调用里面的方法
p.eat();
// 也可以在大括号之后直接调用
new Person(){
@Override
public void eat() {
System.out.println("这是匿名内部类的继承父类的方法");
}
}.eat();
// 匿名内部类的使用场景(如:调用method方法)
// 老方法
Student student = new Student();
method(student);
// 新方法(用匿名内部类)
// 当该子类只使用一次的情况下用匿名内部类
method(
new Person() {
@Override
public void eat() {
System.out.println("新方法:用匿名内部类, 省去了创建子类和对象的时间");
}
}
);
}
public static void method(Person person){
person.eat();
}
}