1.java有继承关系,那么就有子类和父类的联系,在子类中有可能定义和父类完全相同的方法或属性的名称,这称为覆写.
1.方法的覆写
子类和父类在方法名称、返回值类型、参数类型及个数完全相同的方法时,称为方法的覆写.
1.1没有实现方法覆写
运行结果
实例化的是子类对象,但由于在子类里没有print()方法,所以就使用从父类中继承而来的print()方法.
实现方法覆写
运行结果
本程序中覆写父类中的print()方法,而当一个类中的方法被覆写后,如果实例化的是这个子类对象,则调用的方法就是被覆写过的方法.
在进行覆写注意:被子类所覆写的方法不能拥有比父类更严格的访问控制权限.
错误的方法覆写,缩小了权限.
在B类继承A类的print方法时将权限由"public “缩小为"default”,所以在编译出现语法错误
class A{
public void print(){
System.out.println("Hello World")
}
}
class B extends A{ //B是A的子类
void print(){ //错误
System.out.print("世界,你好!")
}
}
多态性主要依靠方法覆写来实现
在进行方法覆写时,有一个原则—java会根据实例化子类不同,调用不同子类所覆写过得方法,这也是对象多态性的主要技术,所有开发中都会出现方法覆写这一概念.
当一个子类覆写了一个方法时,子类想要调用父类被覆写过得方法,要在前面加上"super".
2.访问父类的方法
在子类覆写父类print()方法中使用super()调用了父类中的print()方法,如果没有"super"的话,则会从本类之中调用print(),那样程序就会死循环,所以一定要记住操作范围:
this.方法():先从本类查找是否存在指定方法,如果没有找到,调用父类操作;
super.方法():直接由子类调用父类之中指定方法,不在找子类.
运行结果
如果父类的方法名称为private,则子类无法覆写,也不会这样编写代码.
私有方法无法覆写,在定义操作中,大多数情况下权限都为public
3.属性的覆写
当一个子类定义了和父类重名的属性名称时,就表示属性覆写.
运行结果
这种操作几乎没意义,因为属性一定要封装,封装之后就没有这一概念.