Java基础:内部类

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();
    }
}

猜你喜欢

转载自blog.csdn.net/Orange_sparkle/article/details/129064558