Java基础知识之重写(Override)和重载(Overload)
一、重写(适用于方法)
两同两小一大原则:
- 方法名相同,参数类型相同
- 子类返回类型小于等于父类的返回类型(前提:子父类返回的类型是继承关系),子类抛出的异常要小于等于父类抛出的异常
- 子类访问权限必须大于等于父类的访问权限
代码 : 父类
public class Animal {
/**
* @Title: getThis
* @Desc: 得到一个未知动物
* @return Animal
*/
public Animal getThis() throws IOException {
return new Animal();
}
}
子类:
public class Dog extends Animal{
/**
* @Title: getThis
* @Desc: 子类方法名和参数与父类方法名和参数已知 jvm就已经认为是覆盖方法
* @return
* @see com.swft.c.Animal#getThis()
*/
public Animal getThis() throws IOException{
//返回类型可以是父类返回类型的子类
return new Dog();
}
public static void main(String[] args) throws Exception {
Animal animal = new Dog();
System.out.println(animal.getThis().getClass());;
}
}
输出:class com.swft.c.Dog(Dog类的包路径)
协变返回类型 :
在Java SE5中添加了协变返回类型,它表示在子类中的被覆盖方法可以返回父类方法返回类型的子类。正如上述代码中子类覆盖方法返回Animal类型的导出类 —— Dog类型
二、重载(适用于构造器和方法)
一同一不同原则:
- 方法名相同
- 方法参数列表不同(参数类型,参数列表顺序)
1.要是几个方法有相同的名字,Java如何才能知道你指的是哪一个呢?
- 每个重载的方法都必须拥有一个独一无二的参数列表,甚至参数顺序的不同也能区分两个方法,不过一般不推荐这么做,会导致后期代码难以维护。
2.涉及基本类型的重载
基本类型能从一个“较小”的类型自动提升为一个“较大”的参数类型(对引用类型也适应,但是引用类型是以继承关系为基础判断类型“大小”)
代码:
public class BasicTypeDemo {
public static void main(String[] args) {
BasicTypeDemo basicTypeDemo = new BasicTypeDemo();
basicTypeDemo.say(5);
}
public void say(char word) {
System.out.println("char:"+word);
}
public void say(byte word) {
System.out.println("byte:"+word);
}
public void say(short word) {
System.out.println("short:"+word);
}
public void say(int word) {
System.out.println("int:"+word);
}
public void say(float word) {
System.out.println("float:"+word);
}
public void say(double word) {
System.out.println("double:"+word);
}
}
输出: int:5
我们发现常数值 5 被当作int类型处理,那么我们删除say(int word)这个方法,再看java会调用哪个重载方法?
实验结果输出:float:5.0
我们发现java会优先寻找相同接受类型的重载方法,若没有,则会自动将参数类型提升并寻找对应的方法。char类型略有不同,若找不到相同类型,会直接提升为int类型。
3.能不能以方法返回值来区分重载方法?
public void getInfo() {
System.out.println(".....");
}
//报错:需要修改方法名
public int getInfo() {
return 1;
}
很明显这样编译器都报错,原因在于,当 int x = getInfo() 这样调用,那么的确可以一次区分它们,但是有时候调用者并不关心调用方法的返回值,在 getInfo() 这样调用,此时java该如何判断调用哪个方法呢?所以以返回值区分重载方法是行不通的。