Java 访问权限修饰符以及protected修饰符的理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 访问权限修饰符以及protected修饰符的理解相关的知识,希望对你有一定的参考价值。

2017-11-04 22:28:39

  • 访问权限修饰符的权限

技术分享

  • 访问修饰符protected的权限理解

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

    package package1;  
      
    public class SuperClass {  
        protected void method(){  
            System.out.println("This is a protected method in the super class .");  
        }  
    }  

 

 2、在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass:

    package package1;  
      
    public class SubClass1 extends SuperClass {  
        public static void main(String[] args) {  
            SuperClass sup = new SuperClass();  
            SubClass1 sub1 = new SubClass1();  
            SubClass2 sub2 = new SubClass2();  
            sup.method();  //Compile OK  
            sub1.method();  //Compile OK  
            sub2.method();  //Compile OK  
        }  
    }  
    class SubClass2 extends SuperClass{  
          
    }  

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

 

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

    package package2;  
      
    import package1.SuperClass;  
      
    public class SubClass1 extends SuperClass {  
        public static void main(String[] args) {  
            SubClass1 sub1 = new SubClass();  
            SubClass2 sub2 = new SubClass2();  
            Sub1.method();  //Compile OK  
            sub2.method();  //Compile Error  
        }  
      
    }  
    class SubClass2 extends SuperClass{  
          
    }  

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

 

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

    package package2;  
      
    import package1.SuperClass;  
      
    public class SubClass1 extends SuperClass {  
        public static void main(String[] args) {  
            SubClass1 sub1 = new SubClass1();  
            SubClass2 sub2 = new SubClass2();  
            sub1.method();  //Compile OK  
            sub2.method();  //Compile OK  
        }  
      
    }  
    class SubClass2 extends SuperClass{  
        protected void method(){  
            super.method();  
        }  
    }  

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

 

5、如果在子类中调用父类对象的protected方法

    package package2;  
      
    import package1.SuperClass;  
      
    public class SubClass extends SuperClass {  
        public static void main(String[] args) {  
            SuperClass sup = new SuperClass();  
            SubClass sub = new SubClass();  
            sup.method(); //Compile Error  
            sub.method();  //Compile OK  
        }  
      
    }  

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

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

 




以上是关于Java 访问权限修饰符以及protected修饰符的理解的主要内容,如果未能解决你的问题,请参考以下文章

Java访问权限修饰符

JAVA中的四种作用域访问修饰符以及各自的关键字个特点是?

Java中类成员访问权限修饰符(publicprotecteddefaultprivate)

笔记1---访问权限修饰符

Java 中的四种权限修饰符

Java中成员属性默认访问修饰符是啥