Course Note: 继承(Inheritance,Is-a Relationship) super,protected关键字

本文介绍了面向对象编程中继承的概念,解释了如何使用继承来抽取共性,并探讨了成员变量的访问规则。文章详细讨论了super关键字的作用,以及在子类构造方法中调用父类构造方法的重要性。此外,还阐述了protected关键字的可见性,以及方法重写(override)的条件和应用场景。

面向对象三大特性: 封装性(Polymorphism),继承性(Inheritance),多态性(Polymorphism)

继承是多态的前提,没有继承就没有多态!

 

继承

继承主要解决:共性抽取

如图,因为讲师类和助教类都有相同属性(姓名和工号),因此将这两个属性抽取出来放在员工类,让讲师类和助教类继承员工类的属性。这样就不用每个类都定义一遍相同的属性(或方法):

 

 

父类:parent class superclass

子类:subclass child class
 

继承的格式

在上面的关系里,因为子类和父类拥有完全相同的属性,子类可以被看成父类(即讲师就是一个员工)。因此关系为 is-a

 

 

定义一个父类:

 

定义子类(extends 意思是说 SubClass is extends of ParentClass)

 

在主class中实例化子类,就可以调用子类从父类那继承的方法

方法被运行:

 

继承关系也被成为 Is-a

这种关系是单向的:子类可以继承调用父类的东西,但父类不可以继承调用子类的东西

在 UML 里用空心箭头Hollow arrows表示

 

在继承关系中成员变量(属性)的访问

 

定义一个父类

 

定义一个子类

 

在主类中运行

 

若在继承关系中出现成员变量同名的情况:

 

访问规则:

1.直接访问

即直接通过子类对象访问成员变量。

(等号左边是谁,就优先谁。没有就向上找)

用上面的例子,在父类和子类里分别添加同名的变量:

 

输出

若子类里没有该属性,就向上到其父类里面找

 

2.间接访问

通过成员方法访问成员变量。

在这种情况下,被调用的方法,只会优先访问该方法所在类里的成员变量

若方法所在类没有该方法所需调用的成员变量,就往父类里找

 

父类.子类的成员变量,局部变量三者重名时的访问

 

 

分别用以下方法访问:

(该方法在子类中)

 

 

super 关键字

It is used to access attributes and methods in the superclass of an
object
与之相比,this关键字就是访问本类或本对象的方法或成员变量。

通常,subclass必须调用superclass的构造方法来初始化参数。

我们通常使用父类的constructor来innitialize对象里从父类继承的部分。

养成习惯在子类的构造方法里添加super()来调用父类构造方法

在继承关系中,构造方法的访问

1.子类构造方法中默认有一个隐藏的"super()"调用。因此调用子类构造方法的时候会先调用父类构造方法

2.子类构造可以通过super关键字调用父类重载构造 通过super(参数)调用父类的有参构造方法

3.super的父类构造调用,必须是子类构造方法的第一个语句。

也不能同时调用两个

4.子类必须调用父类构造方法,不写则自动添加运行super(),写了则用指定的super调用

 

protected 关键字(visibility modifier 可见性修饰符)

所有的方法和变量(包括使用了private关键字的)都会被子类继承,且内存会被分配给他们。

只有public和protected声明的方法和变量能被子类调用,private则不可以。

简单来说protected修饰的方法和变量只能被其子类或子类的子类所访问。

构造方法不能被继承:

 

 

在继承关系中,对于方法的访问

 

与属性一样,子类会继承父类方法。所以子类拥有的方法=子类方法+父类方法

其调用也与属性一样 子类对象. 子类方法

若子类与父类各自拥有的方法重名,优先级和属性一样:创建的对象是谁(即子类对象.方法 这里的子类对象是哪个类),就优先用谁的方法。没有就向上找

即先子类 ,子类没有再找父类。

 

 

在继承关系中,方法的重写override

用途:当子类所继承的方法需要改动时,我们通常就在子类中重写该方法而不是在父类中去更改。

换句话说,在实际环境中,往往一个类以及投入使用,若要改动其方法就会影响正在使用的用户,因此推荐用一个子类对其继承后再在子类里面进行重写。

1.在继承关系中,子类父类各自拥有的方法名称一样,参数列表也一样时

2.同时子类方法的返回值必须小于等于父类方法的返回值范围

此时可以写@override(是一个注解)在方法前,检测是不似乎有效的正确的覆盖重写(比如signature是否写正确)

3. 子类方法的权限必须大于等于父类方法的权限修饰符(public>protected>(default)>privat)(default)不是关键字 是留空的意思

什么时候需要使用重写:

 

主类

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值