Java中的内部类

内部类:定义在类内部的类

1.成员内部类(非静态内部类)

public class A {
    class B {
        public static void main(String[] args) {
            System.out.println("hello world");
        }
    }
}

B是A的成员内部类,新建一个测试类Test.class,在测试类中直接new这个B类是New不出来的

image

正确的new方法,要使用B类,应该先创建类对象:

public class Test {
    static void main() {
        A a = new A();
        A.B b = a.new B();
    }
}

或者还可以这样new出B类:

public class Test {
    static void main() {
        A a = new A();
        A.B b = new A().new B();
    }
}

Tips:private是可以修饰类的,但是只有当B类是A类的成员内部类的时候,才能给B类加private修饰符

成员内部类有一个别的语言都没有的优点:持有一个指向其外部类的引用

也就是说,这个类是可以访问他的外部类的

package cn.tinsur.lianxi.st8;

public class A {
    private static String name;
    public void setName(String name){
        this.name = name;
    }
    private  void sayHello(){
        IO.println("im + "+ name);
    }

    public class B {
        public static void main(String[] args) {
            System.out.println( name + "im b");
        }
    }

    static void main() {
        System.out.println("hello world");
    }
}

image

成员内部类简介实现继承

Java不支持直接通过extends实现多重继承,但是可以通过一些技巧实现多重继承

image

2.静态内部类

public class A {
    public static int age;
    public static void study(){
        IO.println(age);
    }

    //静态成员,静态内部类
    public static class B{

    }
}

静态内部类可以引用其外部类的静态成员

例如:

image

如果去掉外部类中age属性的static修饰符,则无法在内部类中访问

image

静态内部类无需先创建其外部类的实例:

public class Test {
    static void main() {
        A.B b = new A.B();
        
    }
}

3.匿名内部类

没有名称的内部类,使用频率较高。

因为没有名字,所以只能在定义的地方唯一的创建一次,匿名内部类继承自父类,匿名内部类同时包含Java的三个特性:封装、继承、多态。

public class Test {
    //匿名内部类,只能在定义的地方唯一的创建一次
    Person p1 = new Person(){
        private int age;

        public int getAge(){
            return age;
        }

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

        public void study(){
            IO.println( getName() + "正在学习");
        }
    };
}

匿名内部类一般不会定义自己的方法,只会重写父类的方法,因为定义自己的方法的话一般情况下无法调用(可以使用反射特性强制实现)

4.局部内部类

public class A {
    public void func() {
        Random r = new Random();
        int i = r.nextInt();
        if (i < 100) {
            class Point {
                public int x;
                public int y;
            }
            IO.println("aaa");
        }else {
            IO.println("bbb");
        }
    }

    static void main() {
        A a= new A();
        a.func();
    }
}
THE END
文章版权归Tinsur.cn所有,不允许任何形式的转载
点赞0 分享