【笔记】多态之Override

Override是子类与父类多态性的表现。

 

关于Override需要注意几点地方:

1.被覆盖方法的访问控制级别可以不一样。 

但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

 

2.方法被定义为private或static或final的则不能被覆盖。 

3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。 

4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。 

 

然后让我们看一个坑爹的例子:

复制代码
package learn;
public class Parent {  
      
    private  int num(int i,int j){  
        return i+j;  
    }  
      
    public static void main(String[] args) {  
        Parent p = new Child();  
        System.out.println(p.num(1, 2));  
    }  
}  
class Child extends Parent{  
      
    public int num(int x,int y){  
        return x-y;  
    }  
} 
复制代码

得出的结果是:3

因为Parent中的num()方法是私有函数,所以Child类中的num()并不是继承Parent中的num()方法。

而p的的类型是Parent,因此调用p的num()时,使用的是父类的num()方法。

 

那如果将p的构造方法替换一下

Child p = new Child();

这时得到的结果是:-1

 

如果将父类中num()方法的修饰符给修改一下

复制代码
package learn;
public class Parent {  
      
    protected   int num(int i,int j){  //这里
        return i+j;  
    }  
      
    public static void main(String[] args) {  
        Parent p = new Child();  //和这里
        System.out.println(p.num(1, 2));  
    }  
}  
class Child extends Parent{  
      
    public int num(int x,int y){  
        return x-y;  
    }  
} 
复制代码

因为父类中num()方法的修饰符变成了protected,这样子类就能覆盖父类中的方法,

因此在调用时会优先调用子类的方法。

得到的结果是:-1

 

 

posted @   のんきネコ  阅读(288)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示