覆盖:由于父类的某些方法不适用于子类,所以子类需要重写方法,
以覆盖(override)父类的方法。
重写和重载有什么区别?
重载是指在同一个类中有多个同名方法,但是参数类型不同,重写是指父类的
某些方法不适用于子类,而需要子类来重写父类方法,且覆盖父类方法的过程,
特点是参数和方法与父类重名。
重载: public class Dog1{ Dog1(){ this.bark(); } void bark(){ System.out.println("no barking!"); this.bark("famele",3.4); } void bark(String m,double l){ System.out.println("a barking dog!"); this.bark(5,"China"); } } 重写: class Manager extends Employee{ private double bonus=1500; public Manager(String name,int age,double salary,double bonus){ super(name,age,salry); this.bonus=bonus; } public void setBonus(double bonus){ this.bonus=bonus; } public int getBonus(){ return bouns; } //覆盖父类方法getMothlyIncome()方法 @Override public double getMothlyIncome(){ return this.getSalary()+this.bonus; } } //延续昨天的代码
其中覆盖的要求如下:
1)匹配方法接口的要求
子类中定义的新方法和父类中定义的方法要返回值类型、名称、参数列表上保持一致,才叫覆盖。
说明:
Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基
类方法返回类型的子类。协变返回类型允许返回更为具体的类型。
import java.io.ByteArrayInputStream; import java.io.InputStream; class Base { //子类Derive将重写此方法,将返回类型设置为InputStream的子类 public InputStream getInput() { return System.in; } } public class Derive extends Base { @Override public ByteArrayInputStream getInput() { return new ByteArrayInputStream(new byte[1024]); } public static void main(String[] args) { Derive d=new Derive(); System.out.println(d.getInput().getClass()); } } /*程序输出: class java.io.ByteArrayInputStream */
2)可选的Override标注
javaSE5.0后,可用Override标注告诉编译器方法将要覆盖父类中的声明的方法。但Override标注
是可选的,添加它的目的主要让程序在编译时就能发现方法是否符合语法。
注意:
*子类的覆盖方法不能具有更小的可访问范围;
*子类的覆盖方法不能抛出比父类更多的异常;
一般都让子类的覆盖方法的声明形式和父类的覆盖方法完全相同(一般让方法体或返回方式内容有所不同),
并添加Override标注。
当直接通过子类对象来调用这种被覆盖的后的方法时,真实的调用到的是子类自己重新定义的方法,永远不会是
调用到父类中的这个方法。如果在子类中还想调用父类中被覆盖的的方法,则需要用到super来显式调用。
/*类方法的隐藏实例*/ public class HideStaticMethodTest{ public static void main(String[] args) { //使用对象变量的调用父子类中的同名的类方法————建议使用类名来调用 //使用对象变量调用的是对象变量声明的类型(ClassA)中的类方法 ClassA a2=new ClassB(); //上面的代码怎么使用的来着?使用规则如何?父类名 引用对象=new 子类名(); a2.staticMethod(); } } class ClassA{ public static void staticMethod(){ System.out.println("ClassA.test方法"); } } class ClassB extends ClassA{ //声明了一个与父类同名的方法 public static void staticMethod(){ System.out.println("ClassB.test方法"); } } /**运行结果: *ClassA.test方法 */
//对于运行结果有点不理解?还有类方法指是什么?