继承是面向对象的三大特征之一,也是实现软件复用的重要手段。Java的继承具有单继承的特点,每个之类只有一个父类。
》继承的特点:
Java的类继承通过 extends 关键字来实现,实现继承类的被称为之类,被继承的类被称为父类,有的称其为基类、超类。父类和子类的关系,是一种一般的特殊关系。例如现实当中儿子继承父亲的财产。
》父类
public class Father { public String name; public void show(){ System.out.println("我是父亲,我叫"+this.name); } }
》子类
public class Son extends Father { }
》测试类
public class Test_extend { public static void main(String[] args) { Scanner input =new Scanner(System.in); Son son=new Son(); son.name="小明"; son.show(); } }
结果:
通过上面的例子可以看出子类继承父类的同时,将父类的变量和方法也同时继承了。
如果定义一个Java类时并未显示指定这个类的直接父类,则这个类默认扩展 java.lang.Objec t类。因此,java.lang.Object 类是所有的父类,要么是其直接父类,要么是其间接父类。因此所有的 Java 的对象都可以调用 java.lang.Object 类所定义的实例。
从之类角度来看,子类扩展(extends)了父类;但从父类的角度来看,父类派生(derive)出了子类。也就是说,扩展和派生所描述的是同一个动作,只是观察角度不同而已。
》重写父类的方法
》父类
public class Father { public String name; public void show(){ System.out.println("我是父亲,我"+this.name); } }
》子类
public class Son extends Father { public void show(){ System.out.println("我是子亲,我叫"+this.name); } }
子类包含于父类同名的方法的现象被称为方法重写(Override),也被称为方法覆盖。可以说是子类重写了父类的方法,也可以说子类覆盖了父类的方法。
方法的重写要遵循 “两同两小一大” 规则,“两同” 即方法名相同、形参列表相同;“两小” 指的是子类方法的返回值类型应比父类的返回值类型更小或相等,子类方法声明抛出的异常类比父类方法声明抛出的异常类更小或相等;“一大” 指的是子类方法的访问权限应比父类方法的访问权限更大或相等。
当子类覆盖了父类方法后,子类的对象将无法调用父类中被覆盖的方法,但可以在子类方法中调用父类中被覆盖的方法。如果需要在子类方法中调用覆盖的父类方法,则可以使用super(被覆盖的实例方法)或者父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。
public class Son extends Father { @Override public void show() { super.show(); //调用父类方法 } }
如果父类方法是被 private 修饰的,则该方法对其子类是隐藏的,因此其子类无法访问该方法,也就是无法重写该方法。如果子类中定义了一个与父类 private 方法具有相同的方法名、相同的形参列表、相同的返回值类型的方法,依然不是重写,只是在子类重新定义了一个新的方法。