Java和C++中的嵌套类讨论

关于嵌套类:

先说Java,因为C++的嵌套类只是Java的一个子集。
Java的嵌套类有两种定义方式:非静态和静态,用关键词static区分。
代码:
class Outer
{
    static int static_value = 0;
    int value;

    class Inner
    {
        void print()
        {
            System.out.println(something);//something是某个变量
        }
    }
}


上面定义是非静态嵌套类定义。
因为嵌套类Inner非静态,所以在生成实例的时候必须有一个已经被创建的父类Outer实例。
一般来说如是定义:
Outer out = new Outer();
Outer.Inner inner = out.new Inner();
或者使用匿名父类:
Outer.Inner inner = new Outer().new Inner();

因为上面所创建的嵌套类必须有一个父类实例,因此Java允许Inner类访问Outer的所有成员变量。
譬如上面的代码中something可以是staic_value,也可以是value。
不过Java给了非静态嵌套类一个限制就是,所有的成员方法和变量都不可以用static修饰。

另一种嵌套类的定义方式就是在class Inner之前修饰以static。这个时候嵌套类可以独立于父类被创建。
Outer.Inner inner = new Outer.Inner();
当然,这个时候嵌套类也不可以访问父类的非静态成员变量,不可以使用父类的非静态方法。可以定义静态方法和静态变量。

在C++中,不支持非静态嵌套类的定义。也就是说,不管你在定义中有没有写static,嵌套类都被定义成静态嵌套类。C++的静态嵌套类和Java中的几乎一模一样,不再赘述。

PS:名字空间的可见性
一个问题来了。如果我们在之前的代码中略作改动,写成如下形式:

class Outer
{
    static int static_value = 0;
    int value;

    class Inner
    {
        static int static_value = 0;
        int value;

        void print()
        {
            System.out.println(something);//something是某个变量
        }
    }
}

那么如果something是value,那么到底输出的是哪个一个value?
实验的结果是:是Inner的那个value。
不难理解,这个跟继承有点像。子类的变量和方法自动覆盖父类的。
如果是静态嵌套类,更为清楚的写法:
Outer.value, Inner.value
非静态嵌套类:
Outer.this.value, this.value


下面给两个参考资料,如果觉得我解释的不清楚可以看看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值