 
         
         
         
         
        
            已阅读5页,还剩2页未读,            继续免费阅读
        
        
                版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
            Java中的访问控制修饰符有四个级别,但属protected最复杂。如果问大家,protected修饰符作用,大家会说“在子类与同包中可以访问这个成员”,当然在自己类中也是可的,但你真的理解了吗?不信,先看看下面这些实例,看你是否也是这样想的(其中注释掉的是不能编译的):Java代码 package pk1.a; public class Base protected int i = 1; protected void protect() System.out.println(Base:protect); package pk1.a; import pk1.b.Sub; public class SubSub extends Sub void g() Sub s = new SubSub(); /! tect();/规则2.c.i System.out.println(s.i);/规则2.c.ii package pk1.b; import pk1.a.Base; public class Sub extends Base private void prt() protected void protect() System.out.println(Base:protect); void f() /规则2.a tect(); this.i = 2; /规则2.b Base a2 = new Sub(); /! tect(); /! System.out.println(a2.i); /规则1 Sub b = new Sub(); tect(); b.i = 1; b.prt(); package pk1.b; public class SubSub extends Sub void g() Sub s = new SubSub(); tect();/规则2.c.i /! System.out.println(s.i);/规则2.c.ii package pk1.c; import pk1.a.Base; import pk1.b.Sub; public class SubSub extends Sub void g() tect();/规则2.a /规则2.b Base b = new SubSub(); /! tect(); /! System.out.println(b.i); /规则2.b Sub s = new SubSub(); /! tect(); /! System.out.println(s.i); Java代码 package pk2.a; public class Base protected int i = 1; protected void protect() System.out.println(Base:protect); package pk2.a; import pk2.b.Sub; public class Other void g() /规则3.a Base b = new Sub(); tect(); System.out.println(b.i); /规则3.b.ii Sub s = new Sub(); tect(); System.out.println(s.i); package pk2.b; import pk2.a.Base; public class Other void g() /规则3.a Base b = new Sub(); /! tect(); /! System.out.println(b.i); /规则3.b.ii Sub s = new Sub(); /! tect(); /! System.out.println(s.i); package pk2.b; import pk2.a.Base; public class Sub extends Base Java代码 package pk3.a; import pk3.b.Sub; public class Base protected int i = 1; protected void protect() System.out.println(Base:protect); static protected int i_s = 1; static protected void protect_s() System.out.println(Static:Base:protect); void f() /! Sub.i_s = 2; /规则3.b.i Stect_s();/规则3.b.ii package pk3.a; import pk3.b.Sub; public class Other void g() Sub s = new Sub(); /! tect();/规则3.b.i System.out.println(s.i);/规则3.b.ii void f() /! Sub.i_s = 2; /规则3.b.i Stect_s();/规则3.b.ii Base.i_s = 2;/规则3.a Btect_s();/规则3.a package pk3.b; import pk3.a.Base; public class Other void f() Sub.i_s = 2;/规则3.b.i /! Stect1();/规则3.b.ii /! Base.i1 = 2;/规则3.a /! Btect1();/规则3.a package pk3.b; import pk3.a.Base; public class Sub extends Base protected void protect() System.out.println(Base:protect); static protected int i_s = 2; void f() /* * 在子类中可能通过子类类型或父类类型来来访问父类中protected静态 * 成员,而不管子类与父类是否在同一包中,或是子类重新定义了这些成员 * * 注,在父类或子类中访问时后面的规则不再适用 */ System.out.println(Sub.i_s);/2 Stect_s(); System.out.println(Base.i_s);/1 Btect_s(); 如果你看到这里,想法与程序一致的话,说明你理解了,如果不理解,那看看我的理解吧: 定义规则前,我这里约定有三个类,一个是Base类,一个是Base类的子类Sub类,一个是Sub类的子类Sub Sub类,另一个是Other类且与Base、Sub、Sub Sub没有继承关系,并假设Base中有protected方法与属性,都叫YYY吧。 在理解protected规则:首先要搞清楚什么叫访问?这里在讲到的访问是有二种的:一、就是在类中通过“XXX x = new XXX(); x.YYY;”的形式来访问(不妨叫此种形式为“外部访问”吧,此种访问形式除了可以应用到自己与子类中外,还可以应用在其他类中访问,其中XXX表示定义的类型,这里可为Base与Sub、SubSub,YYY为方法或属性);二、就是this.YYY的形式来访问(不妨叫此种形式为“内部访问”吧,不过这种访问形式只能应用在在自己的类或是子类中)。 protected方法与属性可访问的地方有三个:1.在自己的类Base中:上面的“XXX x = new XXX(); x.YYY;”与“this.YYY”两种访问形式都可以访问的到自己定义的portected方法或属性;2.二是子类Sub、SubSub中,这要分三种访问方式: a. 在Sub、SubSub 中的“this.YYY”内部访问形式:在此种方式形式下,不管是否重写或重新定义过父类Base中protected方法与属性,子类Sub、SubSub一定可以访问的。 b.在Sub、SubSub 中“Base x = new XXX (); x.YYY;”外部访问形式:此种形式就不一定的能访问的到了,这要看父类Base与子类Sub、SubSub是否在同一包(注意,此时与是否重写或重新定义过这些protedted方法与属性没有关系); c.在SubSub 中“Sub x = new XXX (); x.YYY;” 外部访问形式:此种访问形式能否访问关键看Sub是否重写或重新定义过Base的属性与方法: i. 如果重写或重新定义过,则看Sub与SubSub是否在同包中 ii.如果没有,则看Base与SubSub是否在同包中3.在其他类Other中:此时只支持外部访问形式,不过到底是要求Other与Base同包还是要求Other与Sub同包,则要依你访问方式而定了: a. 如果是通过父类引用“Base x = new XXX (); x.YYY;”形式来访问的,则要求Other与Base同包; b. 如果是通过子类引用“Sub x = new Sub (); x.YYY;”形式来访问的,情况又会比较复杂了,此时关键是看子类Sub是否重写或重新定义过父类Base中的protected方法与属性: i.如果重写或重新定义过了,则要求Other与Sub同包即可; ii.如果没有重写或重新定义过了,则要求Other与Base同包即可;另外,写到这里我想到了Object中的clone方法,为什么要求具有克隆能力的类要求实现Cloneable接口与clone方法呢:Object.clone()访问修饰符为protected,如果某个类没有重写此方法,则Object中的clone()方法除被自己与子类能调用方法外,其他不管与这个类在同一包还是不同包都是不可见的,因为未重写,还是属于Objec        
    温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 街头促销活动方案
- 葛根促销活动方案
- 返乡学生宣讲活动方案
- 衣柜夏季活动方案
- 购车补贴活动方案
- 蔬果拓印活动方案
- 超声炮专场活动方案
- 2025-2030年无人机安防「实时监控」解决方案研究报告
- 南宁铁路安全培训考试题及答案解析
- 建筑安全员b题库软件及答案解析
- 2026年南宁市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(培优a卷)
- 2025北京经济技术开发区城市运行局招聘职能部门安全生产专职安全员5人考试模拟试题及答案解析
- 2025陕西延安市安塞区总工会招聘工会社会工作者8人考试参考试题及答案解析
- 湖南省部分校2025-2026学年高二上学期10月联考语文试题(含答案)(解析版)
- 董明珠课件教学课件
- Unit2课时7 Reading for Writing-仁爱科普版八年级《英语》上册教学课件
- 游戏文化与传统文化的融合-游戏与传统文化
- 机场停机坪地坪施工方案
- 委托物流运输代理服务合同
- 2025乌鲁木齐银行秋季招聘备考考试题库附答案解析
- 《新能源汽车空调检测与维修》课件-第三章 新能源汽车空调系统检测与修复
 
            
评论
0/150
提交评论