方法的覆写
在继承的关系中也存在着方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
访问权限:private<default<public
方法的覆写:
class Person0605{
void print(){
System.out.println("Person-->void print(){}");
}
}
class Student0605 extends Person0605{
public void print(){
System.out.println("Student-->void print(){}");
}
}
class OverrideDemo01{
public static void main(String[] args) {
new Student0605().print();
}
}
从以上程序可以发现,Student子类定义了Person父类中同名的方法,但是在子类中此方法的访问权限被扩大了,符合覆写的概念,当方法被覆写之后,子类对象调用的将是被覆写后的方法。
错误的方法覆写:
class Person0606{
public void print(){
System.out.println("Person-->void print(){}");
}
}
class Student0606 extends Person0606{
void print(){
System.out.println("Student-->void print(){}");
}
}
class OverrideDemo02{
public static void main(String[] args) {
new Student0606().print();
}
}
以上代码编译无法通过。
如果现在子类的方法中访问父类的方法,则使用super关键字即可,代码如下:
调用父类中被子类覆写过的方法:
class Person0607{
void print(){
System.out.println("Person-->void print(){}");
}
}
class Student0607 extends Person0607{
public void print(){
super.print();
System.out.println("Student-->void print(){}");
}
}
class OverrideDemo03{
public static void main(String[] args) {
new Student0607().print();
}
}
运行结果:
Person-->void print(){}
Student-->void print(){}
从程序中可以发现,在子类中直接通过“super.方法()”形式,即可访问父类中的相关方法。
如果现在将父类的一个方法定义成private访问权限,在子类中将此方法声明为default访问权限,那么这样还叫做覆写吗?
不算方法覆写。先看如下代码:
class Person0608{
private void print(){
System.out.println("Person-->void print(){}");
}
void fun(){
this.print();
}
}
class Student0608 extends Person0608{
void print(){
System.out.println("Student-->void print(){}");
}
}
class OverrideDemo04{
public static void main(String[] args) {
new Student0608().fun();
}
}
运行结果:
Person-->void print(){}
可以发现,现在调用的方法是父类中的方法,也就是说此时子类并没有覆写父类中的方法,而是在子类中重新定义了一个新的方法,所以此时方法没有被覆写。
实际上与方法覆写概念相同的还有另外一个称为属性的覆盖。属性的覆盖:
class Person0609{
public String info = "MLDN";
}
class Student0609 extends Person0609{
public String info = "LXH";
public void print(){
System.out.println("父类中的属性" + super.info);
System.out.println("子类中的属性" + this.info);
}
}
class OverrideDemo05{
public static void main(String[] args) {
new Student0609().print();
}
}
运行结果:
父类中的属性MLDN
子类中的属性LXH
如果子类和父类声明了相同名称的属性,则在子类中直接访问时一定是采用“就近访问原则”,如果此时要调用父类中的属性,直接使用“super.属性”格式即可。
方法的重载与覆写:
