首先,必须明确Java中类成员的访问修饰符(public、private、protect、默认或friendly等,C++也同理),并不能简单的理解为书上说的如“子类可以访问”,具体因结合类的内存布局图来理解。例如一个父类有public a成员和protect b成员,在其子类的方法中访问a时,要考虑子类的内存布局能否看到a。    结合内存布局图就可以理解所谓“子类可以访问父类的protect b成员”说的是指本子类继承了父类的成员b,所以也具有b,当然就可以访问了。对于private成员,子类不继承,当然就没有了。  对于public的东西,在任何地方都能找到,对于private和protect就看通过内存布局能不能找到(即属于自己的可以找到,不属于自己的东西当然找不到了)。

【总之一句话,能不能访问,就看在当前作用域下能不能找到。】

以下是原因分析:

在Core Java中有这样一段话“在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone()。子类只能直接调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”。但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说明下protected访问修饰符的问题。

在package1中创建SuperClass.java文件,里面有一个protected方法,内容如下。

[java]  view plain copy print ?
  1. package package1;
  2. public class SuperClass {
  3. protected void method(){
  4. System.out.println("This is a protected method in the super class .");
  5. }
  6. }

在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass,内容如下。

[java]  view plain copy print ?
  1. package package1;
  2. public class SubClass1 extends SuperClass {
  3. public static void main(String[] args) {
  4. SuperClass sup = new SuperClass();
  5. SubClass1 sub1 = new SubClass1();
  6. SubClass2 sub2 = new SubClass2();
  7. sup.method();  //Compile OK
  8. sub1.method();  //Compile OK
  9. sub2.method();  //Compile OK
  10. }
  11. }
  12. class SubClass2 extends SuperClass{
  13. }

编译全部通过,不难理解,protected方法对同包中的类是可见的

如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。

[java]  view plain copy print ?
  1. package package2;
  2. import package1.SuperClass;
  3. public class SubClass1 extends SuperClass {
  4. public static void main(String[] args) {
  5. SubClass1 sub1 = new SubClass();
  6. SubClass2 sub2 = new SubClass2();
  7. Sub1.method();  //Compile OK
  8. sub2.method();  //Compile Error
  9. }
  10. }
  11. class SubClass2 extends SuperClass{
  12. }

这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,调用protected方法的方法所属的类是protected方法所属类的子类,但是不在同一个包中。由此我们可以想到 : 不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类

如果我们在package2中的SubClass2中重写SuperClass的method方法。

[java]  view plain copy print ?
  1. package package2;
  2. import package1.SuperClass;
  3. public class SubClass extends SuperClass {
  4. public static void main(String[] args) {
  5. SubClass sub = new SubClass();
  6. SubClass2 sub2 = new SubClass2();
  7. sub.method();  //Compile OK
  8. sub2.method();  //Compile OK
  9. }
  10. }
  11. class SubClass2 extends SuperClass{
  12. protected void method(){
  13. super.method();
  14. }
  15. }

这种情况跟第一种类似,protected方法可以被同一个包中的类访问。当在SubClass2类中覆盖method()方法时,SubClass2类和SubClass1类在同一个包下,所以此protected方法对SubClass1类可见。现在应该可以理解“ 为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”这句话了吧。

如果我们在一个类中调用父类对象的protected方法会怎么样?

在package1中创建父类SuperClass.java文件,里面有一个protected方法,内容如下。

[java]  view plain copy print ?
  1. package package1;
  2. public class SuperClass {
  3. protected void method(){
  4. System.out.println("This is a protected method in the super class .");
  5. }
  6. }

在另一个包package中创建子类SubClass.java文件,内容如下。

[java]  view plain copy print ?
  1. package package2;
  2. import package1.SuperClass;
  3. public class SubClass extends SuperClass {
  4. public static void main(String[] args) {
  5. SuperClass sup = new SuperClass();
  6. SubClass sub = new SubClass();
  7. sup.method(); //Compile Error
  8. sub.method();  //Compile OK
  9. }
  10. }

这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个protected方法method()。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!

protected方法不是可以被子类访问的吗?

