Loading

Java学习笔记 -方法覆盖和多态

回顾方法重载(overload)

当在一个类当中,如果功能相似的话,建议将名字定义的一样,
这样代码美观,并且方便编程。

什么条件满足之后能够构成方法重载?

  • 在同一个类当中
  • 方法名相同
  • 参数列表不同 (个数、顺序、类型)

方法覆盖(Override)

子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,
子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”。

方法覆盖又叫做:方法重写(Override Overwrite)

当我们代码怎么编写的时候,在代码级别上构成了方法覆盖?

  1. 两个类必须要有继承关系。
  2. 重写之后的方法和之前的方法具有相同的返回值类型、方法名、形式参数列表
  3. 访问权限不能更低,可以更高(子类中进行方法覆盖的,访问权限必须高于等于父类中对应的方法;先记着)
  4. 重写之后的方法不能比之前的方法抛出更多的异常,可以更少(先记着)

注意事项:

  • 方法覆盖只是针对于方法,和属性无关
  • 私有方法无法覆盖
  • 构造方法不能被继承,所以构造方法也不能被覆盖
  • 方法覆盖只是针对于实例方法,“静态方法覆盖”没有意义。

示例代码:

class Animal{
	public void move(){
		System.out.println("动物在行走");
	}
}

class Cat extends Animal{
	//方法覆盖
	public void move(){
		System.out.println("猫在走猫步");
	}
	//方法重载
	public void move(int a){
		System.out.println("猫在走猫步");
	}
}

public class OverrideTest{
	public static void main(String[] args){
		Cat c = new Cat();
		c.move(3);
		c.move();
	}
}

解释:静态方法不存在方法覆盖

首先方法覆盖和多态机制密不可分,方法覆盖服务于多态机制
而多态自然和对象有关系,而静态方法的执行不需要对象
所以,一般情况下,我们会说“静态方法覆盖”没有意义,静态方法“不存在”方法覆盖
所以调用静态方法就一定要使用"类名."的方式,不要使用"引用."造成歧义

示例代码:

public class Test{
	public static void main(String[] args){
		//多态
		Pet p = new Cat();
		//静态方法和对象无关,只和类相关
		//虽然静态方法可以使用"引用."的方式调用,但是实际运行时还是Pet.doSome();
		p.doSome();
		
		Pet.doSome();
		Cat.doSome();
	}			
}

class Pet {
	static public void doSome() {
		System.out.println("Pet类的doSome方法执行");
	}
}

class Cat extends Pet{
	static public void doSome() {
		System.out.println("Cat类的doSome方法执行");
	}
}

解释:私有方法不能覆盖(记住就行)

示例代码:

public class OverrideTest{
	
	//私有方法
	private void doSome(){
		System.out.println("OverrideTest类的私有方法执行");
	}
	public static void main(String[] args){
		OverrideTest ot = new T();
		ot.doSome();
	}
}

class T extends OverrideTest{
	// 尝试重写父类中的doSome()
	// 子类方法访问权限不能更低,可以更高
	public void doSome(){
		System.out.println("T类的方法执行");
	}
}

解释:关于方法覆盖中的返回值类型

子类型方法覆盖中返回值类型“变小”在语法上是允许的,
但是实际开发中使用方法覆盖都是直接复制粘贴父类型中的方法,不动不改,所有这个语法实际的使用意义不大

示例代码:

public class Test{
	public static void main(String[] args){
		
		Pet p = new Cat();
		p.doSome();
	}			
}
class Pet {
	public Pet doSome() {
		System.out.println("Pet类的doSome方法执行");
		return null;
	}
}

class Cat extends Pet{
	public Cat doSome(){
		System.out.println("Cat类的doSome方法执行");
		return null;
	}
}

posted @ 2020-04-11 22:41  Krocz  阅读(255)  评论(0编辑  收藏  举报