07_面向对象高级_内部类

内部类

1. 认识内部类
  • 它是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块)
  • 如果一个类定义在另一个类的内部,这个类就是内部类。
public class Test {
    public static void main(String[] args) {
        // 直接输出: 内部类的静态成员变量
        System.out.println(Outer.Inner.gender);  // null

        // 创建内部类的对象,并调用功能
        Outer.Inner obj = new Outer().new Inner();
        // 调用内部类自己的方法
        obj.run();  // 快跑啊~~~
        obj.test();  // 1、10、100
    }
}

class Outer {
    // 成员变量
    private int number = 100;
    public static String info;

    // 成员方法
    public void run() {
        System.out.println("跑");
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    // 成员内部类
    public class Inner {
        // 成员变量
        private int number = 10;
        public static String gender;  // JDK 16才开始支持定义静态成员

        // 成员方法
        public void run() {
            System.out.println("快跑啊~~~");
        }

        public void test() {
            int number = 1;
            System.out.println(number);
            // 调用内部类的成员
            System.out.println(this.number);
            // 调用外部类的成员
            System.out.println(Outer.this.number);  // 通过Outer.this拿到当前的外部对象
        }

        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }
    }
}
2. 静态内部类 (了解)
  • 有 static 修饰的内部类,就是静态内部类
  • 静态内部类可以直接访问外部类的静态成员,但是不能直接访问外部类的实例成员
public class Test {
    public static void main(String[] args) {
        // 创建"静态内部类"的对象
        Outer.Inner obj = new Outer.Inner();
        obj.test();  // null
    }
}

class Outer {
    private int age;
    public static String schoolId;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 静态内部类
    public static class Inner {
        private String name;
        public static int id;

        public void test() {
            System.out.println(schoolId);  // 可以直接访问外部类的静态成员变量
//          System.out.println(age);  // 报错,不可以可以直接访问外部类的成员变量(对象的变量)
            // 因为这是静态内部类,如图静态方法一样,不能访问对象的变量
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
3. 局部内部类
  • 局部内部类是定义在方法中,代码块中,构造器等执行体中
  • 这个语法没啥用,看看就好
public class Test {
    // main方法,程序入口
    public static void main(String[] args) {

    }
	// run方法
    public static void run() {
        class A {

        }
        abstract class B {

        }
        interface C {
            
        }
    }
}
4. 匿名内部类
  • 概念:它是一种特殊的局部内部类,所谓匿名:指的是程序员不需要为这个类声明名字。

  • 代码展示:

(要求在"代码二"中,使用"匿名内部类"的知识实现"代码一"的功能)

// 代码一
public class Test {
    public static void main(String[] args) {
        Animal obj = new Cat();
        obj.cry();
    }
}

class Cat extends Animal {
    @Override
    public void cry() {
        System.out.println("喵喵喵~~~");
    }
}

abstract class Animal {
    public abstract void cry();
}
// 代码二
public class Test {
    public static void main(String[] args) {
        // 计算机遇到代码"  new Animal(){...};  "会做两件事
        // 1.把这个匿名内部类,编译成一个子类
        // 2.然后会立即创建一个子类对象出来
        Animal obj = new Animal() {
            @Override
            public void cry() {
                System.out.println("喵喵喵~~~");
            }
        };  // 千万要注意!这里不要漏了分号;

        obj.cry();  // 喵喵喵~~~
    }
}

abstract class Animal {
    public abstract void cry();
}
  • 通过上面的演示,你应该很清楚的了解到"匿名内部类"的特点:它的本质就是一个子类,并且会立刻创建出一个子类对象,然后返回出来。
  • 应用场景:使用它可以更方便的创建一个子类,返回出来的对象则通常作为参数进行使用。

你可能感兴趣的:(Java进阶,java)