Java基础重温(六)子类与父类实例方法、静态方法的重写问题

一、慨况

本文讨论子类重写父类方法的问题。

子类分别有静态、实例方法,父类也分别有静态、实例方法,现在分四种情况:

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

可见子类静态方法并未覆盖父类的静态方法。


你可能感兴趣的:(Java基础重温,重写实例和静态方法,方法重写)