方法覆盖(也称为方法的重写,Override)定义:
它是多态性的重要体现之一,是动态多态性的表现形式,他是指子类中可以定义名称,参数列表,返回值类型均与父类中某个方法完全相同的方法,我们就说子类中定义的这个方法覆盖了父类中的同名方法。
举例:
//anmial为父类 package anmial; public class Animal { public void show(){//定义方法show System.out.println("I am a dog"); } }
//子类Fish继承了父类Animal public class Fish extends Animal { @Override public void show() {//对父类方法show的重写 System.out.println("I am a fish"); } public void shows(){//子类特有的方法 System.out.println("我每天都在水里"); } }
import anmial.Animal; import anmial.Fish; public class test { public static void main(String[]args){ Fish fish=new Fish();//为子类创建实例化对象 fish.show();//调用重写的方法 fish.shows();//调用自身方法 } }
输出
I am a fish 我每天都在水里
重写/覆盖需要注意的地方:
<1>必须同时满足方法名是同名的,参数列表是相同的,返回值也必须相同。
<2>如果父类的方法有final关键字修饰(称为最终方法),那么该方法不能被子类所覆盖。
<3>方法覆盖一定是建立在继承的基础上的,如果父类中的某个方法的访问权限是private,那么子类就无法进行覆盖。
<4>覆盖方法的访问权限一定要大于或等于被覆盖方法的访问权限,例如:子类父类处于同一个包中,父类的某方法的权限是public,那么子类中的该方法的权限也必须是public,如果父类中该方法是缺省访问权限,那么子类中的访问权限可以是缺省类,protected或者public访问权限。
类修饰符的含义:
注:abstract和final这两个修饰符不能出现在一个类的定义中
。
成员属性修饰符含义:
成员方法修饰符含义:
注意:
<1>public,protected,缺省和private这四个修饰符中只能选择一个作为方法的访问控制。
<2>final和abstract这两个修饰符不能同时用来修饰成员方法。
super关键字:
super关键字主要用来访问父类的成员属性,父类的成员方法以及父类的构造方法。
访问父类成员属性的语法格式是:
super.父类成员属性;
访问父类构造方法语法格式是:
super.([paramlist]);
访问父类成员方法语法格式是:
super.父类成员方法名([paramlist]);
举例:
package shape; public class Father { String name="小头爸爸"; public Father(){ System.out.println("我是"+name+"的构造方法"); } public void show(){ System.out.println("我是"+name+"的方法show"); } }
package shape; public class Son extends Father{ String name="大头儿子"; public Son() {//访问父类构造方法 super(); System.out.println("我是"+name+",我继承了"+super.name+"的构造方法"); } @Override public void show() {//访问父类成员属性和方法 System.out.println("我是"+name+",我的爸爸是"+super.name+"!我继承了"+super.name+"父类的方法show"); } }
package shape; public class SOn_test { public static void main(String[]args){ Son son=new Son(); son.show(); } }
输出如下:
我是小头爸爸的构造方法 我是大头儿子,我继承了小头爸爸的构造方法 我是大头儿子,我的爸爸是小头爸爸!我继承了小头爸爸父类的方法show
注意:
<1>调用父类无参的构造方法:super(),一定要出现在子类构造方法体中的第一句,而且可以省略不写,因为父类的无参构造在实例化子类之后会自动调用。
<2>如果调用父类带参数的构造方法,那么super(paramlist)一定要显式地写到子类构造方法体的第一句。
<3>调用父类构造方法的语句和调用子类重载的构造方法的语句(this关键字的一种用法)不能同时在子类构造方法体中。
final关键字:
final关键字表示最终的含义,可以用来修饰类,成员属性,局部变量以及成员方法。
final用在类的声明部分(class关键字的前面)表示该类不能有自己的“后代”,也就是不允许被其他类所继承,final用来修饰成员属性和局部变量表示该值是常量,不能被修改,final修饰成员方法表示该方法不能被子类所覆盖。
举例:
给父类属性增加final关键字修饰:
final String name="小头爸爸";
在子类中尝试修改该值:
super.name="大头爸爸";
报错!该值不允许被修改:
将父类的属性修改为final:
public class Son extends Father
子类将无法继承该属性:
将父类中的成员方法属性修改为final:
final void show()
子类将无法对其进行修改: