继承java
java的继承具备单继承的特色,每一个子类只有一个直接父类。ide
继承的特色ui
java的继承经过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有时也称为基类,超类。this
由于子类是一种特殊的父类,所以父类包含的范围总比子类包含的范围要大,因此能够认为父类是大类,而子类是小类。code
java里子类继承父类的语法格式以下:对象
修饰符 class Subclass extends superclass继承
{ //类定义部分}it
extends关键字在英文中是扩展,不是继承!编译
public class Fruit { public double weight; public void info() { System.out.println("我是一个水果!重"+weight+"g!"); } }
定义Fruit类的子类Apple:class
public class Apple extends Fruit { public static void main (String[]args) { //建立Apple对象 Apple a=new Apple(); //Apple 对象自己没有weight Field /由于Apple的父类有weight Field,也能够访问Apple对象的Field a.weight = 56; //调用Apple对象的info方法 a.info(); } }
java中只有一个直接父类,能够有多个间接父类。
重写父类方法
通常子类老是以父类为基础,额外增长新的Field和方法。可是:子类须要重写父类的方法。
方法重写要遵循”两同两小一大“原则,“两同”即方法名相同,形参列表相同;“两小”指的是子类方法返回值类型应该比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是子类方法的访问权限应该比父类方法的访问权限更大或相等。
若是须要在子类方法中调用父类中被覆盖的方法,则能够使用super(被覆盖的是实例方法)或者父类类名(被覆盖的是类方法)做为调用者来调用父类中被覆盖的方法。
super限定
经过super限定来调用父类被覆盖的实例方法。
方法重载和方法重写在英文中分别是overload和override,重载主要是发生在同一个类的多个同名方法之间,而重写发生在子类和父类的同名方法之间。
若是子类定义了和父类同名的Field,则会发生子类Field隐藏父类Field的情形。在正常状况下,子类里定义的方法直接访问该Field默认会访问到子类中定义的Field,没法访问到父类中被隐藏的Filed。在子类定义的实例方法中能够经过super来访问父类中被隐藏的Field。若是在子类里定义了与父类中已有变量同名的变量,那么子类中定义的变量会隐藏父类中定义的变量。由于子类中定义与父类中同名的实例变量并不会彻底覆盖父类中定义的实例变量,它只是简单地隐藏了父类中的实例变量。因此会出现以下特殊的情形。
class Parent { public String tag = "疯狂java讲义"; } class Derived extends Parent { //定义一个私有的tag实例变量来隐藏父类的tag实例变量 private String tag = "轻量级javaee企业应用实战"; } public class HideTest { public static void main(String[] args) { Derived d = new Derived(); //程序不可访问d的私有变量tag,因此在下面语句将引发编译错误 //System.out.println(d.tag); //将d变量显式地向上转型为Parent后,便可访问tag实例变量 //程序将输出:“疯狂java讲义” System.out.println(((Parent)d).tag); } }
(很晚了,要休息了,明天还要工做,就先写这么多,今天很开心,我夏找我呢)
调用父类的构造器
子类不会得到父类的构造器,但子类构造器里能够调用父类构造器的初始化代码。
在一个构造器中调用另外一个重载的构造器使用this调用来完成,在子类构造器中调用父类构造器使用super调用来完成。使用super调用父类构造器必须出如今子类构造器执行体的第一行。
昨天的终于补完了,又到了晚上了,今天陪我夏玩耍了,在程序和女友之间,确定选女友啊,我还没达到那种程序比交女友更高级的境界。