从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:

作用域 当前类 同包 子孙类(不同包) 其他
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N

default为不写访问修饰符时。

现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。

注意protected访问修饰符的规则及其微妙。

访问修饰符的真正理解相关推荐

  1. 访问修饰符的个人理解-private与protected

    一:private                             private --只有在声明它的类或结构中访问. 例: public class A {   private string ...

  2. C#几种访问修饰符理解

    今天拿出一点时间,对这几个C#访问修饰符重新理解了一下: 类和成员均有访问修饰符. 类只能用public, Internal来修饰,默认值:public 成员能用以下5种来修饰,默认值:Private ...

  3. 关于Java中各种修饰符与访问修饰符的说明

    关于Java中各种修饰符与访问修饰符的说明 类: 访问修饰符  修饰符  class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 ...

  4. C#的访问修饰符Protected

    首先,访问修饰符最常用的有 public private protected internal ...... public 和private确实很好理解,但是protected在做例子的时候我总是走入 ...

  5. java中的访问修饰符

    对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语 ...

  6. 【译文】 C#面向对象的基本概念 (Basic C# OOP Concept) 第一部分(类,对象,变量,方法,访问修饰符)...

    译文出处:http://www.codeproject.com/Articles/838365/Basic-Csharp-OOP-Concept 相关文档:http://files.cnblogs.c ...

  7. 基本语法及基本概念概述(标识符、访问修饰符、变量、数组、枚举、注释、空行、继承、接口、(对象、类、方法、实例变量)、关键字表)

    文章目录 1.标识符 2.标识符命名规范 3.访问修饰符 4.变量 5.数组 6. 枚举 7.注释 8.空行 9.继承 10.接口 11.对象.类.方法.实例 12.关键字表 13.保留字(reser ...

  8. [转]java构造方法的访问修饰符

    http://my.oschina.net/u/1464678/blog/210359 1.       类(class) 可见性修饰符: public-在所有类中可见,在其他包中可以用import导 ...

  9. JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)

    运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样 ...

最新文章

  1. Java 最常见的 10000+ 面试题及答案整理:持续更新
  2. 一步步教你理解LSTM
  3. Python中OpenCV2. VS. CV1
  4. 整理一些ChartControl控件属性
  5. 淘宝商品数据爬取并分析数据
  6. 磁盘分区助手一键迁移操作系统——易我分区大师
  7. JAVA超简单输名字骂人_骂人不带脏字的网名非常有趣
  8. 科研入门必备知识之论文种类--Journal、magazine、transactions、proceedings
  9. 十二章 Python入门系列之字典
  10. 魔域手游安卓修改服务器地址,魔域互通端游手游架设
  11. 用HTML做窗体程序界面
  12. poi实现word文档转pdf格式
  13. 【日记本砸】21.01.08-12 最快的成长方式就是慢慢来
  14. 《OKR工作法》介绍
  15. 6 电脑键盘控制机器人
  16. 砌砖机器人公司获200万美元投资,这年头连搬砖工也要失业!
  17. [译] 用于 iOS 的 ML Kit 教程:识别图像中的文字
  18. ADC检测电压 端口二极管钳位保护电路之总结
  19. 数据让生活更幸福!三分钟带你了解智慧城市,交通大数据应用!
  20. Frp内网穿透(四)安卓设备内网穿透

热门文章

  1. jquery each,grap遍历方法
  2. Newton迭代法求解Toeplitz矩阵逆的程序
  3. 利用FileReader和FileWriter完成一个文件拷贝功能
  4. 新浪微博的XSS攻击
  5. 第一次打CF的感受(附A-C题题解) -Codeforces Round #764 (Div. 3)
  6. LeetCode笔试刷题一. 贪心算法
  7. Lucene之——搜索实例
  8. c语言中按键设置上下限,控制图中的控制上限和控制下限标明()。A.客户将要接受的界限B.可能出现的过程的偏差范围C.可以接受 - 信管网...
  9. 众昂矿业架构师刘金海:萤石的工业用途解读
  10. 推荐系统中的EE问题——Bandit算法