7.10

发布时间 2023-07-10 18:08:20作者: new菜鸟

九、内部类详解

9.1 实例内部类

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务(内部类就相当于公司的每一个部门,少了哪一个部门,就去定义那一个部门,而外部类就相当于整个公司)。在 Java 中, 可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类 。内部类也是封装的一种体现。

代码如下:

 

//外部类

class OutClass{

    public int age = 3;

    public static final String sex = "男";

    //实例内部类

    class InnerClass{

        public static final String sex = "女";//必须加final才行

        public int age = 6;//与外部类的变量名相同

        public String name = "小明";

        public void func(){

            //与外部类的变量名相同如何访问呢

            System.out.println(this.age);//打印6;这里的this表示当前对象InnerClass对象的引用

            System.out.println(OutClass.this.age);//打印3

            System.out.println(sex);//打印女

            System.out.println(OutClass.sex);//打印男 访问外部类的静态的成员变量

        }

        public InnerClass(){

 

        }

        //不能定义静态的方法

    }

}

public class Test {

    public static void main(String[] args) {

        OutClass outClass = new OutClass();//需要拿到外部类的对象才行

        OutClass.InnerClass innerClass = outClass.new InnerClass();//产生了两个对象

        //OutClass.InnerClass innerClass1 = new OutClass().new InnerClass();//合二为一

        innerClass.func();

    }

}

如何访问外部类与内部类同名的变量呢?访问的顺序是什么?

通过外部类名.this.变量名访问外部类的成员变量(访问同名的时候优先访问自己内部的,再去看外部类的)

如何实例化内部类的对象?通过 :

    OutClass outClass = new OutClass();

        OutClass.InnerClass innerClass = outClass.new InnerClass();

注意事项:

外部类中的任何成员都可以被在实例内部类方法中直接访问

实例内部类所处的位置与外部类成员位置相同,因此也受 public 、 private 等访问限定符的约束。

实例内部类对象必须在先有外部类对象前提下才能创建

实例内部类的非静态方法中包含了一个指向外部类对象的引用(OuterClass.this)

外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

9.2 静态内部类

被static 修饰的内部成员类称为静态内部类。

在静态内部类中只能访问外部类中的静态成员

创建静态内部类对象时,不需要先创建外部类对象

与上面详解static结合。

类是最先被加载的

//外部类

class OutClass{

    public int age = 3;

    public static final String sex = "男";

    //静态内部类

    static class InnerStaticClass{

        public static final String sex = "女";//必须加final才行

        public int age = 6;//与外部类的变量名相同

        public String name = "小明";

        public OutClass outClass;

        public InnerStaticClass(){

            System.out.println("不带参数的");

        }

        public InnerStaticClass(OutClass outClass){

            this.outClass = outClass;//set get

        }

        public static void func(){

            System.out.println(sex);

            //不能直接访问非静态的成员,需要一个对象来引用

            OutClass outClass = new OutClass();

            System.out.println(outClass.sex);

            System.out.println(outClass.age);

        }

    }

}

public class Test1 {

    public static void main(String[] args) {

        //访问外部类的对象需要外部类的对象来引用才行

        OutClass.InnerStaticClass innerStaticClass = new OutClass.InnerStaticClass(new OutClass());

        //通过下面的代码来创建静态内部类的引用,因为静态不需要对象,所以不用先创建外部类的对象

        //OutClass.InnerStaticClass innerStaticClass = new OutClass.InnerStaticClass();

        innerStaticClass.func();

    }

}

9.3 局部内部类

局部内部类有点鸡肋,用处不多,他是定义局部方法里面的,只能在所定义的方法内部使用。

 

代码如下:

 

public class Test2 {

    public static void func(){

        class LocalClass{ //不能被public、static等修饰符修

            public LocalClass(){

                System.out.println("构造方法");

            }

        }

        LocalClass localClass = new LocalClass();//打印构造方法

    }

    public static void main(String[] args) {

        func();

    }

}

9.4 匿名内部类

下面简单说明,后面的接口会详细介绍:

 

代码如下:

 

class Student{

    public String name;

    public int age;

    public void func(){

        System.out.println("匿名对象");

    }

}

public class Test3 {

    public static void main(String[] args) {

        new Student().func();//匿名对象,只能用一次,需要的时候还要匿名一次

        new Student().func();

        new Student(){//匿名内部类

            public void test(){

                System.out.println("匿名内部类");

            }

        }.test();

        //Student student = new Student();

    }

}