Java内部类之成员内部类

成员内部类也叫普通内部类、常规内部类。它有如下特点:

  1. 成员内部类定义在另一个类中,但是定义时不用static修饰。
  2. 它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的。
  3. 在外部类里面创建成员内部类的实例:this.new Innerclass();(this可以不要)
  4. 在外部类之外创建成员内部类的实例:(new Outerclass()).new Innerclass()或者new OuterClass().new InnerClass()
  5. 在内部类里访问外部类的成员:Outerclass.this.member
  6. 成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的。

示例代码如下:

package com.qs.innerclass;

import com.qs.innerclass.MemberInner.InnerClass;

// 成员内部类使用测试

class MemberInner {
    private int same = 1;
    private static int a = 2;
    private int b = 3;

    public void outer() {
        InnerClass innerObj = new InnerClass();
        System.out.println(innerObj.same + " ----- 外部类的非静态方法中创建成员内部类的实例(此时已经有了外部类对象,所以不需要创建)");
        System.out.println("outter");
    }

    public static void outerStatic() {
        MemberInner memberInner = new MemberInner();
        InnerClass innerObj = memberInner.new InnerClass();
        System.out.println(innerObj.same + " ----- 外部类的静态方法中创建成员内部类的实例(此时不一定有外部类的对象,所以得创建)");
        System.out.println("outerStatic");
    }

    // 在外部类里面创建内部类的实例
    InnerClass innerObj1 = new InnerClass();
    InnerClass innerObj2 = this.new InnerClass();

    // 定义一个成员内部类
    // 成员内部类可以声明为private、protected、public或者默认访问权限,这个访问权限约定和外部类完全一样。
    protected class InnerClass {
        private int same = 11;

        // 成员内部类不能含有static的变量和方法
        // 因为成员内部类需要先创建了外部类,才能创建它自己的。
        // private static String address = "BeiJing";

        // private static void staticMethod () {
        //
        // }

        private static final String nickName = "dog";

        public void test() {
            int same = 9;
            // 局部的same
            System.out.println(same + " ----- 成员内部类中的局部变量(和成员内部类的成员变量以及外部类的成员变量重名)");
            // 内部类的same
            System.out.println(this.same + " ----- 成员内部类的成员变量(和成员内部类的局部变量以及外部类的成员变量重名)");

            System.out.println(nickName);

            // 访问外部类里的same
            System.out.println(MemberInner.this.same + " ----- 外部类的成员变量(和成员内部类的局部变量以及成员内部类的成员变量重名)");

            // 直接访问外部类成员变量(用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用。
            // 于是,可以通过这个引用来访问外围类的成员。正是因为如此,我们创建内部类对象时,必须与外部类对象相关联。 )
            System.out.println(a + " ----- 成员内部类访问外部类的静态成员变量");
            System.out.println(b + " ----- 成员内部类访问外部类的普通成员变量");

            // 直接访问外部类的方法(不管是静态的还是非静态的)
            outer();
            outerStatic();

        }
    }
}

public class MemberInnerClassTest {

    public static void main(String[] args) {

        // 创建成员内部类的对象
        // 需要先创建外部类的实例
        InnerClass inner = new MemberInner().new InnerClass();

        inner.test();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值