深入理解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类自己能够复制自己,其他类都不行。