深入理解proteced
来源:互联网 发布:discuz手机客户端源码 编辑:程序博客网 时间:2024/06/15 02:20
关于protected修饰符,我在学习Java基础后就知道它的特点: 1.具有包内访问权限 ; 2.包外的子类可以访问。对于这两点其实很好理解,当时知道这些特点后也就没有去深究,直到前段时间参加校招,被问到这样一个问题:protected的作用是什么?这一下让我一脸懵逼。。。回来后好好查阅些资料,下面是我的总结:
当父类与子类不在同一个包下时:
package test1;public class ProtectedTest {protected String test(){return "test";}}
package test2;import test1.ProtectedTest;public class SubProtectedTest extends ProtectedTest {public void test1() {ProtectedTest protectedTest = new ProtectedTest();protectedTest.test(); // 编译错误ProtectedTest protectedTest1 = new SubProtectedTest();protectedTest1.test(); // 编译错误SubProtectedTest subProtectedTest = new SubProtectedTest();subProtectedTest.test(); // 编译正常super.test(); // 编译正常}}
观看上面两段代码,发现父类的引用不能够调用ProtectedTest的test()方法,而子类引用可以调用ProtectedTest的test()方法,也可以通过super关键字来调用test()方法;
再来看下面这种情况,新增一个子类SubProtectedTest2
package test2;import test1.ProtectedTest;public class SubProtectedTest2 extends ProtectedTest {}
然后在SubProtectedTest中新增一个方法
package test2;import test1.ProtectedTest;public class SubProtectedTest extends ProtectedTest {public void test1() {ProtectedTest protectedTest = new ProtectedTest();protectedTest.test(); // 编译错误ProtectedTest protectedTest1 = new SubProtectedTest();protectedTest1.test(); // 编译错误SubProtectedTest subProtectedTest = new SubProtectedTest();subProtectedTest.test(); // 编译正常super.test(); // 编译正常}public void test2() {SubProtectedTest2 subProtectedTest2 = new SubProtectedTest2();subProtectedTest2.test(); // 编译错误}}
此时发现test2方法中编译错误,可知,在包外的子类中,不能用另外一个子类的对象访问父类中的protected变量,尽管这两个子类继承自同一个父类。
当父类与子类在同一个包下时:
package test1;public class ProtectedTest {protected String test(){return "test";}}
package test1;public class SubProtectedTest extends ProtectedTest {public void test1() {ProtectedTest protectedTest = new ProtectedTest();protectedTest.test(); // 编译正常ProtectedTest protectedTest1 = new SubProtectedTest();protectedTest1.test(); // 编译正常SubProtectedTest subProtectedTest = new SubProtectedTest();subProtectedTest.test(); // 编译正常super.test(); // 编译正常}}观看上面两段代码,发现编译都是正常的,因为protected具有包内访问权限。
由此,我们可以得出结论:
1.当一个类的方法或变量申明为protected时,那么在包外,是不能通过该类对象访问的,即便是在子类中也不行,在该类包外的子类中能访问的只是子类自己继承来的protected 方法和属性,即可以用super来访问;
2.在包外的子类中,不能用另外一个子类的对象访问父类中的protected变量,尽管这两个子类继承自同一个父类;
上面的总结貌似没有回答文章开头的问题:protected的作用是什么?其实不然,protected的作用正式基于上面这些结论的,就拿
Object类的clone()方法就是被声明为protected的,这样声明就可以保证当一个类实现cloneable接口,覆写clone()方法时,只有这个类能复制自己,其他类都
不能复制,假如有一个User类,它实现了cloneable接口,覆写了clone()方法,那么就只有User类自己能够复制自己,其他类都不行。
阅读全文
0 0
- 深入理解proteced
- public,proteced,private,static,final
- 深入理解
- public、private或proteced的区别
- JAVA访问权限(proteced与default)
- MapReduce理解-深入理解MapReduce
- 深入理解动态库
- 深入理解sizeof
- 深入理解MIDlet类
- 深入理解私有成员
- 深入理解动态库
- TCP协议深入理解
- TCP协议深入理解
- 深入理解sizeof
- session的深入理解
- 深入理解 __doPostBack
- 完成端口深入理解
- 深入理解java数组
- vue中点击显示隐藏
- oracle的简单查询
- 深入理解JVM之Java内存区域与内存溢出异常
- HttpClient在 Android Studio中的使用
- Python 窗体(tkinter)表格数据(Treeview)
- 深入理解proteced
- 成为一名优秀架构师的途径及日常学习总结
- Java程序执行内存分析(栈、堆、方法区)
- CF295A Greg and Array(差分+前缀和)
- Android多线程
- easyui的filebox过滤文件
- 关于C语言打印字母塔的问题
- poj 1321 棋盘问题
- 关于使用元素 background-image 时遇到图片显示无效的原因及解决办法