java protected修饰符同包内可访问,继承该类的子类可以访问,不管该子 ...
发布网友
发布时间:2024-10-01 15:38
我来回答
共3个回答
热心网友
时间:2024-10-17 18:25
子类对象也是可以访问的。
package com.corn.objectsummary;
import com.corn.Person;
public class ObjectTest {
public static void main(String[] args) {
Object o1 = new Object();
// The method clone() from the type Object is not visible
Object clone = o1.clone();
}
}
例子很简单,在main()方法中,new一个Oject对象后,想直接调用此对象的clone方法克隆一个对象,但是出现错误提示:"The method clone() from the type Object is not visible"
why? 根据提示,第一反应是ObjectTest类中定义的Oject对象无法访问其clone()方法。回到Object类中clone()方法的定义,可以看到其被声明为protected,估计问题就在这上面了,protected修饰的属性或方法表示:在同一个包内或者不同包的子类可以访问。显然,Object类与ObjectTest类在不同的包中,但是ObjectTest继承自Object,是Object类的子类,于是,现在却出现子类中通过Object引用不能访问protected方法,原因在于对"不同包中的子类可以访问"没有正确理解。
"不同包中的子类可以访问",是指当两个类不在同一个包中的时候,继承自父类的子类内部且主调(调用者)为子类的引用时才能访问父类用protected修饰的成员(属性/方法)。 在子类内部,主调为父类的引用时并不能访问此protected修饰的成员。!(super关键字除外)
于是,上例改成如下形式,我们发现,可以正常编译:
package com.corn.objectsummary;
public class ObjectTest {
public static void main(String[] args) {
ObjectTest ot1 = new ObjectTest();
try {
ObjectTest ot2 = (ObjectTest) ot1.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
热心网友
时间:2024-10-17 18:23
我们来试一下嘛~~~just do it
我的测试代码:
基类代码:包为com.fu
package com.fu;
public class Base {
protected int protectedInt; //protected成员
public int publicInt; //public 成员
protected int getProtectedInt(){
return protectedInt;
}
protected static int staticProtectInt;
private int privateInt;
public static void main(String[] args) {
Base b=new Base();
b.privateInt=5;
}
}
不同包内派生类:com.zi
package com.zi;
import com.fu.Base;
public class TestOtherPackageSubClass extends Base {
public void test() {
Base b = new Base(); // 使用基类
b.publicInt = 0; // 可以访问
//b.protectedInt=3; // 访问protected的属性失败
//b.getProtectedInt(); // 访问protected的方法失败
Base.staticProtectInt=9;
}
public void test2() {
//privateInt =6; //访问父类的私有-出错
publicInt = 0; // 可以访问
protectedInt = 2; // 直接用父类的属性-成功
super.protectedInt=4;
getProtectedInt(); // 直接用父类的方法-成功
System.out.println("getProtectedInt-test2:"+getProtectedInt());
protectedInt = 22; // 直接用父类的属性-成功
Base.staticProtectInt=10;
super.getProtectedInt(); // 直接用父类的方法-成功
System.out.println("getProtectedInt-test2:"+getProtectedInt());
}
public void test3(){
TestOtherPackageSubClass t=new TestOtherPackageSubClass();
t.protectedInt=6;
t.getProtectedInt();
System.out.println("getProtectedInt-test3:"+t.getProtectedInt());
}
public static void main(String[] args) {
TestOtherPackageSubClass t=new TestOtherPackageSubClass();
t.test2();
System.out.println(Base.staticProtectInt);
}
}
运行结果为:
getProtectedInt-test2:4
getProtectedInt-test2:22
10
从运行结果 4,22 看出 test2 中不管有没有写super.protectInt,还是直接protectInt 都是指向父类的成员。从这可以看出不在同一包的子类可以访问父类数据成员。
热心网友
时间:2024-10-17 18:19
是的 子类 不再 同一个包 也可以访问的 。