• JAVA中的protected(详解),以及和clone()方法有关的一些问题


    http://blog.csdn.net/ciawow/article/details/8262609
    ********************************************************
    很多的有关介绍JAVA语言的书籍,都对protected介绍的比较的简单,就是被protected修饰的成员或方法,对于本包和其子类可见,这里说的并不是完全的正确。

    对于protected的成员或方法,要分子类和超类是否在同一个包中。

    与基类不在同一个包中的子类,只能访问自身从基类继承而来的受保护成员,而不能访问基类实例本身的受保护成员。


    SubB has access only to the inherited from Base protected elements, i.e. its own elements, but the protecteddata of other Base instances is not accessible from SubB.

    class MyObject {}
     
    public class Test {
        public static void main(String[] args) {
           MyObject obj = new MyObject();
           obj.clone(); // Compile error.
        }
    }
    虽然MyObject与Test属于同一个包,但受保护的clone方法来自java.lang.Object类型,而在Test中,其基类Object的受保护方法是不可见的。
    ex2:
    class MyObject2 {
        protected Object clone() throws CloneNotSupportedException {
           return super.clone();
        }
    }
     
    public class Test2 {
        public static void main(String[] args) throws CloneNotSupportedException {
           MyObject2 obj = new MyObject2();
           obj.clone(); // Compile OK.
        }
    }
    MyObject与Test在同一个包中,受保护的clone方法来自MyObject本身,所以它对Test而言是可见的。另外在这个示例中,还说明了super关键字对于基类受保护成员的调用是个语言设计之中的“例外”。
    ex3:
    package 1
    class MyObject3 {
    protected Object clone() throws CloneNotSupportedException {
           return super.clone();
        }
    }
     
    package 2
    public class Test3 extends MyObject3 {
        public static void main(String args[]) {
           MyObject3 obj = new MyObject3();
           obj.clone(); // Compile error.
           Test3 tobj = new Test3();
           tobj.clone();// Complie OK.
        }
    }
    企图跨越不同的包,从子类中调用基类实例的受保护方法。明显不行。
    ex4:
    class MyObject extends Test{}
    public class Test {
      public static void main(String[] args) {
        MyObject obj = new MyObject();
        obj.clone(); // Compile ok.
      }
    }
    为什么可见呢?因为MyObject的clone方法继承自Test,而Test做为相对于Object的子类,是可以访问继承而来的属于它自己的受保护方法的。
    ex5:
    package 1
    class MyObject extends Test {
    }

    package 2
    public class Test {
      public static void main(String args[]) {
        MyObject obj = new MyObject();
        obj.clone(); // Compile OK
      }
    }
    虽然处于不同的包,但子类的受保护方法实际上继承自父类,父类的自己的受保护方法对自己可见,其原理同示例4.
    ex6:
    package 1
    class MyObject extends Test {
      protected Object clone() throws CloneNotSupportedException {
        return super.clone();
      }
    }

    package 2
    public class Test {
      public static void main(String args[]) {
        MyObject obj = new MyObject();
        obj.clone(); // Compile error!
      }
    }
    不同包中子类本身的受保护方法当然不可能对父类可见
    ex7:
    package a;
    class MyObject extends Test {
        public static void main(String[] args) {
        Test test = new Test();
        test.clone(); // Compile error.
      }
    }
    package a;
    public class Test {
      
    }
    同一个包中,父类实例的clone方法在子类中依然不可见,原理同示例1,就是因为父类的clone方法,实际上来自java.lang.Object。
     
  • 相关阅读:
    15.手写数字识别-小数据集(load_digits)
    14.深度学习-卷积
    13-垃圾邮件分类2
    12.朴素贝叶斯-垃圾邮件分类
    11.分类与监督学习,朴素贝叶斯分类算法
    9.主成分分析
    关于core_UI的安装和使用
    2020系统综合实践 期末大作业 15组
    2020系统综合实践 第7次实践作业 26组
    第6次实践作业
  • 原文地址:https://www.cnblogs.com/zhao1949/p/5717064.html
Copyright © 2020-2023  润新知