Protected关键字详解

参考1

Protected关键字的可见性在于两点

1.基类的Protected成员是包内可见,并且子类可见

2.若子类和基类不在同一包内,那么在子类中,子类实例可以访问从其从基类继承而来的Protected方法,而不能访问基类实例的Protected方法


实例一:

package p1;
public class Father1 {
    protected void f() {}    // 父类Father1中的protected方法
}
 
package p1;
public class Son1 extends Father1 {}
 
package p11;
public class Son11 extends Father1{}
 
package p1;
public class Test1 {
    public static void main(String[] args) {
        Son1 son1 = new Son1();
        son1.f(); // Compile OK     ----(1)
        son1.clone(); // Compile Error     ----(2)
 
        Son11 son = new Son11();    
        son11.f(); // Compile OK     ----(3)
        son11.clone(); // Compile Error     ----(4)
    }
}

① 对于方法f()-Test1和Father1处于同一个包内,利用可见性的第一条可以验证

② 对于方法clone()来自于Father1-包java.lang内可见+Father1的两个子类可见,所以Test1不符合两条中的任意一条,编译错误


实例二:

package p2;
class MyObject2 {
    protected Object clone() throws CloneNotSupportedException{
       return super.clone();
    }
}
 
package p22;
public class Test2 extends MyObject2 {
    public static void main(String args[]) {
       MyObject2 obj = new MyObject2();
       obj.clone(); // Compile Error         ----(1)
 
       Test2 tobj = new Test2();
       tobj.clone(); // Complie OK         ----(2)
    }
}

① 对于方法clone(),是来自于MyObject2中,虽然复合可见性第一条,但是不符合可见性第二条-不同包的话不能访问基类实例中的Protected方法

② 相比与①,符合可见性第二条-不同包的话可以访问子类中继承基类的Protected方法

注:前两个实例是分别说明“可见性第一条和第二条”


实例三

package p3;
class MyObject3 extends Test3 {
}
 
package p33;
public class Test3 {
  public static void main(String args[]) {
    MyObject3 obj = new MyObject3();
    obj.clone();   // Compile OK     ------(1)
  }
}

clone()方法来自于Test3,可见包为p33以及子类MyObject3

注意:如果MyObject3没有重写clone()方法,则沿着extends关键字一直向上找到基类


实例四

package p4;
class MyObject4 extends Test4 {
  protected Object clone() throws CloneNotSupportedException {
    return super.clone();
  }
}
 
package p44;
public class Test4 {
  public static void main(String args[]) {
    MyObject4 obj = new MyObject4();
    obj.clone(); // Compile Error      -----(1)
  }
}

clone()方法来自于MyObject4类,可见于package p4及其子类

注意:和实例三区分开来,因为MyObject4类重写了clone()方法,所以clone()方法来自于MyObject4类


实例五

package p5;
 
class MyObject5 {
    protected Object clone() throws CloneNotSupportedException{
       return super.clone();
    }
}
public class Test5 {
    public static void main(String[] args) throws CloneNotSupportedException {
       MyObject5 obj = new MyObject5();
       obj.clone(); // Compile OK        ----(1)
    }
}

clone()方法来自于MyObject5类,可见于package p5及其子类,Test5类刚好在package p5包内,所以编译通过


实例6

package p6;
 
class MyObject6 extends Test6{}
public class Test6 {
  public static void main(String[] args) {
    MyObject6 obj = new MyObject6();
    obj.clone();        // Compile OK   -------(1)
  }
}

clone()方法来自于Test6类,可见于package p6以及Test6的子类,Test6在package p6内所以编译通过


实例七

package p7;
 
class MyObject7 extends Test7 {
    public static void main(String[] args) {
        Test7 test = new Test7();
        test.clone(); // Compile Error   ----- (1)
  }
}
 
public class Test7 {
}

clone()方法来自于object类,clone方法可见于java.lang类及其子类Test7,MyObject7不在此范围内,所以编译错误

注意:任何没有用extends的类A的基类都是object类,则所属包为java.lang及其子类为A


总结

一、Protected用法正误判断三步骤
1.先判断clone()方法来自于哪个类(记为A类)
1.1 extends关键字的处理-是否重写
1.2 实例7的情况要特别注意-任何类without extends的基类都是object
2.判断调用clone()方法的类(记为类B)是否符合”可见性的第一个条件“
2.1 是否在A类所在的包中,是则可见;不是则判断2.2
2.2 是否是A类的子类,是则判断3;不是则不可见
3.如果不在包中但是A的子类则进一步判断
3.1 clone()方法是通过A类的实例调用,则不可见
3.2 clone()方法是通过B类的实例调用,则可见
二、
1.父类中声明为public的方法在子类中必须为public
2.父类中声明为Protected的方法在子类中要么为public,要么为Protected

——————————————————————————————————————

补充:参考2

1.不同包下,在子类中不能通过另一个子类引用访问共同基类的Protected方法

2.父类为static Protected修饰类——只要是子类,不管是不是同一包下,均可访问;不同包下,非子类不能访问——也就是比不加static的情况中,子类的判断情况更简单了

注:static类型的变量或方法直接通过”类名.方法名“来访问

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容