Java学习笔记(继承、接口和泛型)
子类和父类
继承是一种根据已有类创建新类的机制,利用继承可以先创建一个共有属性的一般类,根据一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并且根据需要增加自己新的状态和行为。由继承而得到的类称为子类,被继承的称为父类(超类),父类可以是自己编写的类,也可以是Java类库的类。Java不支持多重继承,即子类只能有一个父类。
在类的声明中,使用关键字extends来声明一个类是另一个类的子类格式如下:
class 子类名 extends 父类名{
…
}
如果一个类的声明中没有使用关键字extends,这个类被系统默认是Object的子类。
子类的继承性
1.继承的定义
子类的成员一部分是子类是自己声明定义的,另一部分是从它的父类继承的。子类继承的成员变量作为自己的一个成员变量,可以被子类中自己声明的任何实例方法操作。子类继承父类的方法作为子类的一个方法,就像是在子类中直接声明的,可以被子类中自己声明的任何实例方法调用。
2.子类和父类在同一包中的继承性
如果子类和父类在一个包中,那么子类自然的继承了其父亲中不是private的成员变量作为自己的成员变量,也自然的继承了父类中不是private方法作为自己的方法,继承的成员变量以及方法的访问权限保持不变。
例:
3.子类和父类不在同一包中的继承性
如果子类和父类不在同一个包中,那么子类继承了父类的protected、public成员变量作为子类的成员变量,并且继承了父类的protected和public方法,继承的成员或方法的访问权限保持不变,但子类不能继承父类友好变量和友好方法。
子类对象的构造过程
当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,如果子类没有明确地指明父类的哪个构造方法,子类就调用父类不带参数的构造方法。
子类创建的对象:1…将子类中声明的成员变量作为子类对象的成员变量 。2.父类的成员变量也都分配内存空间,但只将其中一部分作为子类对象的成员变量。
成员变量隐藏和方法重写
1.成员变量的隐藏
子类可以隐藏继承的成员变量。在子类中定义的成员变量和父类中的成员变量同名,则子类的成员变量隐藏了继承的成员变量,即子类重新定义了这个成员变量。
注意:尽管子类可以隐藏从父类继承的成员变量,但是子类仍然可以通过使用父类继承的方法操作被隐藏的成员变量。例:
2.方法重写
子类可以隐藏已继承的方法,子类可以通过方法重写来隐藏继承的方法。方法重写是指:子类中定义一个方法,并且这个方法的名字、返回类型、参数个数与从父类继承的方法完全相同。如果父类的方法可以被子类继承,子类就有权力重写重写,一般子类重写了父类的方法。如果子类想要使用被隐藏的方法必须使用关键字super。例:
注:方法重写一定要保证方法的名字、类型、参数个数和类型同父类的摸个方法完全相同,只有这样子类继承的这个方法才能完全被隐藏。如果具有相同的名字,但没有保证方法的类型不同,程序就会出现编译错误,如果子类在准备隐藏继承的方法时参数个数或参数类型不尽相同时,子类就会出现方法重载。重写父类的方法时,不可以降低方法的访问权限。
3.访问修饰符protected的进一步说明
一个类A中的protected成员变量和方法可以被它的直接子类和间接子类继承,如B是A的子类,C是B的子类,D是C的子类,那么类B、C、D都继承了A的protected成员变量,如果在另一个类中Other,用类D创建了一个对象object,子类D的protected成员变量和方法如果不是从父类继承来的,对象访问这些protected成员变量和方法时,只有Other与D在同一个包中就可以,如果类D的protected成员变量和方法时从父类继承来的,就要追溯到D的祖先类,如果类A和Other在同一个包中,object对象就能访问继承的protected变量和protected方法。
关键字super
关键字super有两种用法:一种是子类使用super调用父类的构造方法,另一种是子类使用super调用子类隐藏的成员变量和方法。
1.使用super调用父类的构造方法
子类不继承父类的构造方法,因此子类想要继承父类的构造方法,子类就必须在子类的构造方法中使用super切必须使用super来表示,而且super必须是子类构造方法的第一条语句,如果子类的构造方法没有明显的指明使用父类的哪个构造方法,子类会默认继承父类