外观
重写(Override)
重写(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自动的根据不同情况调用
重载:参数
重写:对象实际数据类型
区别:
确定方法的方式不同:
重载:通过参数确定(参数个数、参数类型、参数顺序)
重写:通过对象的实际数据类型(调用)
范围不同:
重载:同一个类中
重写:多个继承链上的不同类之间
实现不同
重载:两同三不同
同类、同名方法,方法的参数不同(参数个数、参数类型,参数顺序)
重写:两同一不同,两小一大
同名同参数的方法(参数个数、类型、顺序相同),不同的类(继承链上的不同类)
返回的数据类型(引用类型)可以与超类的不同,子类重写的方法返回类型是超类的派生类,异常数减少
子类重写的方法的权限修饰符可以与超类的不同(子类重写的权限>=超类的方法权限)
扩展
实现原理:
重载:编译时实现(编译后同名不同参数的方法会变成不同名的方法) 静态多态
重写:运行时实现(运行时动态的判断对象的实际数据类型从而确定调用哪个方法) 动态多态
问题
这里书写今日所遇到问题及解决方法 不要忽略小问题,小问题也要记下来。( 勿以善小而不为 )
吐槽
这里是吐槽部分,内容不限。