成员内部类

Posted moris5013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了成员内部类相关的知识,希望对你有一定的参考价值。

成员内部类是依赖于外部类的对象而存在的,在创建成员内部类的实例时,外部类的实例必须已经存在

一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!

 

外部类访问内部类

   外部类可以通过创建成员内部类实例来访问成员内部类中的属性和方法

成员内部类访问外部类

   成员内部类可以直接访问外部类的所有属性和方法

创建内部类实例的方法

   1)在外部类中创建:内部类名 name = this.new 内部类名();

   2)在非外部类中创建:外部类名.内部类名 name = new 外部类名().new 内部类名();

注意:成员内部类中不能有静态属性和静态方法但可以有静态常量(即用static final修饰的属性),因为在类加载时会初始化static修饰的内容,而成员内部类必须依赖于外部类对象,即成员内部类要在外部类加载之后加载,所以不能包含静态的变量和方法。使用final修饰的静态变量类加载时会自动初始化其值,将其作为一个常量,所以可以出现在内部类中。

注意: 如果成员内部类B与外部类A包含同名的成员,那么在类B中, this.v表示类B的成员, A.this.v表示类A的成员。

 

public class Outer {
    // 定义一个实例变量和一个静态变量
    private int a;
    private static int b;
    
    int num = 0;
    
    // 定义一个静态方法和一个非静态方法
    public static void say() {
    }

    public void test() {
        // 在外部类中调用内部类的属性和方法
        Inner inner = this.new Inner();
        inner.d = 1; // 通过创建内部类实例来调用内部类属性
        inner.walk(); // 通过创建内部类实例来调用内部类方法
    }

    //成员内部类  可以用private,public等修饰,
    private  class Inner {
        int num = 2;
        
        // 定义一个静态常量
        static final int m = 1;
        
        // 在内部类中定义一个静态变量和一个实例变量
        // static int c; 编译出错
        int d;
        
        // 定义一个匿名代码块和一个静态代码块
        {
        }
        // static{} 编译出错
        
        // 定义一个静态方法和一个普通方法
        // public static void go(){} 编译出错
        public void walk() {
            // 内部类可以直接访问外部类的所有属性和方法,包括私有的
            a = 1; //a是外部类的私有属性 
            b = 1;
            say();
            test(); 
        }
        public void fun1() {
            System.out.println(num);
            //外部类对象的num属性
            System.out.println(Outer.this.num);
        }
    }
}

 

以上是关于成员内部类的主要内容,如果未能解决你的问题,请参考以下文章

成员内部类详解

各种内部类的总结

内部类

java内部类之成员内部类之匿名内部类

java——内部类

Java内部类