- 浏览: 340888 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
ydm135:
解决了我的部分问题,写的不是我想要的位置。,
jRegistryKey读取注册表的例子及jar包下载 -
hqc20111612:
...
Hibernate java.lang.NoClassDefFoundError: org/dom4j/DocumentException 导入dom4j依然 -
江恂泽:
楼主用的jRegistry是那个版本的?我下 了好多个版本Re ...
java读写注册表的两种方式,Preferences与jRegistry -
xander:
不错,不错
java String 缓冲池概念的举例说明(面试题) -
xiaohuafyle:
fzfz_902 写道在windows sever 2008上 ...
java 读取CD-ROM 光驱中文件
转载自http://zhangjunhd.blog.51cto.com/113473/65624/
在Java中,当生成一个内部类的对象时,此对象与制造它的外部类通过外部类的.this保持着联系,因此该内部类对象可以访问其外部类对象的所有成员,包括private成员。
而该内部类对象对于其他类的对象的访问,遵照常规的访问权限语法,这一点也没有什么特别支持。这里需要探讨的是,外部类以及其他类的对象可以如何访问到某个内部类对象,即内部类的可见性问题。
下面是一个示例程序Out.java,其中包含了4个不同访问权限的内部类(private,default,protected,public),在每个内部类中,分别包含4个不同访问权限的成员与方法。在外部类Out中提供了得到内部类实例的方法。
所有的4个内部类都实现了一个接口InMethod,该接口的作用在下文中会有讨论。下面先讨论内部类所在的外部类对其内部类对象的访问权限问题。
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类的所有内部类。
方式一 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。
所以还是可以通过接口的引用访问到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。
通过new方式和getInnerInstance()方法只能访问public内部类的public成员和public方法;如果使用接口的引用,则可以访问所有4个内部类的public方法。
[b]4.不同包继承类的访问[\b]
在另一个包中建立一个类DifferPackageExtend.java,它继承自外部类Out。
通过new方式,虽然可以得到内部类的句柄Out.ProtectedIn,但该内部类的构造子却不可见。
通过getInnerInstance()方法得到protected内部类的对象,但只能访问到public成员和public方法。由此可知,protected内部类并不关心是否有其他类继承自它的外部类。所有protected访问权限不在此种情况下适用。
在Java中,当生成一个内部类的对象时,此对象与制造它的外部类通过外部类的.this保持着联系,因此该内部类对象可以访问其外部类对象的所有成员,包括private成员。
而该内部类对象对于其他类的对象的访问,遵照常规的访问权限语法,这一点也没有什么特别支持。这里需要探讨的是,外部类以及其他类的对象可以如何访问到某个内部类对象,即内部类的可见性问题。
下面是一个示例程序Out.java,其中包含了4个不同访问权限的内部类(private,default,protected,public),在每个内部类中,分别包含4个不同访问权限的成员与方法。在外部类Out中提供了得到内部类实例的方法。
package com.zj.main; public class Out { public PrivateIn getPrivateIn(){ return new PrivateIn(); } public DefaultIn getDefaultIn(){ return new DefaultIn(); } public ProtectedIn getProtectedIn(){ return new ProtectedIn(); } public PublicIn getPublicIn(){ return new PublicIn(); } private class PrivateIn implements InMethod{ private int private_arg; int default_arg; protected int protected_arg; public int public_arg; private void private_method(){}; void default_method(){}; protected void protected_method(){}; public void public_method(){}; } class DefaultIn implements InMethod{ private int private_arg; int default_arg; protected int protected_arg; public int public_arg; private void private_method(){}; void default_method(){}; protected void protected_method(){}; public void public_method(){}; } protected class ProtectedIn implements InMethod{ private int private_arg; int default_arg; protected int protected_arg; public int public_arg; private void private_method(){}; void default_method(){}; protected void protected_method(){}; public void public_method(){}; } public class PublicIn implements InMethod{ private int private_arg; int default_arg; protected int protected_arg; public int public_arg; private void private_method(){}; void default_method(){}; protected void protected_method(){}; public void public_method(){}; } 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(); privateIn.private_arg=0; privateIn.private_method(); // create a private inner object by 'out's method' Out.PrivateIn privateIn2 = out.getPrivateIn(); privateIn2.private_arg = 0; privateIn2.private_method(); } }
所有的4个内部类都实现了一个接口InMethod,该接口的作用在下文中会有讨论。下面先讨论内部类所在的外部类对其内部类对象的访问权限问题。
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类的所有内部类。
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.
但由于所有的内部类都实现了接口InMethod。
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。
package com.zj.other; import com.zj.main.InMethod; import com.zj.main.Out; public class DifferPackage { public static void main(String[] args){ //create an outer object Out out=new Out(); //create a public inner object by 'new' Out.PublicIn publicIn=out.new PublicIn(); publicIn.public_arg=0; publicIn.public_method(); // create a public inner object by 'out's method' Out.PublicIn publicIn2 = out.getPublicIn(); publicIn2.public_arg=0; publicIn2.public_method(); //use Interface reference InMethod method; method=out.getPrivateIn(); method.public_method(); method=out.getDefaultIn(); method.public_method(); method=out.getProtectedIn(); method.public_method(); method=out.getPublicIn(); method.public_method(); } }
通过new方式和getInnerInstance()方法只能访问public内部类的public成员和public方法;如果使用接口的引用,则可以访问所有4个内部类的public方法。
[b]4.不同包继承类的访问[\b]
在另一个包中建立一个类DifferPackageExtend.java,它继承自外部类Out。
package com.zj.other; import com.zj.main.Out; public class DifferPackageAndExtend extends Out{ public static void main(String[] args){ //create an DifferPackageAndExtend's object,which extends Out Out extend=new DifferPackageAndExtend(); //create a protected inner object by 'new' //Out.ProtectedIn protectedIn=extend.new ProtectedIn(); //->error:The constructor Out.ProtectedIn() is not visible // create a protected inner object by 'out's method' Out.ProtectedIn protectedIn=extend.getProtectedIn(); protectedIn.public_arg=0; protectedIn.public_method(); } }
通过new方式,虽然可以得到内部类的句柄Out.ProtectedIn,但该内部类的构造子却不可见。
通过getInnerInstance()方法得到protected内部类的对象,但只能访问到public成员和public方法。由此可知,protected内部类并不关心是否有其他类继承自它的外部类。所有protected访问权限不在此种情况下适用。
发表评论
-
Java动态代理与CGLib
2014-10-11 02:01 1407Java动态代理机制是一种强大的编译时生成代码的机制。 比如以 ... -
关于try-catch的finally
2014-09-24 18:58 969知识点一:在Java的方法 ... -
JDBC驱动程序的四种类型
2012-08-26 22:11 55621、JDBC框架 JDBC(Java DataBase C ... -
newInstance() 的参数版本与无参数版本详解
2012-07-26 00:09 33814通过反射创建新的类示例,有两种方式: Class.newIns ... -
jRegistryKey读取注册表的例子及jar包下载
2012-07-25 10:13 5903出于跨平台的考虑,java在当初设计的时候,并没有考虑 ... -
JAVA程序员不该有的6种异常处理陋习
2012-07-05 15:12 1374只有在学会处理异常之后,我们才能说自己是一个合格的java ... -
java获取操作系统盘符的代码分享
2012-07-04 14:33 2791有时,我们在编程的时候不得不用到操作系统所在的磁盘的盘符. 然 ... -
java项目打包后,无法显示图片或无法读取文件问题解决方案
2012-07-02 11:54 11493在项目中使用到了图片,可以将图片放在src文件夹的外部,也可以 ... -
POI解析excel2007和生成excel2007
2012-06-26 15:45 2567最近几天在整理客户的数据,数据量比较大,有几十万条,用到了ex ... -
java获取当前路径
2012-06-18 10:33 11371、利用System.getProperty() ... -
java执行bat阻塞的解决方法
2012-06-18 10:18 7773java在执行.bat文件时,经常会出现卡住不动的情况,我们称 ... -
java 读取CD-ROM 光驱中文件
2012-06-14 11:49 3410我编写了一个利用Java控制光驱的打开与关闭,并从光盘中拷贝文 ... -
java读写注册表的两种方式,Preferences与jRegistry
2012-05-29 11:53 15529由于java程序是“write once, run every ... -
Java调用WMIC命令的方法阻塞
2012-05-28 16:25 1651转自:http://blog.csdn.net/ragic/a ... -
Java应用程序模拟向Servlet发送POST请求
2012-05-24 11:16 3334转载自: http://blog.csdn.net/pathu ... -
java正则表达式捕获组,非捕获组与注释介绍
2012-04-21 01:24 2293正则表达式,简单部分可参加Pattern的javadoc介绍. ... -
深入浅出java 序列化概念
2012-04-15 02:15 1903在做继承时,Eclipse ... -
java.util.ConcurrentModificationException出现原因及解决方案
2012-04-10 19:45 2790public void setReparation( Re ... -
java JVM 虚拟机指令集
2012-04-03 01:34 11500x00 nop 什么都不做 0x01 a ... -
jdk/bin & jre/bin 目录下面的工具说明
2012-04-03 00:54 10545jre/bin目录下面工具说明 javac:Java编译器,将 ...
相关推荐
java语言中可见性方面的描述。对初学者有一定的帮助!
三种继承方式下基类成员对派生类的可见性探讨(公有继承、私有继承、受保护继承)
关于Java变量的可见性问题Java开发Java经验技巧共3页.pdf.zip
本资源涵盖了Java并发编程的理论基础和实践,主要包括可见性、原子性和有序性的详细介绍,以及多线程的使用原因、好处和坏处等方面的内容。 Java并发编程是一种高效的编程技术,通过多线程实现将计算过程中不必要的...
主要介绍了Java并发volatile可见性的验证实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
PostgreSQL 行可见性验证 PostgreSQL 行可见性验证 PostgreSQL 行可见性验证
主要介绍了java synchronized实现可见性过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
原子性有序性可见性
从JUC中的AQS引入,讲解Java volatile与AQS锁内存可见性
主要介绍了Java内存模型可见性问题相关解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Mysql InnoDB多版本可见性分析,由何登成编写,非常经典值得看看
JAVA线程:基本概念、可见性与同步 16 JAVA线程基本概念 16 可见性 17 JAVA中的锁 18 JAVA线程的同步 19 中断线程 20 参考资料 20 JAVA垃圾回收机制与引用类型 22 JAVA垃圾回收机制 22 JAVA引用类型 23 参考资料 27 ...
Java final关键字的学习demo
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
· 可见性 当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值。 · 内存屏障(Memory Barriers) 处理器的一组指令,用于实现对内存操作的顺序限制。 · 缓冲行 CPU告诉缓存中可以...
silverlight实例:图层可见性控制, 根据checkbox控制图层可见性
那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经常考核到) 什么是Java内存模型? 现在知道了CPU缓存导致可见性、编译优化导致了有序性问题,那么最简单的方式...
使用vulkan技术利用硬件接口实现,用于3d大场景可见性剔除.