面向对象程序设计(OOP)三大特性之继承篇


面向对象程序设计(OOP)三大特性之封装篇
面向对象程序设计(OOP)三大特性之多态篇

前言

“I will be there in 5 minutes. If not, read this again.” 我5分钟后到,如果没到,请再读一遍此短信。——程序员的日常

一、继承

自从听完上一节课,小黑和小胖对Java面向对象技术有了进一步的了解。他们两个人下课之后一起深入讨论了如何返回一个可变对象的引用的问题。

得出的结论是:可以先对原始对象进行克隆(clone),对象clone是指存放在另一个位置上的对象副本。
在这里插入图片描述

课室里面很吵,今天是湖人队vs篮网队的比赛,同学们都非常的兴奋,有各自喜欢的球队。当看到进球的时候,欢呼声叫喊声吐槽声交织着响遍了整个课室。这时穿着格子衬衫的詹姆斯·高斯林 (James Gosling)教授往上推了一下眼镜走进课室,同学们渐渐安静了下来…

小黑和小胖又一次坐在了前排,不过这次他们旁边多了一位蓝眼睛很漂亮的小姐姐。散发着迷人的香味…

高斯林教授:今天呢,我要讲的内容是面向对象程序设计的第二大特性—继承(inheritance),有谁可以说一下什么是继承吗?

小黑自告奋勇:继承可以理解为,年迈的父母将百万身家留给自己的子女,让他们过上更好的生活,或者是把家业交给子女们去经营管理。子女从父母那里得到的东西的过程,就叫继承。

小胖补充道:我觉得还可以是子女从父母身上获得一定的天赋,并拥有自己独有的一些能力。比如篮网队11号球员欧文,从小在父亲那里继承了篮球的天赋,拥有很好的球商,并且通过自己的努力在技巧上达到了人球合一的境界。
在这里插入图片描述

高斯林教授:你们说得很好啊,生动而贴切。在OOP中,所谓的继承,是指类之间的关系,在这种关系中,一个类共享了一个或多个其他类定义的结构和行为。继承描述了类之间的 “is - a” 的关系。子类可以对基类的行为进行扩展、覆盖、重定义。子类可以替换父类出现在父类能够出现的任何地方。

二、简单举例

一个Animal类(超类)

代码如下(示例):

public class Animal{
    
    
	private int age;
	private String name;
	
	public Animal(int age, String name,) {
    
    
		this.age= age;
		this.name= name;
	}
	// 吃饭
	public void eat() {
    
    
		System.out.println(name + " 正在吃饭")}
	
	// 睡觉
	public void sleep() {
    
    
		System.out.println(name + " 正在睡觉")}
}

一个Dog类继承Animal类
代码如下(示例):

public class Dog extends Animal{
    
    
	private int age;
	private String name;
	
	public Dog(int age, String name) {
    
    
		this.age= age;
		this.name= name;
	}
	// 看门口
	public void watchDoor() {
    
    
		System.out.println(name + "正在看门口");
	}
}

一个Cat类继承Animal类
代码如下(示例):

public class Cat extends Animal {
    
    
	private int age;
	private String name;
	
	public Cat(int age, String name) {
    
    
		this.age= age;
		this.name= name;
	}
	// 捉老鼠
	public void catchMouse() {
    
    
		System.out.println(name + "正在捉老鼠");
	}
}

由于继承是(is a)的关系,那么我们就可以很好的理解,狗是一个动物,猫也是一个动物。并且子类Dog和Cat都从父类Animal那里继承了eat()和sleep()方法,除此之外 ,还拥有各自独有的方法。继承关系的关键字是:extends,子类可以通过super关键字访问父类的方法。

注意:子类的构造器不能访问超类的私有域,必须通过父类的构造器对这部分私有域进行初始化,可以用super调用超类的构造器,必须写在子类构造器的第一条语句。


继承的优点:
1、比较容易实现,提高了代码的可复用性和可扩展性。
2、在子类中,可以增加域、方法或覆盖超类的方法,但是不能删除任何继承的域和方法,一般子类比超类拥有的功能更加丰富;
3、继承是多态的前提;
4;继承解决的问题是:共性抽取。将通用的方法放在超类中,而将具有特殊用途的方法放在子类中。

继承的缺点:
1、继承是侵入性的。打破了封装,因为超类向子类暴露了实现细节;
2、增加了类之间的耦合关系。当超类的常量、变量和方法被修改时,需要考虑子类的修改,有时候修改需要重构;
3、缺乏灵活性和稳定性。子类的自由空间受到超类的约束

只有当下列条件满足时才考虑使用继承:
*子类是一种特殊的类型,而不只是超类的一个角色;
*子类的实例不需要变成另一个类的对象;
*子类扩展,而不是覆盖或者使父类的功能失效(里氏替换原则)。


不知不觉中,课室外的下课铃声响起了,到了干饭的时间啦!比赛进入加时环节...到底哪队会最终带走胜利呢?

在这里插入图片描述

三、小结

对于继承的使用,我们还需要遵循一定的原则,才能更好地实现高内聚、低耦合的设计目标。

猜你喜欢

转载自blog.csdn.net/weixin_48627356/article/details/120931944