java方法重写和重载

 
 
public class MyTest {

	public static void main(String[] args) {
		// 注意:子类如果有与父类同名的方法,不是重载就是重写,不然就报错。
		
		// 一、方法的重载规则
		// 1.方法名相同,参数列表不同。与返回值类型无关。
		
		// 二、方法的重写规则
		// 1.方法名、返回值类型和参数列表相同。重写方法的返回值类型可以是被重写方法返回值类型的子类。
		// 2.访问修饰符的限制一定要大于或等于被重写方法的访问修饰符(public > protected > default > private)。
		// 3.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
		
		// 1.父类变量 引用 父类对象,这没啥说的
		// 2.父类变量 引用 子类对象
		Super parent = new Sub();
		System.out.println(parent.a); // 1 成员变量不具有多态性
		System.out.println(parent.name()); // Sub 重写的方法具有多态性
		parent.M1(); // 1
		parent.ThisM1(); // 1
		//parent.M2(); // 编译失败;编译时是根据变量的类型进行判断,运行时是根据实际的对象运行。
		//parent.ThisM2(); // 编译失败;编译时是根据变量的类型进行判断,运行时是根据实际的对象运行。
		
		System.out.println("----------------");
		
		// 3.子类变量 引用 子类对象
		Sub child = new Sub();
		System.out.println(child.a); // 2 成员变量不具有多态性
		System.out.println(child.name()); // Sub 重写的方法具有多态性
		child.M1(); // 1
		child.ThisM1(); // 1
		child.M2(); // 2
		child.ThisM2(); // 2
		
		// 4.转型
		Super pt = new Sub();
		Sub ch = (Sub)pt; // 正确
		pt = ch; //  正确
		
		// 父类对象不能强转为子类
		//Sub cd = (Sub)new Super(); // 编译通过,运行时异常
		
	}
}

class Super {
	public int a  = 1;
	public void M1(){
		System.out.println(a);
	}
	public void ThisM1(){
		System.out.println(this.a);
	}
	public Object name() {
		return "Super";
	}
}

class Sub extends Super {
	public int a = 2;
	public void M2(){
		System.out.println(a);
	}
	public void ThisM2(){
		System.out.println(this.a);
	}
	public String name() {
		return "Sub";
	}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/lercent/article/details/51679264