Java中子类重写父类方法的思想本质!

Posted Linux无限探索

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中子类重写父类方法的思想本质!相关的知识,希望对你有一定的参考价值。

Java语言中,在子类中定义与父类同返同名同参的方法将会出现“重写(覆写)”,子类将屏蔽父类的相同方法,调用子类的方法将不会调用到父类的该方法。

许多初学者也许会被“覆写”一词迷惑,以为覆盖掉了父类的方法,其实这两种方法是同时独立存在的,只是子父类调用该方法的入口不一样,彼此互不干扰。

/*
需求:设计一个简单的java程序,证明子类重写父类方法的过程
思路: 1、创建父类对象,通过父类对象调用该方法
2、创建子类对象,通过父类对象调用该方法
3、通过子类对象调用该方法
*/
class RerridingTest

public static void main(String[] args)

Father f = new Father();
f.show();
Child c = new Child();
f.show();//创建子类对象并没有“覆盖”掉父类自己的show()方法
c.show();//子类调用同名方法时直接访问自己定义的方法,并没有访问父类的方法



class Father

void show()
System.out.println("father show run.");



class Child extends Father

void show()
System.out.println("child show run.");



/*
总结:重写过程是
创建子类对象时,因为子类中已有定义该方法,故不从父类继承该方法;
调用方法时,判断调用对象在内存中是何种类型,然后到相应类型的方法区中寻找该方法
*/

结果:

总结:

重写过程是创建子类对象时,因为子类中已有定义该方法,故不从父类继承该方法;调用方法时,判断调用对象在内存中是何种类型,然后到相应类型的方法区中寻找该方法。

原文来自:http://geek.csdn.net/news/detail/131740

本文地址:https://www.linuxprobe.com/java-subclass-superclass.html编辑:高军,审核员:逄增宝

本文原创地址:https://www.linuxprobe.com/java-subclass-superclass.html

Java面向对象_继承思想——方法覆盖

2018-05-01

 

方法覆盖(重写)

 

override(覆盖):

覆盖解决的问题:当父类的某一个行为(方法)不符合子类具体的特征时,此时父类需要重新定义父类方法,并重写方法体。

注意:只有方法才有覆盖的概念,字段没有。

 

方法覆盖的原则:

  1、实例方法签名必须相同。(方法签名 = 方法名称 + 方法参数列表)

  2、子类方法不能返回比父类方法更大的数据类型,子类方法的返回值类型必须和父类方法的返回值类型相同,或者子类方法的返回值类型是父类方法的返回值类型的子类。

   (子类可以返回更具体的数据类型,比如父类返回Object,子类可以返回String)

  3、子类方法不能低于父类方法的访问权限 

  4、子类方法不能抛出比父类方法更多的异常,子类方法抛出的异常必须和父类方法抛出的异常相同,或者子类方法抛出的异常类是父类方法抛出的异常类的子类 。

  5、方法覆盖只存在于子类和父类(包括直接父类和间接父类)之间。在同一个类中方法只能被重载,不能被覆盖。

 

建议:直接复制父类方法到子类中,再重写其方法体即可。

方法覆盖的判断:在方法前写上@override标签。

         若覆盖成功,则编译通过,否则编译失败。

 

代码举例:

 1 //鸟类
 2 class Bird
 3 {
 4     public void fly(){
 5         System.out.println("自由飞翔");
 6     }
 7 }
 8 //企鹅
 9 
10 class Penguin extends Bird
11 {
12     @override
13     public void fly(){
14         System.out.println("折翼天使");
15     }
16 }
17 
18 
19 
20 //方法覆盖
21 class OverrideDemo 
22 {
23     public static void main(String[] args) 
24     {
25         //创建一个企鹅对象
26         Penguin p = new Penguin();
27         //调用飞翔方法
28         p.fly();
29     }
30 }

 

输出结果:

 

 

 

参考博客:

http://ihyperwin.iteye.com/blog/1553609

-----------------------------------------------------------------------------------------------------------------------

 

方法覆盖和方法重载的区别:

override覆盖(重写)

overload重载

实际上两者没有任何关系。

 

 

方法重载定义:在一个类中定义多个同名的方法,要求方法之间的参数列表不同即可。

方法重载的作用:完成一组任务相似但参数的类型或参数的个数不同的方法。(屏蔽同一功能的方法由于参数不同而造成方法名称不同的差异)

方法重载的调用:Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。

方法重载的判断:两同一不同

        两同:同一个类,方法名称相同

        一不同:方法的参数列表不一致(参数类型、参数个数、参数顺序)

注意:方法重载和方法返回值类型无关,只是一般要求同一功能的方法返回值类型一致

   参数列表和参数名称无关,也就是说方法重载和形参无关

 

Java编译器能通过检查调用的方法的参数类型和个数选择一个恰当的方法。

 

以上是关于Java中子类重写父类方法的思想本质!的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象_继承思想——方法覆盖

Java中子类重写父类的方法为啥返回值类型要小于等于父类方法的返回值类型?

java子类重写父类带泛型的方法

java 复写 意思

Java中子类的访问权限为何比父类大?

24. java面向对象 - 方法重写