在生活中我们往往把许多东西归为一个整体,如球有篮球,足球,高尔夫球等,它们都具有球类共有的属性和方法,对于属性来说如大小,体积,重量等,对于方法亦如此。既然如此,在定义各种球的同时我们难道要重复定义相应的类,而且还要重复编写已有的代码吗??
显然,简洁之美才为我们所推崇。于是,联系生活中的继承关系,类的继承就此诞生。
Java继承的
关键字是extends,格式为:
public
class 类名(子类,超类,派生类) extends 类名(父类,基类) {
}
谈到继承,我们脑海中自然浮现出几个问题:子类继承了父类的哪些属性和方法?能调用哪些属性和方法?实际上,子类继承了父类所有的属性和方法,然而,却不能调用所有的属性和方法。此外,调用也分为两种情形 :
1.当子类和父类在同包下时:默认的,受保护的,公有的属性和方法能被子类的对象以及在子类中调用。
2.当子类和父类不在同一个包下时,若创建的对象不在子类或者父类中时,可调用的属性和方法就只有公有的;如果在子类的{}中,可调用的属性和方法包括公有的和受保护的。
此外谈到继承,我们也会提到“方法重写”这个名词。比如说编写打球的方法与打篮球的方法代码时,就是在进行方法重写。实现方法重写的条件:两者必须要存在继承关系,而且方法的返回值数据类型,方法名,参数个数,参数类型,参数顺序必须要完全一致。不过呢,子类在重写方法时,访问修饰符的范围可以大于或者等于父类方法的访问修饰符。俗话说:“姜还是老的辣,酒还是陈的香!”不过尼,在方法重写这里,你如果惦记这个就out了!
当实现方法重写后,如果你创建的对象是子类的对象,那么会优先调用子类的方法,如果子类没有改方法,才会执行父类中定义的方法。
再讲下一个相关的名词“自动转型”。自动转型有两种格式:
格式一:
父类 对象名;
对象名 = new 子类名(实参,...);
父类 对象名 = new 子类名(实参,...);
格式二:
第三方类中的方法
public void method(父类 对象名){
//调用的方法必须要在父类中存在
}
创建对象
父类 对象名A = new 子类名(实参,...);
子类 对象名B = new 子类名(实参,...);
调用方法
method(对象名A);
method(对象名B);
它的条件也是两者必须有继承关系。可以
发现,使用自动转型,我们能实现多态(由方法
重载,继承,方法重写,自动转型等技术点的组合),减少重复的代码。只是它也存在缺陷,Java在
编译程序时,只会根据对象名的类型,去查找是否存在该方法,如果存在,则通过编译,如果不存在则报错。