zoukankan      html  css  js  c++  java
  • Java中访问修饰符protected的权限 [转]

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

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


    1. package package1;  
    2.   
    3. public class SuperClass {  
    4.     protected void method(){  
    5.         System.out.println("This is a protected method in the super class .");  
    6.     }  
    7. }  

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

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

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

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

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

    这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,sub1和sub2都从父类中继承到名为method()的protected方法,sub1.method()编译通过,而sub2.method()编译没有通过,因为sub2是他所在的类的父类的另一个子类。由此我们可以想到不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类

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

    1. package package2;  
    2.   
    3. import package1.SuperClass;  
    4.   
    5. public class SubClass1 extends SuperClass {  
    6.     public static void main(String[] args) {  
    7.         SubClass1 sub1 = new SubClass1();  
    8.         SubClass2 sub2 = new SubClass2();  
    9.         sub1.method();  //Compile OK  
    10.         sub2.method();  //Compile OK  
    11.     }  
    12.   
    13. }  
    14. class SubClass2 extends SuperClass{  
    15.     protected void method(){  
    16.         super.method();  
    17.     }  
    18. }  

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

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

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

    1. package package1;  
    2.   
    3. public class SuperClass {  
    4.     protected void method(){  
    5.         System.out.println("This is a protected method in the super class .");  
    6.     }  
    7. }  

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

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

    这里我在SubClass继承另一个包中的SuperClass,这个 SuperClass中有一个名为method()的protected方法。在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访问修饰符的规则及其微妙。

  • 相关阅读:
    记录时间开销的好处
    jQuery实现轮播图效果
    读《论证是一门学问》
    sqrt.java
    关于perl:Fatal: failed to find source perl5db.pl for epic_breakpoints.pm解决方法
    JAVA基础——对象与引用概念(转载)
    对百度搜索看法的转变
    C输出格式——转载
    Java static关键字与静态块
    简单js实现弹出登陆框div层,背景变暗不可操作
  • 原文地址:https://www.cnblogs.com/sheikh/p/2971717.html
Copyright © 2011-2022 走看看