基于Java protected的深入理解
2018-10-12 13:59
851 查看
一提到访问控制符protected,即使是初学者一般都会很自信的认为自己在这方面的理解没有问题。那好,我们提一个问题出来看看.....
请看下面两端代码,其中包B中的猫和鼠都继承了动物类。
既然,猫和鼠都继承了动物类,那么在鼠类的作用范围内,看不到猫所继承的crowl()方法呢?
症结所在:
protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外:这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。
总之,当B extends A的时候,在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类对象的protected 方法
请看下面两端代码,其中包B中的猫和鼠都继承了动物类。
//代码1:包A中有一个动物类
package testa;
public class Animal {
protected void crowl(String c){
System.out.println(c);
}
}
//代码2:包B中有两个类――猫类和鼠类
package testb;
import testa.Animal;
class Cat extends Animal{
}
class Rat extends Animal{
public void crowl(){
crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法――crowl(String)
Cat cat=new Cat();
cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible
}
}
既然,猫和鼠都继承了动物类,那么在鼠类的作用范围内,看不到猫所继承的crowl()方法呢?
症结所在:
protected受访问保护规则是很微妙的。虽然protected域对所有子类都可见。但是有一点很重要,子类只能在自己的作用范围内访问自己继承的那个父类protected域,而无法到访问别的子类(同父类的亲兄弟)所继承的protected域。 说白了就是:老鼠只能叫"zhi,zhi"。即使他能看见猫(可以在自己的作用域内创建一个cat对象),也永远无法学会猫叫。
也就是说,cat所继承的crowl方法在cat类作用范围内可见。但在rat类作用范围内不可见,即使rat,cat是亲兄弟也不行。
另外:这就是为什么我们在用clone方法的时候不能简单的直接将对象aObject.clone()出来的原因了。
总之,当B extends A的时候,在子类B的作用范围内,只能调用本子类B定义的对象的protected方法(该方法从父类A中继承而来)。而不能调用其他A类对象的protected 方法
您可能感兴趣的文章:
- JAVA中static方法的用法实例详解
- 实例分析Java中public static void main(String args[])是什么意思
- java必学必会之static关键字
- 深入浅析Java中Static Class及静态内部类和非静态内部类的不同
- 从内存地址解析Java的static关键字的作用
- 详解Java编程中static关键字和final关键字的使用
- Java中static作用详解
- Java里的static import使用小结
- Java中static关键字的作用和用法详细介绍
- java之static关键字用法实例解析
- Java修饰符 abstract,static,final 的区别详解
- Java中的static静态代码块的使用详解
- java 中的static关键字和final关键字的不同之处
- 详解Java编程中protected修饰符与static修饰符的作用
相关文章推荐
- 从源码深入理解java集合(基于jdk1.7)
- 基于Java字符串 "==" 与 "equals" 的深入理解
- 基于Java Tomcat和激活MyEclips的深入理解
- Java虚拟机常见的问题总结(基于深入理解Java虚拟机)
- 深入理解Java的protected修饰符
- 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
- java事件处理机制--深入理解(笔记)
- Java Reflection深入理解私有变量和私有方法
- 深入理解java对象的创建过程,类的初始化与实例化
- 深入理解 Java 垃圾回收机制
- JDK学习---深入理解java中的LinkedList
- 深入理解Java虚拟机 - Java内存区域
- 深入理解C++中public、protected及private用法
- 深入理解Java Class文件格式(七)
- 深入理解Java异常处理机制 (笼统篇)
- 深入理解java嵌套类和内部类
- 深入理解Java的接口和抽象类
- 深入理解java三种工厂模式
- Java学习笔记之深入理解关键字super
- 深入理解spring注解(1)java注解基础