java 类可见性_探讨Java内部类的可见性

1、外部类的访问

我们通过两种两种方式试图创建内部类的实例。

方式一 OuterClassName.InnerClassName inner=new Ouer().new Inner();

通过外部类对象.new 的方式,可以得到private inner class 的实例,并且可以访问它的private成员和private方法。自然default、protected和public的都可以访问。

方式二 通过外部类方法get InnerInstance()

此种方法也可以访问所有内部类的所有成员和方法。

所以,一个内部类的对象对生成它的外部类对象是完全可见的,包括private内部类、private成员与private方法。

2、同包其他类的访问

下面,在同一个包内创建一个SamePackage.java类,试图访问Out类的所有内部类。

SamePackage.java

package com.zj.main;

public class SamePackage {

public static void main(String[] args) {

// create an outer object

Out out = new Out();

//create a private inner object by 'new'

//Out.PrivateIn privateIn=out.new PrivateIn();

//->error: Out.PrivateIn is not visible.

// create a default inner object by 'new'

Out.DefaultIn defaultIn = out.new DefaultIn();

//defaultIn.private_arg=0;->error:not visible

defaultIn.default_arg = 0;

//defaultIn.private_method();->error:not visible

defaultIn.default_method();

// create a private inner object by 'out's method'

//Out.PrivateIn privateIn2 = out.getPrivateIn();

//->error:Out.PrivateIn is not visible through out.getPrivateIn() is visible.

// create a private inner object by 'out's method',

// but use Interface reference to handle it

InMethod privateIn=out.getPrivateIn();

privateIn.public_method();

}

}

方式一:OuterClassName.InnerClassName inner=new Ouer().new Inner();

使用方式一试图得到private 内部类失败,根本得不到内部类的句柄。

//create a private inner object by 'new'

//Out.PrivateIn privateIn=out.new PrivateIn();

//->error: Out.PrivateIn is not visible.

但是可以正常的访问default访问权限的内部类的对象。当然是访问不到它的private成员和private方法的。自然protected和public的都可以访问。

方式二:通过外部类方法get InnerInstance()

虽然可以调用外部类对象的getInnerInstance()方法,但由于得不到private内部类的句柄,所以此种方法无法创建private内部类的实例。

// create a private inner object by 'out's method'

//Out.PrivateIn privateIn2 = out.getPrivateIn();

//->error:Out.PrivateIn is not visible through out.getPrivateIn() is visible.

42/4<1234>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值