一、慨况
本文讨论子类重写父类方法的问题。
子类分别有静态、实例方法,父类也分别有静态、实例方法,现在分四种情况:
a.实例方法(子类) ---重写 ----> 实例方法(父类)
a.实例方法(子类) ---重写 ----> 静态方法(父类)
a.静态方法(子类) ---重写 ----> 实例方法(父类)
a.静态方法(子类) ---重写 ----> 静态方法(父类)
二、代码
1.父类
package com.desmond.thread.main;
public class Parent {
public int method1(int x, double y) {
return 2;
}
public static void method2() {
}
public double method3(double y) {
return 2d;
}
}
2.子类
package com.desmond.thread.main;
public class Child extends Parent{
/*
* 子类实例方法重写父类实例方法
* 编译失败,参数列表(数量、类型、顺序)不一样
*/
@Override
public void method1(int x) {
}
/*
* 子类实例方法重写父类实例方法
* 编译失败,返回类型不一样
*/
@Override
public double method1(int x, double y) {
return 3;
}
/*
* 子类实例方法重写父类静态方法
* 编译失败,子类的实例方法不能覆盖父类的静态方法
*/
public void method2() {
}
/*
* 编译成功,这是一个新的方法
*/
public void method2(int x) {
}
/*
* 子类静态方法重写父类实例方法
* 编译失败,子类的静态方法不能覆盖父类的实例方法
*/
public static double method3(double x) {
return 3d;
}
/*
* 子类静态方法"重写"父类的静态方法
* 编译成功
*/
public static void method2() {
}
}
三、结果
由此可以看出:
a.子类的实例方法可以重写父类的实例方法(当然是非private和final的),但参数列表(包括类型,数量和顺序)和返回类型必须一致。
如果参数列表不一致,会被看出是子类的一个新的方法,并且重载了父类的方法
如果返回类型不一致,则不能通过编译,因为不能与父类的方法形成重载(重载的返回类型必须一致)
b. 子类的实例方法不能重写父类的静态方法
c. 子类的静态方法不能重写父类的实例方法
d. 子类的静态方法"重写"父类的静态方法,这个好像并不能叫重写,因为无法加上"Override"等关键字注解,但是确实能通过编译,并且有如下的现象:
package com.desmond.thread.main;
public class Test {
public static void u(){ System.out.println("parent");};
}
package com.desmond.thread.main;
import java.util.Collection;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Set;
public class TestA extends Test{
/*
* public static int u(int x){ return x};
*/
public static void u(){ System.out.println("child");};
/**
* @param args
*/
public static void main(String[] args) {
TestA a = new TestA();
a.u();
Test b = new TestA();
b.u();
}
}
结果:
child
parent
可见子类静态方法并未覆盖父类的静态方法。