什么是重载?
方法名相同,参数类型、数量、顺序不同(参数的顺序不同也是重载,但是没有意义),与返回值无关。为什么不拿返回值区分重载呢?有时候我们只调用方法不在乎返回值的时候,就无法区分是否是重载了。例如
public class Demo3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
//此时系统也不知道你调用了哪个方法对吧!
demo3.fun()
}
public int fun(){
System.out.println("int类型返回值fun()");
return 0;
}
//这里会报错
public void fun(){
System.out.println("void类型返回值fun()");
}
}
重载需要注意什么?
重载与基本数据类型.
基本类型可以自动从小类型转为大类型,若传入的参数类型大于方法期望接收的参数类型,你必须首先做缩窄转换,否则编译器就会报错。
/**
* @author sunyuan
* @date 2022/3/16 14:00
*/
public class Demo3 {
public static void main(String[] args) {
Demo3 demo3 = new Demo3();
//默认调用fun(int x) 因为java中整数的数据类型默认是int,所以基本数据类型重载的时候需要注意一下,
demo3.fun(1);
byte x = 2;
demo3.fun(x);
//这里默认调用double 因为浮点数默认是double
demo3.fun(2.1);
//调用float需要 带f
demo3.fun(2.1f);
}
public void fun(int x) {
System.out.println("fun(int x)");
}
public void fun(byte x) {
System.out.println("fun(byte x)");
}
public void fun(float x) {
System.out.println("fun(float x)");
}
public void fun(double x) {
System.out.println("fun(double x)");
}
}
为什么要有重载?
Java的构造方法就是重载。所以很有必要重载,姑且的理解可以省很多词汇量,JDK原码这个想想不重载的话,输出字符串printlnString,输出int printlnInt ,想想多么麻烦!现在我们println的时候,调用哪个方法和我们无关,由系统决定。是不是很爽。我们只关心业务逻辑,不关心底层实现!
什么是重写?
子类重新定义父类中已有的方法,且子类中的方法名和参数类型及个数都必须与父类保持一致!即外壳不变,核心重写!
为什么要有重写?
多态的体现,减少重复的代码!
重写是不是为了增强父类的方法? 是的。和父类一样的方法骨架但是有更强的方法体 ,先不说实现,就光说架子,何为更强(可以被更多的人访问,即方法的修饰符修饰符比父类更大,但是在强大也不能忘了本呀,你的返回类型不能比父类更大呀,方法体里可以有更强的实现,但是**返回类型必须父类可控,小于父类,**抛出的异常也在父类可控范围之内,小于父类)
总结就是:【两小一大】
重写注意事项
-
子类方法的权限控制符不能变小;
-
子类方法返回的类型只能变小;
-
子类抛出异常的类型只能变小;
-
子类方法名必须和父类保持一致;
-
子类方法的参数类型和个数必须和父类保持一致。
----面试时间紧了解上面的就够了,但是多了解总是好的!----- -
声为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private 和 final 的方法。
-
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。(8 9 总结起来就是Default只能在一个包下访问,一个包下才能重写Default方法)
-
构造方法不能被重写
包结构:
Parent.java
public class Parent {
public void publicFun() {
System.out.println("父类的public方法");
}
public final void FinalFun() {
System.out.println("父类的FianlFun方法");
}
public static void publicStaticFun() {
System.out.println("父类的publicStatic方法");
}
protected void protectedFun() {
System.out.println("父类的protected方法");
}
void defaultFun() {
System.out.println("父类的default方法");
}
private void privateFun() {
//这肯定是父类私有的,要留清白在人间,不能什么都继承呀对不对!想成父亲的小秘密
System.out.println("父类的private方法");
}
}
Son1(和父类同一个包下)
package com.suny.test.chongxie;
/**
* 一个包下的儿子
* 所有Son1可以重写的方法
* @author sunyuan
* @date 2022/3/18 10:40
*/
public class Son1 extends Parent {
@Override
public void publicFun() {
super.publicFun();
}
@Override
protected void protectedFun() {
super.protectedFun();
}
@Override
void defaultFun() {
super.defaultFun();
}
}
Son2(和父类不同的包下)
/**
* 不是一个包下的儿子
* 所有Son2可以重写的方法
* @author sunyuan
* @date 2022/3/18 10:40
*/
public class Son2 extends Parent {
@Override
public void publicFun() {
super.publicFun();
}
@Override
protected void protectedFun() {
super.protectedFun();
}
}
总结起来就是:同一个包下可以重写Default方法,不同包下不可以
参考:
https://www.shouxicto.com/article/3007.html
https://cloud.tencent.com/developer/article/1890110
https://www.cnblogs.com/xwdreamer/archive/2012/04/06/2434483.html
由于能力有限,难免有不足!
欢迎交流指正!
饮水思源,对您有帮助欢迎点赞评论!