(1)除了在(2)中表述的有关继承方面的区别之外,在某个类中定义的protected 方法和属性(注意是定义的,不是继承而来的,对于继承而来的情况在(2)中有表述)和默认权限方法和属性是一样的。比如,某类的protected 方法和属性在包外是不能通过该类对象进行访问的(你能在包外访问一个类的默认权限的方法和属性吗?当然不能),这就是为什么在某对象所在的包的以外的任何地方,你不可以通过该类的对象引用来调用它的protected 方法和属性,哪怕是在该类的子类中也不可以这样做。在该类包外的子类中能“看到“的只是子类自己继承来的protected 方法和属性,它是不能“看到“它的父类对象的protected方法和属性的。
(2)protected 修饰的方法和属性和默认权限方法和属性的区别在于:在包外的子类可以继承protected 方法和属性,而且被继承的protected 方法和属性,在子类中仍然是protected(如果方法没有被override),但是要注意的是,我这里说它们仍然是protected,是从它们可以由该子类的包外的子类继续继承的递归性角度来说的,实际上它们的可见范围和该子类中新定义的protected 方法和属性是有区别的 。不同之处在于在该子类中新定义的protected 方法和属性对该子类所在的包是可见的。而从父类中继承的protected 方法和属性在该子类所在的包中仅仅对该子类是可见的,同时另外它们还享有被继承前的可见范围(即被被继承前的可见范围仍然保持。这让人想起oop中的一个原则,方法和属性被继承后,其可见的范围只能扩大,不能缩小)。比如某类中定义某个protected方法,那么在该类所在的包中是可以访问该类的包外的子类的通过继承得到的该protected方法的(尽管该子类是在包外)。同时不可以在该类(代号A)的包外定义的某个类B中调用类A的子类SA的继承该类得到的该protected 方法(类B可以是A子类也可以不是A子类,类SA可以是在任何一个包中,但是B和SA是不同的两个类)。
(3)对于构造函数,protected修饰词带给它的语义本质上和带给其他方法的是一样的。但因为构造函数相比一般的方法有特别之处,所以protected语义在具体体现上也会有些不同。比如构造函数不存在继承的问题,但是构造函数有一个隐含或显式super()调用的问题。如果您对protected语义有了本质的认识,您一定能想到,你在包外的任何地方你都不能用new的方式直接调用某类的protected构造函数,但是在该类的包外的子类的构造函数中,是可以隐含地调用前者的protected构造函数的,也可以显式的通过super()调用(这个不难理解,就像他的其他protected方法可以用super.的方式来调用一样)。另外提醒下,构造函数从来都不是继承得来的,构造函数的可见性和父类的构造函数的可见性没有什么必然联系。
(4)综述之,protected的确切语义是:protected修饰的方法或变量将会被任何位置的子类继承,但是永远只能被最早定义他的父类所在的包的类所见(除了该类以及其子类能看到本身的该protected方法或变量之外。)
代码:
package com.protecteds.test;
import com.protecteds.test2.Duck1;
public class Bird {
protected int nFeathers;
public void name(){
Duck1 d=new Duck1();
d.nFeathers=0;
}
}
1.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck1 extends Bird{
public void setn(int duck1n){
//在子类中直接访问父类中的protected变量
nFeathers=duck1n;
}
}
2.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck2 extends Bird{
public void construct(int newduck2){
Duck2 d2 = new Duck2();
//在子类中通过子类的对象访问父类中的protected变量
d2.nFeathers=newduck2;
}
}
3.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck3 extends Bird {
public void construct(int newduck3) {
Bird b = new Bird();
// 子类中用父类对象反而不能访问父类中的protected变量
//b.nFeathers = newduck3;
}
}
4.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck4 extends Bird{
public void construct(int newduck4){
Duck1 d1 = new Duck1();
//子类中用另外一个子类的对象也不能访问父类中的protected变量
//d1.nFeathers=newduck4;
}
}
5.
package com.protecteds.test2;
import com.protecteds.test.Bird;
public class Duck5 extends Duck2{
public void construct(int f){
Duck2 d1 = new Duck2();
//不同包继承来之后就算protected也只有自己可以访问
//d1.nFeathers=f;
}
}
分享到:
相关推荐
NULL 博文链接:https://837062099.iteye.com/blog/1609340
本篇文章是对Java protected进行了详细的分析介绍,需要的朋友参考下
主要介绍了Java编程中protected关键字与static关键字的作用,是Java入门学习中的基础知识,需要的朋友可以参考下
java中public、protected、默认、private关键字
protected SnowFall(Context context) { super(context); // 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢 paint.setAntiAlias(false); // 如果该项设置为true,则图像在动画进行中会滤掉对...
Java类protected继承链访问控制机制研究
wechat develop framework for java(微信开发框架JAVA版,最简单易用微信开发框架) ##wechat4j可以用来干什么? wechat4j是一个帮助你开发微信应用的jar包,使用它,你开发微信公众号应用只需要几秒钟的时间,完全...
JAVA 访问修饰符 及 protected 几点被人忽略的致命要害,不看后悔哦,亲
用java代码来解析private、public、default、protected的权限问题
Java 访问修饰符 public protected private
【试题分析】Java 有4 种访问类型,分别为public 、protected 、default 和private 。其中public 变量 可以被所有的外部类访问,而pretected 的可以被同一个包及该类的子类访问,default 即没有任何修饰符 的变量...
java程序员常见的笔试文档资料 1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × ...
用JAVA语言实现网络聊天import java.io.*; import java.net.*; import java.util.*; public class ChatHandler implements Runnable { protected Socket socket; protected ObjectInputStream dataIn; ...
java八股文 "Java八股文"通常指的是一种简单的模板化回答,用于解答关于Java编程语言的基础... Java中的四种访问权限是public、protected、default和private,分别表示公开、受保护、默认(包内可见)和私有。 5. **J
Java显示Unicode特殊字符, protected char base; // 指定我们显示的初始值7 protected Font font = new Font("serif", Font.PLAIN, 18); // 指定缺省的显示字体 protected Font headingfont = new Font(...
A) private B) static C) abstract D) protected 15.设int 型变量 a、b,float 型变量 x、y,char 型变量 ch 均已正确定义并赋值, 正确的switch语句是(D )。 A) switch (x + y) B) switch ( ch + 1 ) C) switch ...
所有Bean创建的真正逻辑都在doCreateBean函数中,本篇把重点放在第一点实例化bean上,先省略其他无关代码。...protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, fi
2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 9. 编码样式 10. Java版本 11. 课程和培训 12. 错误 13. 封面设计 14. 致谢 第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 ...
protected static Timer Tims0; static JFrame frame; static float value1=1.0f; boolean isClicked=false; public GCFrame(){ frame=new JFrame(); JPanel jp=new JPanel(); JButton jbt=new ...
(a) final (b) protected (c) private (d) default 1. Consider the following Java program segment. String[] str = {"Three","Two","One"}; for (int i = 0; i ; ++i) { System.out.println(str[i]+"/"); } ...