zoukankan      html  css  js  c++  java
  • 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;
    	}
    }
    

  • 相关阅读:
    hdu 1203 I NEED A OFFER! (01背包)
    链式前向星
    hdu 3790 最短路问题 (spfa练手)
    hdu 2859 Phalanx (最大对称子矩阵)
    hdu 1160 FatMouse's Speed (最长上升子序列+打印路径)
    hdu 5289 Assignment (ST+二分)
    vue环境配置 vue-cli脚手架
    1、初始Java应用程序
    HTML5之Canvas画正方形
    布尔表达式
  • 原文地址:https://www.cnblogs.com/zy200128/p/12682806.html
Copyright © 2011-2022 走看看