成员内部类

成员内部类是依赖于外部类的对象而存在的,在创建成员内部类对象时,外部类对象必须已经存在,内部类对象持有指向外部类对象的引用,所以成员内部类可以访问外部类的属性和方法,包括私有属性和方法

外部类访问成员内部类

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

成员内部类访问外部类

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

创建内部类对象的方法

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

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

注意:成员内部类中不能有静态属性和静态方法但可以有常量(即用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; // b是外部类的私有的静态变量
            say();
        }

        public void fun1() {
            System.out.println(num);
            // 外部类对象的num属性
            System.out.println(Outer.this.num);
        }
    }

}

 

为什么会出现内部类

因为java的类是单继承的,使用内部类后可以使java很容易实现多继承的功能

public class MainExample {
    
    private class test1 extends Example1 {
        public String name() {
            return super.name();
        }
    }

    private class test2 extends Example2 {
        public int age() {
            return super.age();
        }
    }

    public String name() {
        return new test1().name();
    }

    public int age() {
        return new test2().age();
    }

    public static void main(String args[]) {
        MainExample mi = new MainExample();
        System.out.println("姓名:" + mi.name());
        System.out.println("年龄:" + mi.age());
    }
}

class Example1 {

    public String name() {
        return "fuyong";
    }
}

class Example2 {

    public int age() {
        return 25;
    }
}

 

posted @ 2019-04-10 12:27  踏月而来  阅读(419)  评论(0编辑  收藏  举报