方法覆盖细节问题:
1.方法重写和多态联合起来使用!
Animal a = new Animal();
a.move();
编译时move()方法是Animal的;
运行时自动调用实际对象的move()方法;
假如只有方法覆盖,没有多态。即引用类型就是对象的实际类型,此时为什么一定要方法重写?我直接重更新定义一个满足子类业务需求的新方法不就行了吗。如果JAVA中不存在多态机制,方法覆盖就不是必须的!!
事实上,多态使得开发中父类引用可以指向任意子类,此时在子类中根据不同子类的业务需求对父类中的模板方法进行方法重写,使得编程更加简单。
**同样地,**只有多态不进行方法重写,那多态机制没有任何意义,父类引用访问子类对象时,始终使用的是继承自父类的方法。
2.静态方法存在方法覆盖吗?
静态方法时不需要对象的,也就不会通过引用.的方式进行访问,就算采用引用.访问编译阶段也会自动转化成类名.的形式,所以,静态方法一般不讨论覆盖问题。
public class OverrideTest01{
public static void main(String[] args){
Animal a = new Dog();
//下面这个指向哪个类的方法?
a.test();
}
}
class Animal{
public static void test(){
System.out.println("Animal");
}
}
class Dog extends Animal{
public static void test(){
System.out.println("Dog");
}
}
/*
Animal
*/
为什么执行Animal类的方法?因为静态方法不需要对象的参与,执行时本质上是按照“类名.”来访问的。
3.私有方法能覆盖吗?
注意:覆盖后的方法访问权限不能降低,可以更高。从必要条件上来说,并没有违背!
首先注意:私有方法不能再外部类直接访问
public class OverrideTest02{
private void test(){
System.out.println("private!");
}
public static void main(String[] args){
OverrideTest02 b = new B();
b.test();
}
}
class B extends OverrideTest02{
public void test(){
System.out.println("public!");
}
}
/*
private
*/
可见,运行结果仍是执行父类的方法,所以:私有的方法不能被覆盖!!!
4.方法覆盖的返回值问题:
- 返回值为基本类型则父类子类的重写方法必须返回值一致
- 引用类型的返回值重写后可以更低,但不能更高