1. 内部クラスの概念
2. メンバーの内部クラス
メンバーの内部クラスは通常、非静的で変更された内部クラスを表します。
静的に変更された内部クラスは、一般に静的内部クラスと呼ばれます。
Outer.Inner oi = new inner().new Inner(); を使用して内部クラスを作成すると、外部クラス オブジェクトのアドレス値 アウター this がヒープ メモリ上の内部クラス オブジェクトに自動的に作成されます。
3. 静的内部クラス
静的であれば (クラス名.) を使用して取得できます (静的内部クラスについても同様です)。
方程式の右側の new は、外側ではなく内側を表すために使用されます。
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();
}
}