Java学习之继承详解

什么是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继承告一段落

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值