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;
    	}
    }
    

  • 相关阅读:
    推荐前端开发使用的服务器环境开源项目 D2Server 可替代Apache
    JavaScript正则表达式的坑很深
    NodeJS + Sequelize + Mysql + Vue + Bootstrap
    wampserver使用过程中遇到的问题及相关配置
    生成解决方案时,无法导入以下密钥文件
    使用Image.GetThumbnailImage 方法返回缩略图
    C#操作xml文件进行增、删、改
    MessageBox.Show()时MessageBoxIcon的显示
    通过反射获取对象属性、属性的值,设置对象属性的值
    常用文档处理技巧
  • 原文地址:https://www.cnblogs.com/zy200128/p/12682806.html
Copyright © 2011-2022 走看看