内部类

内部类

成员内部类
// Computer类和Part成员内部类
public class Computer {
    private String name = "计算机";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    private void call(){
        System.out.println("我叫计算机不是计算器");
    }
    int fn(int a){
        this.call();
        System.out.println("我是普通方法");
        return 6;
    }
    protected  void f(){
        System.out.println("我是父类受保护的方法");
    }
    class Part{
        String ram = "64G";
        String disk = "固态硬盘";
        void fn(){
            System.out.println(name); // 直接访问父类的私有属性
            call(); // 直接访问父类的私有方法
        }
    }
}
// 主类
public class MyClass {
    public static void main(String[] args) {
        Computer computer = new Computer();
        Computer.Part part = computer.new Part();  // 通过外部类去new内部类
        part.fn();
    }
}
静态内部类 // 内部类用static修饰,static修饰类也只能修饰内部类和private一样
public class Computer {
    private static String brand = "品牌";
    private String name = "计算机";
    private void call(){
        System.out.println("我叫计算机不是计算器");
    }
    static class Device{
        String screen = "AOC";
        void fun(){
            System.out.println(brand); // 静态的类只能访问外部类的静态方法和静态属性
            call(); // 这是不行的static加载比这方法快
        }
    }
}

// 使用静态类部类
Computer.Device device = new Computer.Device();

// 问题? 为什么不能通过外部类实例去new静态类部类
// 回答! 静态修饰跟着类走不能通过实例访问(static的基础知识)
局部内部类
只能在方法内部访问
public class Computer {
    int fn(int a){
// 在一个方法中去定义一个类,这个类不能加修饰符,此时也不是default,default本来也不能修饰类
        class DiffrentName{
            String brand1 = "小米";
            String brand2= "苹果";
        }
        // 只能方法内使用
        new DiffrentName();
        return 6;
    }
}

匿名内部类
// 匿名内部类实现接口
new animalAction(){
            @Override
            public int hashCode() {
                return super.hashCode();
            }

            @Override
            public void eat() {

            }

            @Override
            public void drink() {

            }

            @Override
            public void la() {

            }

            @Override
            public void sa() {

            }
        };

public interface animalAction {
    // 属性都是public static final
    int a = 1;
    // 没有构造函数不能被new
    // 方法都是public abstract 可省略
    void eat();
    void drink();
    void la();
    void sa();
}
posted @ 2021-02-20 21:11  火鸡的呐喊  阅读(39)  评论(0编辑  收藏  举报