Skip to content

重写(Override)

1361字约5分钟

java

2024-10-24

重写(Override)

多态:一个方法多个实现,且可以自动根据情况调用

子类的同名同参方法遮蔽了父类的方法(做了重写)

定义:

1.在继承链中的不同类有同名同参数的方法

2.子类可以使用自身同名同参数不同实现的方法覆盖(重写)父类的方法

里氏替换原则:使用父类对象的地方一定能被子类对象所替代

作用

同名方法根据不同的情况(对象的真实数据类型new后面的)来调用不同的方法

注解:

1.一种标记

2.一种特殊的接口,可写在类、方法、构造方法、成员变量、形参之前为以上元素提供特殊的附加功能(JDK5以上)

@Override:指明这个方法必须是重写超类的(超类中已存在的方法)

public class OverrideFather {
	public void overrideTest() {
		System.out.println("父类overrideTest()");
	}
}
public class OverrideSon extends OverrideFather {
    // 重写了父类中的overrideTest()方法
	@Override
	public void overrideTest() {
		System.out.println("子类overrideTest()");
	}
	public static void main(String[] args) {
		OverrideFather overrideFather = new OverrideFather();
		OverrideSon overrideSon = new OverrideSon();
        overrideFather.overrideTest();// 父类的方法
		overrideSon.overrideTest();// 子类的方法
	}
}
/* 输出结果:
 * 父类overrideTest()
 * 子类overrideTest()
 */

可用于检验方法是否重写成功

构成重写的条件:

两同一不同,两小一大

两同:同名同参数的方法(参数个数、类型、顺序相同)

一不同:不同的类(继承链上的不同类)

两小:返回的数据类型(引用类型)可以与超类的不同

子类重写的方法返回类型是超类的派生类,异常数减少

一大:子类重写的方法的权限修饰符可以与超类的不同(子类重写的权限>=超类的方法权限)

若超类的的方法使用private修饰则子类不能够继承到,无法进行重写

若超类的的方法使用static修饰这时方法属于类,每个对象共享这个方法,此时不可重写原因是:

重写是利用对象的实际数据类型来判断调用那个对象的方法,类方法不满足条件

重写是基于继承的,没有继承就没有重写

public class OverrideFather {
	void overrideTest() {
		System.out.println("父类overrideTest()");
	}
    public void test() {
		System.out.println("OverrideFatherd的test()");
	}
    private void test1() {
		System.out.println("OverrideFatherd的test1()");
	}
    static void test2() {
		System.out.println("OverrideFatherd的static test2()");
	}
    public void father() {
		System.out.println("OverrideFather的father方法");
	}
}
public class OverrideSon extends OverrideFather {
    // 重写了父类中的overrideTest()方法
    // 权限从默认到了public
	@Override
	public void overrideTest() {
		System.out.println("子类overrideTest()");
	}
    @Override
	void test() {// 报错,子类的方法权限小于父类的(默认权限小于public)
		System.out.println("OverrideFatherd的test()");
	}
    @Override
	private void test1() {// 报错,父类private方法无法继承。不构成重写条件
		System.out.println("OverrideSon的private test1()");
	}
    @Override
	public static void test2() {// 报错,父类static方法属于类方法,不构成重写条件
		System.out.println("OverrideSon的static test2()");
	}
    
    public void son() {
		System.out.println("Overrideson的father方法");
	}
    // 主方法
	public static void main(String[] args) {
        // 定义父类的对象
		OverrideFather overrideFather = new OverrideFather();
        // 定义子类的对象
		OverrideSon overrideSon = new OverrideSon();
        // 使用父类引用子类对象,对象实际数据类型为子类
        OverrideFather overrideFather1 = new OverrideSon();
        
        overrideFather.overrideTest();// 父类对象调用父类的方法
		overrideSon.overrideTest();// 子类对象调用子类的方法
		overrideFather1.overrideTest();// 声明为父类实际为子类对象调用子类的方法
        overrideSon.father();// 子类对象调用父类方法
		overrideSon.son();// 子类对象调用子类方法
		overrideFather.father();// 父类对象调用父类方法
//		((OverrideSon) overrideFather).son();// 父类对象调用子类方法,运行时报错
	}
}
/* 输出结果:
 * 父类overrideTest()
 * 子类overrideTest()
 * 子类overrideTest()
 * OverrideFather的father方法
 * Overrideson的father方法
 * OverrideFather的father方法
 */

重写与重载的区别

相同点:

两者都有多态的作用,都可以让同名方法有不同的实现,

并且可以让Java自动的根据不同情况调用

重载:参数

重写:对象实际数据类型

区别:
确定方法的方式不同:

重载:通过参数确定(参数个数、参数类型、参数顺序)

重写:通过对象的实际数据类型(调用)

范围不同:

重载:同一个类中

重写:多个继承链上的不同类之间

实现不同

重载:两同三不同

同类、同名方法,方法的参数不同(参数个数、参数类型,参数顺序)

重写:两同一不同,两小一大

同名同参数的方法(参数个数、类型、顺序相同),不同的类(继承链上的不同类)

返回的数据类型(引用类型)可以与超类的不同,子类重写的方法返回类型是超类的派生类,异常数减少

子类重写的方法的权限修饰符可以与超类的不同(子类重写的权限>=超类的方法权限)

扩展
实现原理:

重载:编译时实现(编译后同名不同参数的方法会变成不同名的方法) 静态多态

重写:运行时实现(运行时动态的判断对象的实际数据类型从而确定调用哪个方法) 动态多态

问题

这里书写今日所遇到问题及解决方法 不要忽略小问题,小问题也要记下来。( 勿以善小而不为 )

吐槽

这里是吐槽部分,内容不限。