java protected修饰符同包内可访问,继承该类的子类可以访问,不管该子类是否和父类在同一个包内是吗?

如题所述

子类对象也是可以访问的。

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();
        }
    }

}

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-09-13

我们来试一下嘛~~~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 都是指向父类的成员。从这可以看出不在同一包的子类可以访问父类数据成员。

追问

那就是子类可以访问,而子类对象不可以访问呗

追答

是的 可以这么理解

本回答被提问者采纳
第2个回答  2016-09-13
是的 子类 不再 同一个包 也可以访问的 。
相似回答