java子类重写父类方法 一个Java类可以有多个父类
老铁们,大家好,相信还有很多朋友对于java子类重写父类方法和一个Java类可以有多个父类的相关问题不太懂,没关系,今天就由我来为大家分享分享java子类重写父类方法以及一个Java类可以有多个父类的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
子类重写父类的方法,父类没有异常,子类可以抛异常吗
这就是java的重写规则。
对于异常重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别。
(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是public访问权限。)比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记public修饰符,编译器当然不会放过任何教训我们的机会。出错的原因就是:没有加任何访问修饰符的方法具有包访问权限,包访问权限比public当然要严格了,所以编译器会报错的。
重写规则之二:参数列表必须与被重写方法的相同。
重写有个孪生的弟弟叫重载,也就是后面要出场的。如果子类方法的参数与父类对应的方法不同,那么就是你认错人了,那是重载,不是重写。
重写规则之三:返回类型必须与被重写方法的返回类型相同。
父类方法A:void eat(){}子类方法B:int eat(){}两者虽然参数相同,可是返回类型不同,所以不是重写。
父类方法A:int eat(){}子类方法B:long eat(){}返回类型虽然兼容父类,但是不同就是不同,所以不是重写。
重写规则之四:重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
注意:这种限制只是针对检查异常,至于运行时异常RuntimeException及其子类不再这个限制之中。
重写规则之五:不能重写被标识为final的方法。
重写规则之六:如果一个方法不能被继承,则不能重写它。如private方法
子类对象调用父类方法算不算重载
首先说一点 java是面向对象编程
那什么是面向对象
三大特性:封装(把属性和方法都放到一个类中,然后类创建对象,这样对象就集成了属性和方法)、继承(你问的问题,下面详细说明)、多态(下面也详细说一下)
继承:需要注意四点
子类拥有父类的所有属性
子类中继承父类中所有的属性,在父类中声明的属性在子类内部可以直接调用。
说明:如果访问控制符限制则无法访问。
子类拥有父类的所有方法
子类中继承父类中所有的方法,在父类中声明的方法在子类内部可以直接调用。
说明:如果访问控制符限制则无法访问。
子类不拥有父类的构造方法
子类不继承父类的构造方法,如果需要在子类内部使用和父类传入参数一样的构造方法,则需要在子类内部重新声明这些构造方法。
子类类型是父类类型
子类类型的对象可以自动转换为父类类型的对象,父类类型的对象则需要强制转换为子类的对象,转换的语法个基本数据类型转换的语法相同。
方法重写要求有三点:
1.在子类中可以根据需要对从基类中继承来的方法进行重写
2.重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型
3.重写方法不能使用比被重写方法更严格的访问权限
所以你直接调用父类方法,其实子类自己也有,没有自己重新写一个,当然不算重写,另外你说的重载,说明一下两者分别:
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同
重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法
再说说多态:
需要三点:要有继承、要有重写、父类引用指向子类方法
多态性依赖继承特性,可以把多态理解为继承性的扩展或者深入。
在这里把多态性分为两方面来进行介绍,对象类型的多态和对象方法的多态。
对象类型多态
对象类型的多态是指声明对象的类型不是对象的真正类型,而对象的真正类型由创建对象时调用的构造方法进行决定。按照继承性的说明,子类的对象也是父类类型的对象,可以进行直接赋值。
对象方法多态
对象方法的多态基于方法的覆盖,也就是该对象调用的方法具体是子类的方法还是父类的方法,由创建对象时使用的构造方法决定,而不是由声明对象时声明的类型决定。
因为多态涉及太多,所以建议你仔细看一下详细材料才好
java 方法重载的时候,同一个类,父子类,调用哪个方法的问题
package com.java.test;
public class Test extends Parent{
public static void main(String[] args){
System.out.println("haha");
Test t= new Test();
t.t2(3);
}
public void t2(int a){
System.out.println("t2的int a=="+a);
}
public void t2(double a){
System.out.println("t2的double a=="+a);
}
}
class Parent{
}
打印结果:
haha
t2的int a==3
2、父子类中,重载(不是覆盖)
难点:
区分当子类的对象,强制转换成父类的时候:重写(覆盖)与重载的区别。覆盖调用子类的方法,重载只调用父类的方法
情况一:若以父类A为入口,父类的对象a,
(1)若父类中有这个方法,就调用(父类的方法),
代码
package com.java.test;
public class Test extends Parent{
public static void main(String[] args){
System.out.println("haha");
Test t= new Test();
t.t2(3);
//这种情况下,区分重写(覆盖)的区别。覆盖调用子类的方法,重载只调用父类的方法
Parent t3=(Parent) t;
t3.t2(3);
}
public void t2(int a){
System.out.println("子类t2的int a=="+ a);
}
}
class Parent{
public void t2(double a){
System.out.println("父类t2的double a=="+ a);
}
public void t2(String s){
System.out.println("父类t2的String s=="+ s);
}
}
haha
子类t2的int a==3
父类t2的double a==3.0
(2)如果没有也不会调用子类的方法,只会出错。
代码
class Parent{
public void t2(String s){
System.out.println("父类t2的String s=="+ s);
}
若父类中只有这个方法,他也不会调用子类的方法。只会在
Parent t3=(Parent) t;
t3.t2(3);//此句报错,出错
截图如下:当以父类为入口的时候,下面这两个t2都是父类的方法。
情况二:以子类为入口,
子类既能调用自己的重载的方法,又能调用父类的原来的方法,具体调用谁,看参数跟谁匹配,
如果都匹配,看与谁最匹配,所以我们写程序的时候,尽量把父类的重载的方法的参数列表尽量区分开。
如下图:
具体实际调用的时候,调用谁,看参数与谁最匹配,如果子类没有t2(int a)方法,他当然就会调用父类的方法了。。
文章到此结束,如果本次分享的java子类重写父类方法和一个Java类可以有多个父类的问题解决了您的问题,那么我们由衷的感到高兴!