java 访问 protected_Java中访问修饰符protected的权限

本文解析了Java中protected访问修饰符的规则,指出并非所有子类都能访问父类的protected方法,重点讨论了在不同包和继承关系中的可见性问题,以及为何在克隆方法上需要公开重写。通过实例演示,解释了为什么子类必须公开重写`clone`方法以实现对象克隆。
摘要由CSDN通过智能技术生成

在Core Java中有这样一段话“在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone()。子类只能直接调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”。但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说明下protected访问修饰符的问题。

在package1中创建SuperClass.java文件,里面有一个protected方法,内容如下。

packagepackage1;

publicclassSuperClass {

protectedvoidmethod(){

System.out.println("This is a protected method in the super class .");

}

}在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass,内容如下。

packagepackage1;

publicclassSubClass1extendsSuperClass {

publicstaticvoidmain(String[] args) {

SuperClass sup =newSuperClass();

SubClass1 sub1 =newSubClass1();

SubClass2 sub2 =newSubClass2();

sup.method();//Compile OK

sub1.method();//Compile OK

sub2.method();//Compile OK

}

}

classSubClass2extendsSuperClass{

}编译全部通过,不难理解,protected方法对同包中的类是可见的。

如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。

packagepackage2;

importpackage1.SuperClass;

publicclassSubClass1extendsSuperClass {

publicstaticvoidmain(String[] args) {

SubClass1 sub1 =newSubClass();

SubClass2 sub2 =newSubClass2();

Sub1.method();//Compile OK

sub2.method();//Compile Error

}

}

classSubClass2extendsSuperClass{

}这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,调用protected方法的方法所属的类是protected方法所属类的子类,但是不在同一个包中。由此我们可以想到:不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类。

如果我们在package2中的SubClass2中重写SuperClass的method方法。

packagepackage2;

importpackage1.SuperClass;

publicclassSubClassextendsSuperClass {

publicstaticvoidmain(String[] args) {

SubClass sub =newSubClass();

SubClass2 sub2 =newSubClass2();

sub.method();//Compile OK

sub2.method();//Compile OK

}

}

classSubClass2extendsSuperClass{

protectedvoidmethod(){

super.method();

}

}这种情况跟第一种类似,protected方法可以被同一个包中的类访问。当在SubClass2类中覆盖method()方法时,SubClass2类和SubClass1类在同一个包下,所以此protected方法对SubClass1类可见。现在应该可以理解“为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”这句话了吧。

如果我们在一个类中调用父类对象的protected方法会怎么样?

在package1中创建父类SuperClass.java文件,里面有一个protected方法,内容如下。

packagepackage1;

publicclassSuperClass {

protectedvoidmethod(){

System.out.println("This is a protected method in the super class .");

}

}

在另一个包package中创建子类SubClass.java文件,内容如下。

packagepackage2;

importpackage1.SuperClass;

publicclassSubClassextendsSuperClass {

publicstaticvoidmain(String[] args) {

SuperClass sup =newSuperClass();

SubClass sub =newSubClass();

sup.method();//Compile Error

sub.method();//Compile OK

}

}

这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个protected方法method()。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!

protected方法不是可以被子类访问的吗?

从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:

作用域

当前类

同包

子孙类(不同包)

其他

public

Y

Y

Y

Y

protected

Y

Y

Y

N

default

Y

Y

N

N

private

Y

N

N

Ndefault为不写访问修饰符时。

现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。

注意protected访问修饰符的规则及其微妙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值