类的实例。
方式一 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();
}
}
探讨Java内部类的可见性(3)
时间:2011-02-12 zhangjunhd
方式一 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.
但由于所有的内部类都实现了接口InMethod。
<<interface>> InMethod.java
public interface InMethod {
void public_method();
}
所以还是可以通过接口的引用访问到private内部类的public方法。自然default、protected和public的都可以访问这个public方法。
// create a private inner object by ''out''s method'',
// but use Interface reference to handle it
InMethod privateIn=out.getPrivateIn();
privateIn.public_method();
3.不同包其他类的访问
在另一个包中建立一个类DifferPackage.java。
DifferPackage.java
package com.zj.other;
import com.zj.main.InMethod;
import com.zj.main.Out;
public class DifferPackage {
public static void main(String[] args){
|