Java中的覆写


继承性的主要特征是子类根据父类已有的功能进行功能的扩充,但是在子类定义方法和属性时,有时会出现子类定义的属性和方法的名称与父类的名称相同的情况,这样的操作就称为覆写。


1.方法的覆写

当子类定义了和父类的方法名称、返回值类型、参数类型、参数个数完全相同的方法时,就称为方法的覆写。在实例化子类对象后,调用同名方法时,将不再执行父类方法,而是去执行被子类覆写过的方法。

一个类可能会产生多个子类,而每个子类都可能覆写父类中的方法,这样一个方法就会根据子类的不同产生不同的结果。

程序示例:多个子类的方法覆写

class A{
	public void fun(){
		System.out.println("A类的fun方法");
	}
}
class B extends A{                                 //定义A的子类
	public void fun(){
		System.out.println("B类中的fun方法");
	}
}
class C extends A{                                 //定义A的子类
	public void fun(){
		System.out.println("C类中的fun方法");
	}
}
public class TestDemo{
	public static void main(String args[]){
		B b = new B();
		b.fun();
		C c = new C();
		c.fun();
	}
}
程序执行结果:  B类中的fun方法
              C类中的fun方法

在覆写的过程中存在着权限的问题,被子类所覆写的方法不能拥有比父类更严格的访问控制权限,控制权限有宽到严的顺序是:public>default(默认,不用写)>private,绝大多数情况下使用public定义方法。
如果父类使用private声明方法,子类使用public声明方法,这在权限虽然是符合覆写要求的,但是实际上private是私有的,所以无法被外部看见,所以子类是不能覆写的。
程序示例:覆写权限问题

class A{
	public void fun(){
		this.print();
	}
	private void println("WWW.CSDN.net");
}
class B extends A{                                 //定义A的子类
	public void print(){
		System.out.println("WWW.baibu.com");
	}
}

public class TestDemo{
	public static void main(String args[]){
		B b = new B();
		b.fun();
	}
}
程序执行结果:WWW.CSDN.net

注意:

  • 在执行覆写代码时,要先观察实例化的是哪个类,再观察这个类里的方法是否被覆写,没有的话就调用父类方法。
  • 如果父类中定义的方法其功能不能满足需求,但又必须使用这个方法名称,这是就应该采用覆写来完善此方法功能。
  • 被子类所覆写的方法不能拥有比父类更严格的访问控制权限。

发生覆写之后,父类中被覆写的方法将不会执行。为了能够明确的由子类调用父类中被覆写的方法,可以使用super.方法() 来进行访问。

程序示例:使用super.方法()访问父类中的方法

class A{
	public void print(){
		System.out.println("WWW.CSDN.net");
	}
}
class B extends A{                                 //定义A的子类
	public void print(){
		super.print();                             //调用父类中的print()方法
		System.out.println("WWW.baibu.com");
	}
}

public class TestDemo{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}
程序执行结果:  WWW.CSDN.net
              WWW.baibu.com

问题思考:
问题一:关于super.方法()和this.方法()的区别?
解答:
1.使用this.方法()会首先查询本类中是否有要调用的方法名称,如果有则调用,没有则查找父类中是否具有此方法,父类中如果有就调用,没有则编译错误;
2.使用super.方法(),则明确表示调用的不是子类方法,而是调用父类中指定方法。

问题二:方法重载(Overloading)与覆写(Override)的区别?
解答:
1.重载是发生在一个类里面,方法的名称相同,但是参数类型和个数不同,而且没有权限的限制;
2.覆写发生在继承关系中,要求方法的名称、返回值类型、参数类型和个数都要相同,而且被覆写的方法不能拥有比父类方法更严格的控制权限。

2.属性的覆盖(了解)

如果子类定义了和父类完全相同的属性名称时,就称为属性的覆盖。在程序开发中,类中的属性都要使用private封装,父类中定义的私有属性子类无法看见,更不会产生影响,所以说属性的覆盖在实际开发中没有意义。
程序示例:属性的覆盖

class A{
	String info="Hello";
	}
}
class B extends A{    
	int info=100;                            
	public void print(){                           
		System.out.println(super.info); //调用父类属性
		System.out.println(this.info);  //调用本类(子类)属性
	}
}

public class TestDemo{
	public static void main(String args[]){
		B b = new B();
		b.print();
	}
}
程序执行结果:  Hello
              100

你可能感兴趣的:(Java面向对象)