2019独角兽企业重金招聘Python工程师标准>>>
继承
java的继承具有单继承的特点,每个子类只有一个直接父类。
继承的特点
java的继承通过extends关键字来实现,实现继承的类被称为子类,被继承的类被称为父类,有时也称为基类,超类。
因为子类是一种特殊的父类,因此父类包含的范围总比子类包含的范围要大,所以可以认为父类是大类,而子类是小类。
java里子类继承父类的语法格式如下:
修饰符 class Subclass extends superclass
{ //类定义部分}
extends关键字在英文中是扩展,不是继承!
public class Fruit
{
public double weight;
public void info()
{
System.out.println("我是一个水果!重"+weight+"g!");
}
}
定义Fruit类的子类Apple:
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调用父类构造器必须出现在子类构造器执行体的第一行。
昨天的终于补完了,又到了晚上了,今天陪我夏玩耍了,在程序和女朋友之间,肯定选女朋友啊,我还没达到那种程序比交女朋友更高级的境界。