详解:Java的重写方法与示例

System.out.println(“Boy is eating”);

}

public static void main( String args[]) {

Boy obj = new Boy();

//This will call the child class version of eat()

obj.eat();

}

}

输出:

Boy is eating

方法覆盖的优势


方法重写的主要优点是,类可以将自己的特定实现提供给继承的方法,而无需修改父类代码

当一个类具有多个子类时,这很有用,因此,如果一个子类需要使用父类方法,则可以使用它,而其他想要实现不同的类可以使用重写功能进行更改,而无需接触父类。码。

方法覆盖和动态方法调度


方法覆盖是运行时多态性的一个示例。当父类引用指向子类对象时,则在运行时确定对重写方法的调用,因为在方法调用期间要执行的方法(父类或子类)由对象的类型确定。在运行时解决对覆盖方法的调用的过程称为动态方法分派。让我们看一个例子来理解这一点:

class ABC{

//Overridden method

public void disp()

{

System.out.println(“disp() method of parent class”);

}

}

class Demo extends ABC{

//Overriding method

public void disp(){

System.out.println(“disp() method of Child class”);

}

public void newMethod(){

System.out.println(“new method of child class”);

}

public static void main( String args[]) {

/*

  • 当父类引用引用父类对象时,在这种情况下,将调用重写的方法(父类的方法)。

*/

ABC obj = new ABC();

obj.disp();

/*

  • 当父类引用引用子类对象时,则调用覆盖方法(子类的方法)。 这称为动态方法分派和运行时多态

*/

ABC obj2 = new Demo();

obj2.disp();

}

}

输出:

disp() method of parent class

disp() method of Child class

在上面的示例中,使用第二个对象(obj2)调用disp()方法是运行时多态性(或动态方法分派)。

注意:在动态方法分派中,对象可以调用子类的重写方法和基类的所有非重写方法,但不能调用在子类中新声明的方法。在上述示例中,对象obj2正在调用disp()。但是,如果尝试newMethod()使用obj2 调用该方法(已在Demo类中新声明),则会出现编译错误并显示以下消息:

Exception in thread “main” java.lang.Error: Unresolved compilation

problem: The method xyz() is undefined for the type ABC

Java中的方法重写规则


  1. 参数列表:覆盖方法(子类的方法)的参数列表必须与Overridden方法(父类的方法)匹配。参数的数据类型及其顺序应完全匹配。

  2. 覆盖方法(子类的方法)的访问修饰符不能比父类的覆盖方法的限制更多。例如,如果父类方法的访问修饰符是公共的,则覆盖方法(子类方法)不能具有私有,受保护的默认访问修饰符,因为这三个访问修饰符都比公共更严格。

例如,这是**不允许的,**因为子类disp方法比基类(公共)更具限制性(受保护)

class MyBaseClass{

public void disp()

{

System.out.println(“Parent class method”);

}

}

class MyChildClass extends MyBaseClass{

protected void disp(){

System.out.println(“Child class method”);

}

public static void main( String args[]) {

MyChildClass obj = new MyChildClass();

obj.disp();

}

}

输出:

Exception in thread “main” java.lang.Error: Unresolved compilation

problem: Cannot reduce the visibility of the inherited method from MyBaseClass

但是,这是完全有效的方案,因为公众的限制比受保护的限制要少。相同的访问修饰符也是有效的。

class MyBaseClass{

protected void disp()

Java核心架构进阶知识点

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Java核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、Spring相关、分布式、微服务、RPC、网络、设计模式、MQ、Redis、MySQL、设计模式、负载均衡、算法、数据结构、kafka、ZK、集群等。而这些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的

image

image

image

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

些也全被整理浓缩到了一份pdf——《Java核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的

[外链图片转存中…(img-z5XlN1Oc-1714800700881)]

[外链图片转存中…(img-6MwthLnO-1714800700882)]

[外链图片转存中…(img-IysmQxhT-1714800700882)]

内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值