什么是Java中的继承,在解释这个问题之前。我们不妨先从生活中的继承来入手,相信大家都应该还记得许君聪在电影妖铃铃里的一段台词:我,从小父母双亡,家徒四壁,除了成功别无选择。你呢?你回了老家能干啥?除了继承你家的那个养猪场,你爸的几套房子几辆车和五十亩地之外,你说你还有啥?你还是个啥?
这段台词可谓将继承完完整整的诠释了。没错,在生活中,所谓的继承,就是指子承父业。回归我们的Java,在Java中的继承从定义上来讲即是:
继承是 面向对象软件技术当中的一个概念,与 多态、 封装共为 面向对象的三个基本特征。继承可以使得子类具有父类的 属性和 方法或者重新定义、追加属性和方法等。
简单的来说,继承是描述两个类的一种关系。在这种关系中被继承的类叫做父类(或者基类,超类),而继承父类的类叫做子类。当一个类去继承另外一个类时,那么这个子类就可以去访问父类的属性(成员变量)和方法。需要注意的是,继承关系中,子类访问父类的属性和方法不包括被private所修饰的属性或方法(属性可以通过getter和setter方法来取值或者赋值,但方法就彻底无法访问)。继承的关键字是extends,下面我们来看一下在代码中,继承所表现的语法格式:
class Animal{
private String name;//动物的名字
//有参构造
public Animal(String name) {
this.name = name;
}
//无参构造
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void shout() {
System.out.println("动物会叫......");
}
}
class Dog extends Animal{
}
public class Demo2 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大黄");
System.out.println(dog.getName());
dog.shout();
}
}
执行结果
可以看到,在该段代码中,我定义了一个Animal类,并定义了一个name属性,补全了构造方法和getter和setter方法。而在继承这个类的子类Dog类中,没有定义任何内容。当我在main主函数中new了一个Dog类,去调用这些属性和方法时,仍然有执行结果。这就是一个简单的继承案例。
说完了Java继承的表现形式,再来说说Java中为什么要使用继承?
首先在不使用Java继承的情况下,以上边的Animal案例为例,如果我们现在要创建三个对象,狗,猫,猪。那我们就需要分别构建三个不同的类,然后在每个类中分别定义这些不同动物的属性,和各自的行为。但是,这些动物的某些属性或者行为是相同的。例如,三种动物都有名字,体重。都需要吃东西,都需要睡觉,都可以跑。但是由于不使用继承,所以我们不得不在每个类中重复的定义这些属性和方法。这造成了大量的重复工作。假如我们使用继承,则完全可以将这些动物们的所有共同的属性和行为进行抽调,单独写一个Animal类,当有一个类继承这个Animal类时,就可以通过继承的特性,而不必在自己的类中定义这些共有的属性和方法。对于动物不同的行为和属性,我们可以在继承的子类中添加这些比父类多的属性和方法;下边看一个案例:
package com.lzl.day011.task;
class Animal{
private String name;//动物的名字
//有参构造
public Animal(String name) {
this.name = name;
}
//无参构造
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void shout() {
System.out.println("动物会叫......");
}
}
class Dog extends Animal{
private String hoby;//喜好
public Dog(String name, String hoby) {
super(name);
this.hoby = hoby;
}
public Dog(String name) {
super(name);
}
public Dog() {
}
public String getHoby() {
return hoby;
}
public void setHoby(String hoby) {
this.hoby = hoby;
}
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
public class Demo2 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("大黄");
dog.setHoby("啃骨头");
System.out.println(dog.getName());
System.out.println(dog.getHoby());
dog.shout();
}
}
执行结果
在上述代码中,我在Dog类中重写了父类的shout方法,就表现为Dog类有自己的异于父类的行为,但是我不需要自己定义这个方法,只需要对父类的方法直接进行继承,然后加以改造(方法重写)就可以更准确的描述Dog类。同样在Dog类中定义了一个hoby的变量,这个变量就表示了Dog在父类的基础上多出来的属于自己独有的属性。按照这样的流程。我们同样可以定义猫类,猪类,等等。通过Java的继承可以大量的对代码进行复用,减少编程人员的工作量。
接下来谈谈Java中继承的注意事项。首先,Java是不支持多类继承的,也就是说,一个类只能继承一个类,一个类也只能被一个类继承。但是,Java支持多重继承,即,假设有A,B,C三个类,B继承A,C又继承了B,那么,C类中完全可以使用A类的属性和方法,这就是多重继承。下边看一下代码:
package com.lzl.day011.task;
class Animal{
private String name;//动物的名字
//有参构造
public Animal(String name) {
this.name = name;
}
//无参构造
public Animal() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void shout() {
System.out.println("动物会叫......");
}
}
class Dog extends Animal{
private String hoby;//喜好
public Dog(String name, String hoby) {
super(name);
this.hoby = hoby;
}
public Dog(String name) {
super(name);
}
public Dog() {
}
public String getHoby() {
return hoby;
}
public void setHoby(String hoby) {
this.hoby = hoby;
}
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
class SpotDog extends Dog{
private String characteristic;//特征
public SpotDog(String name, String hoby, String characteristic) {
super(name, hoby);
this.characteristic = characteristic;
}
public SpotDog() {
}
public String getCharacteristic() {
return characteristic;
}
public void setCharacteristic(String characteristic) {
this.characteristic = characteristic;
}
}
public class Demo2 {
public static void main(String[] args) {
SpotDog spotDog = new SpotDog();
spotDog.setName("花花");
spotDog.setHoby("摇尾巴");
spotDog.setCharacteristic("白毛带有黑色的斑点");
System.out.println(spotDog.getName());
System.out.println(spotDog.getHoby());
System.out.println(spotDog.getCharacteristic());
spotDog.shout();
}
}
在本段代码中,我们给Dog又创建了一个子类SpotDog,可以看到,通过SpotDog我们仍然可以访问到Animal的属性,这就是多重继承。以后不管有多少种狗的种类,都可以去继承Dog类来减少代码量的编写。
使用多重继承就弥补了单一继承的局限性。
至此,Java继承告一段落