java 内部类中 static (内部类对象成员)

项目中需要使用到内部类,对外隐藏实现细节,代理类提供访问接口。见以下代码:

public class A
{
    private class B
    {
        private static final B invalidB = new B();  //error
        
        //to construct a invliad B
        private B()
        {
            
        }
        
        //to construct a valid B
        public B(int urlsCount)
        {
            
        }
    }
}

上面的代码有一行标注了 error ,表示这一行将通不过编译。让我们来揭示原因。

首先,要明确一点,java 的内部类如果不是 static 的,必须经过外层类的构造才会被构造出来,即,每构造一个内部类,都会产生一个内部类。则只有在定义了一个 A对象 a 的情况下,才会产生 B 这个类,设想一下,如果内部类声明了一个static B 对象成员 b ,那么,就要求 B 这个类一定要被编译器提前知道,具体多提前呢,应该是所有类依赖,重定位解决后,但肯定是在所有非 static 对象定义之前,此时b 的存在就是个疑问了,从语意角度来讲,b 是在 a 构建之后存在的,但从编译器角度讲,b 必然又在 a 之前构建,所以就矛盾了,编译器当然不会放过你。

正确的写法应该将 B 类声明为 static ,这样不仅可以解决上面的问题,而且效率也提高不少,因为 B 类一直存在,不会每次构造一个 A 对象就重新生成一个 B 类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值