目录
1.类的继承概念
类的继承就是子类继承父类的属性和方法,使得子类具有与父类相同的属性和方法。
举一个生活中的例子就是:汽车属于一个类,汽车品牌奥迪、奔驰就属于其子类,其具有汽车的一般特性,但二者在性能上也有一定的差别。所以子类会具有父类的一般特性,也会具有其自身的特性。
2.类的继承格式
在Java中通过extends关键字可以生命一个类是从另一个类继承而来的,形式如下:
class 父类{
}
class 子类 extends 父类{
}
3.作用
为什么需要继承类呢?接下来我们举一个例子来说明:
比如说,有一个电脑类,其中有两种品牌联想和惠普,要求如下:
联想 属性:品牌名 方法:游戏
惠普 属性:品牌名 方法:游戏
代码示例如下:
联想类:
public class Legend {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void game() {
System.out.println(name+"可以游戏");
}
}
惠普类:
public class Hp {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void game() {
System.out.println(name+"可以游戏");
}
}
从这两段代码可以看出来,代码重复了,这样会导致代码量大且繁琐,后期对代码的维护不方便,要解决这个问题就需要用到继承,就是将两端代码中相同的部分提取出来组成一个父类。
公共父类代码:
public class Computer {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void game() {
System.out.println(name+"可以游戏");
}
}
这样Computer就可以作为一个父类,用联想类和惠普类继承这个类之后,就具有父类当中的属性和方法,代码更加简洁。继承之后的代码:
联想类:
public class Legend extends Computer{
}
惠普类:
public class Hp extends Computer{
}
此时两段代码中没有内容,但在主函数中使用Legend的类创建对象,发现其拥有父类中的属性和方法。注:(同包下)子类会继承父类中的所有属性和方法,但私有属性和方法不能直接使用。
public class Manage {
public static void main(String[] args) {
Legend le = new Legend();
le.setName("联想");
le.game();
}
}
运行结果如下:
注:Java不支持多继承,即一个子类不可以同时继承两个父类,但支持多层次继承,简单来说,子类可以拥有父类,其父类也可以拥有父类。
4.方法重写
由于子类在拥有父类共性的同时也拥有部分独有的属性和方法,因此有时需要对父类中的方法进行改造,这就叫做方法重写。
方法重写的条件:1.必须是两个有继承关系类之间才能进行方法重写 2.返回值类型,方法名,参数类型(个数、顺序)完全一样。
例如:在Legend类里重写其父类(Computer类)的 public void game 方法:
public class Legend extends Computer{
public void game() {
System.out.println("子类重写父类方法");
}
}
重写后,执行结果如下:
注:子类方法重写时,访问修饰符访问权限要大于或等于父类。
(访问修饰符共有四种,分别为:public(公用的)private(私有的)protected(受保护的) 缺省的:返回类型前什么都不写就是缺省的返回修饰符。根据测试访问修饰符权限大小分别为:public>protected>缺省的>private)
方法重写时,如果需要保留父类的功能,在父类原有功能的基础上再增加新的功能,此时需要在重写的方法中调用父类的方法。调用父类方法的关键字super ,其表示当前类的父类对象。
示例代码如下:
public class Legend extends Computer{
protected void game() {
super.game();
System.out.println("子类重写父类方法");
}
}
执行结果为:
5.自动转型(向上转型)
自动转型的形式:在 B extends A 的情况西 可以使用 A a = new B();的方法创建对象。
例:Comeputer le = new Legend();当创建子类对象时,你创建的对象被保存在父类中,就是你创建的对象向上转型,转为父类了。示例代码如下:
public class Manage {
public static void main(String[] args) {
Computer le = new Legend();
le.setName("联想");
le.game();
}
}
但当你调用e.game()时,你会发现,其运行时调用的方法仍然为子类中的方法,这是因为它运行时会从父类开始检索是否定义过该方法,如果定义过,会接着在子类中检索是否重写过该方法,如果发现其已经重写,则优先调用子类中的方法。
自动转型带来的问题:自动转型后的对象只能调用子类中重写的方法。在下面的示例中由于work方法是子类Legend中独有的方法,因此le对象在其转型为Computer类之后调用该方法时会报错。
解决这个问题的方法就是强制转型(向下转型)
示例代码如下:
public class Manage {
public static void main(String[] args) {
Computer le = new Legend();
le.setName("联想");
le.game();
Legend leg = (Legend)le;//强制转型
leg.work();//调用work()方法
}
}
进行强制转型后就可以调用work方法,但记住:强制转型的前提是该对象自动转型过。
到这里解释完自动转型的概念,接下来介绍一下其在java中的实际应用场景:比如说有一个学生,他游戏使用的电脑既可以联想也可以是惠普。我们现在创建一个学生类,此时在Student类中,就需要创建两个方法,代码示例如下:当他使用的电脑类型越多,随之创建的方法也越多,但由于其功能相同,代码段也会不断重复。
public class Student {
public void use(Legend name) {
name.game();
}
public void use(Hp name) {
name.game();
}
}
为使代码简化,可以应用自动转型的功能,传入参数的类型使用其父类的类型,当你创建子类对象调用该方法时,该对象会自动转型成为其父类类型,这样当多个子类对象需要调用同一方法时,就可以只写一个方法,而不是多个,从而达到简化代码的目的。
public class Student {
public void use(Computer name) {//传入参数类型使用父类类型
name.game();
}
}
public class Manage {
public static void main(String[] args) {
Legend le = new Legend();
le.setName("联想");
Hp hp = new Hp();
hp.setName("惠普");
Student st = new Student();
st.use(le);//调用该方法时原来为Legend类型的le转型成为Computer类
st.use(hp);//同样的,原Hp类的参数hp转型成为Computer类
}
}
最后补充一个知识:任何一个类,都可以调用一些方法,这是因为java中每个类都会默认继承Object类 。