zoukankan      html  css  js  c++  java
  • thinking in java 读书笔记 --- overriding private method

    一个对象可以被用作它自身的类型或者是它的基类类型。当用作它的基类类型时叫做upcasting,如下所示

    BaseClass ref = new DerivedClass()  //upcasting

    当执行ref.method 时,程序会先到DerivedClass中去寻找method,当找到时就执行,找不到时就会到BaseClass 中找是否有method(该method必须是对DerivedClass是可见的),如果有则执行。

    BaseClass 中的private方法只能被基类中的方法调用,对DerivedClass是不可见的。因此DerivedClass无法override BaseClass中的private方法,也不能通过 upcasting来调用基类中的private方法。

    基于上述的原因,下面的例子是无法编译通过的:

    public class test {
    
        public static void main(String[] args){
            test1 t = new test2();
            t.f();
        }
    }
    
    class test1{
    
        private void f(){
            System.out.println("test1 private f()");
        }
    }
    
    class test2 extends test1{
        public void f(){
            System.out.println("test1 public f()");
        }
    }

    然而书中的一个例子却给出了意外的结果:

    public class PrivateOverride{
        private void f(){
            System.out.println("PrivateOverride private f()");
        }
        public static void main(String[] args){
            PrivateOverride po = new Derived();
            po.f();
        }
    }
    
    class Derived extends PrivateOverride{
        public void f(){
            System.out.println("Derived public f()");
        }
    }

    执行结果为:

    PrivateOverride private f()

    看起来违背了开始描述的理论,但是经过分析过后发现,上例中的upcasting 和 方法的调用是在基类中进行的,在基类中可以访问基类的私有方法。

    还有一点需要说明,派生类overrid基类中的方法时,其权限只能大于等于基类中该方法的权限

    也就是说,当基类中方法的权限为protected时,派生类重写该方法时,权限必须为protected 或者是 public.

  • 相关阅读:
    flume+kafka+storm打通过程
    kafka入门
    hive执行更新和删除操作
    redis存储对象与对象序列化详解
    语音常识--语音信号的数字模型
    声源测向: TDOA-GCC-PATH方法
    【面试】如何比较一个类型【模板使用】【sizeof用法】
    【概括】C++11/14特性
    【面试】编译器为我们实现了几个类成员函数?(c++)
    语音信号处理常识【摘抄|自用】
  • 原文地址:https://www.cnblogs.com/cruze/p/3720376.html
Copyright © 2011-2022 走看看