继承:
现实世界中:通过分析多种类型,然后发现有一些共同特征和共同行为
再将这些种类,归纳为一种新类型
如: 黄色皮肤的人
白色皮肤的人
黑色皮肤的人
|
人
再如: 小狗 --能动,能吃,能睡,能叫(汪汪)
小猫--能动,能吃,能睡,能叫(喵喵)
.......
|
动物
计算机语言中:
先编写父类类型,在编写子类型,然后再有对象。
如: 先编写Animal类型
再编写 Dog类或Cat类型
继承父类的成员变量和方法
再使用数据时,要么创建Dog对象/Cat对象
子类可以从父类中继承一些成员变量,和方法。子类还可以添加自己的
独有成员变量和方法。
子类:也叫派生类
父类:也叫超类,基类
关键字extends,用于继承语法
格式:
public class subClass extends SuperClass{
}
继承中的构造器:
子类不能继承父类的构造器,但是,子类中的构造器可以调用
父类的构造器
语法: super(有参传参);
作用:可以更好的给继承过来的成员变量赋值
PS:子类中的构造器一定会有一个调用了父类的构造器
父类中如果没有无参构造器,子类需要显式调用父类构造器
如果父类中有无参构造器,子类中的构造器可能隐式调用
父类的无参构造器.即:隐藏了super()
super()与this()的区别
相同点:都是调用构造器,而且必须放在首行首句。
不同点:super()是调用父类的构造器
this()是调用本类中其他构造器
继承的传递性:
继承特征有传递特性,B类型继承了A类型的特征,C类型继承了
B类型的特征。C类型也间接继承了A类型的特征
继承的另外一特点:
单继承: 一个子类只能继承一个父类。但是一个父类可以有
多个子类
【
一个源文件中,只能有一个public修饰的类,而且此类必须与文件名一致。
其他类可以不用修饰词
main也需要在public修饰的类中,才能生效。
】
方法的重写(override)
子类可以继承父类的方法,在继承时,我们可以在子类中
编写与父类中的方法名相同,参数列表也相同的方法。这就是
重写。
(1)父子类关系,方法名相同,参数列表相同
(2)返回值类型可以相同,也可以不同
[子类方法的返回值类型必须是父类方法的返回值类型的子类]
父类型的变量可以引用子类型的对象
如:
Animal a = new GoldFish();
Animal类型的变量a引用了子类型GoldFish的对象
符合人类的思维:
这条金鱼是动物
编译期绑定:
在编译过程中,变量只能调出本类型中的方法
在编译期间, 方法静态绑定到变量上
运行期绑定
在运行过程中,真正执行的方法的逻辑与对象的类型有关系。
简单说成:方法在运行期间,动态绑定到对象上。
成员变量的调用与变量的类型有关系(与编译期和运行期无关)
【在创建子类对象时,在内存中会不会产生父类对象??】
【答案1: 会产生,没有父类对象,哪来的子类对象】
【答案2: 不会产生,创建子类对象时,子类对象的成员变量包含两部分:
一部分为从父类中继承过来的
在成员变量前有默认的super.
一部分是自己本类中的
在成员变量前有默认的this.
如果子类中独有的与继承过来的成员变量重名时,必须
显式指定使用super.或者是this.
如果子类中没有与继承过来的成员变量相同名时,我们可以
隐式不写,或者使用super.与this.其中任意一个。
为了避免不必要的麻烦,子类的成员变量尽可能不要与父类的
成员变量同名
】
构造方法重载:
显式调用父类有参构造器:
隐式调用父类有参构造器:
子类继承父类后再加一个成员变量:
父类型的变量引用子类型的对象
变量p有父类Person的方法
没有子类Student另添加的stduy方法
父类有形参,显式调用
父类无形参,显式调用