父类不可见性方法不可重载
在学习Java的过程中,不管是教学视频还是书籍上都描述到如果父类的成员方法是private权限的话,那么该方法不可重写。即使你在子类中定义了一个完全一样的同名,同参数列表的成员方法也不构成重写。因为父类的该方法是子类对象获取不到的(由于封装性),所以编译器认为子类定义的是一种新的方法。具体可以利用多态性进行测试。但是,老师往往只讲到这里,那么如果父类的成员方法是缺省(default)的话,子类一定可以重写吗?答案是不一定的。 如下:
package com.atguigu.mytest1;
public class Person {
public void show() {
System.out.println("我是一个人");
}
public void eat() {
System.out.print("eat");
show();
}
}
package com.atguigu.mytest2;
import com.atguigu.mytest1.Person;
public class Student extends Person {
public void show() {
System.out.println("我是一个学生");
}
}
在这里,我们写了两个类,分别在包com.atguigu.mytest1和包com.atguigu.mytest2下,子父类所属两个不同的包。对于父类的show()方法权限显然是缺省的,这里我们将show()方法写到子类Student中竟然没报错!!!其实和前文的道理一样,缺省是包可见性的,然后两个类所属不同的包,所以子类对象无法直接获取到父类的show方法,故而不构成重写。 如下:
package com.atguigu.mytest2;
public class PersonTest {
public static void main(String[] args) {
new Student().eat();
}
}
输出:吃我是一个人 所以构成重写的前提条件是要重写子类的方法必须子类对象能够直接访问到父类该方法,否则就是子类写了一个新的方法,会导致多态的运用出现bug。
可重写方法必须是成员方法
对于静态方法,是随着类的加载而加载,是属于类的,所以不能重写。对于子父类的同名,同参数列表方法,要么都是static的要么都是成员方法,否则编译器调用的时候根本不知道调用哪一个。所以你在写方法的时候,恰好写了子父类的同名,同参数列表方法,如果一个是静态的另一个不是静态的话编译器直接报错。
必须是同名,同形参列表方法
重写一个最主要的原因是能够为多态提供条件,那么调用方法的时候必须知道是哪一个方法。所以子父类方法必须是同名,同形参列表方法。 PS:同形参列表通俗的说就是比较两个方法的参数个数是否相同,以及对应位置的类型是否一样。
返回值类型由要求
因为多态的原因,我们编译的时候不知道实际调用的是哪一个具体的方法。所以对返回值由一定要求,避免运行时候出错。比如Person p = new Studnet()。在编译器看来,这就是一个Person的引用,当具体调用eat()方法时候对于Person返回的是int类型,如果Studnet类的eat()方法返回的是double类型的话,实际运行的时候可能这样:int b = a.eat(); 造成数据错误,出现严重bug。而且也因为父类的变量可以接受子类的引用,所以Java有如下规定: ①如果返回是void类型,子类返回也是void类型 ②如果返回是基本类型,子类返回也必须是相同基本数据类型 ③如果返回是引用数据类型,子类返回也是相同引用类型或其子类 ④子类抛出的异常是父类抛出的异常或子类(原理同上)
随便整理,如有错误,欢迎指出!
|