面向对象的四大特性之继承

背景:出现继承概念之前的故事
下面是两个类
企鹅类:
public class Penguin {
private String name;
private int id;
public Penguin(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+“正在吃”);
}
public void sleep(){
System.out.println(name+“正在睡”);
}
public void introduction() {
System.out.println(“大家好!我是” + id + “号” + name + “.”);
}
}
老鼠类:
public class Mouse {
private String name;
private int id;
public Mouse(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+“正在吃”);
}
public void sleep(){
System.out.println(name+“正在睡”);
}
public void introduction() {
System.out.println(“大家好!我是” + id + “号” + name + “.”);
}
}
冲突:从上面两个类中,我们可以看到每个类中都会有相同的属性和方法,于是我们就可以想一下,既然多个类中的属性和方法都是相同的,那么为什么不能有简化一下,有一个机制来将多个类之间的属性和方法抽取出来作为一个公共的类,避免代码的重复使用呢?
疑问:如何解决这个问题
回答:继承
如何实现继承呢?
这个继承的概念其实也很好理解,就像儿子的身上多多少少会存在父亲身上的影子,比如五官、身高以及行为,但同样也会有不一样的地方,比如新的爱好,在我们程序中则用“继承”来体现父子之间的这些特征,在"继承"这一概念中,会涉及到两个对象:父类、子类
父类:将多个类中中相同的部分提取出来的类
子类:通过继承的概念可以重复使用父类的属性和方法

继承:将所有子类共有的属性和方法定义在父类中,其子类通过继承获得这些属性和方法,实现代码的复用
例如下面是接入继承概念后的代码
公共父类:
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
name = myName;
id = myid;
}
public void eat(){
System.out.println(name+“正在吃”);
}
public void sleep(){
System.out.println(name+“正在睡”);
}
public void introduction() {
System.out.println(“大家好!我是” + id + “号” + name + “.”);
}
}
企鹅类:
public class Penguin extends Animal {
public Penguin(String myName, int myid) {
super(myName, myid);
}
}
老鼠类:
public class Mouse extends Animal {
public Mouse(String myName, int myid) {
super(myName, myid);
}
}

其中子类继承父类的方式是采用extends关键字来实现子类继承父类的功能

Java中继承的实现, 关键字: extends
语法: 访问修饰符 类名 extends 父类{}

继承的类型如下:
①Java 不支持多继承
解释说明:这里的多继承指的是一个子类不能继承多个父类
②支持多重继承、单继承、不同子类继承同一个父类
解释说明:这里的多重继承指的是爷爷、父亲、儿子之间的继承
继承的性质如下:
①子类不能继承父类中修饰符为private的属性和方法
②子类中可以拓展父类中没有的属性和方法,比如儿子可以培养一个自己的行为习惯
③如果一个类中没有使用关键字extends来继承父类,那么则默认继承Object这个基类

有一个知识点需要单独说明一下:

继承中的构造函数

首先明确一点:构造函数不能被继承
①在子类的构造函数中可以调用父类的构造
语法:在子类的构造函数的第一行,用super(参数列表)调用父类的某个构造
父类代码:
在这里插入图片描述
子类的代码:
在这里插入图片描述
②super的隐式调用
假如构造函数中,没有在第1行写this()或者super(), 此时编译器会添加一个隐式的super();
即调用父类的空参构造。此时假如父类没有空参构造,则会编译报错
在这里插入图片描述
当构造一个类的实例时, 会递归调用父类的构造,直到Object, 例如:
在这里插入图片描述
在这里插入图片描述
以上代码在每个类的构造函数中都会添加一个隐式的super();调用父类的构造

综上所述:本文所讲解的内容如下
①通过extends关键字来实现子类和父类之间的继承关系
②子类只能继承一个父类,即单继承,不能多继承
③子类可以多重继承,多个子类可以继承一个父类
④子类拥有父类公共特性的属性和方法
⑤父类的构造函数不能被继承,但可以被子类调用
⑥子类调用父类的构造方法是在子类的构造方法中的第一行使用super(构造参数列表)来调用父类的构造函数
⑦子类的构造函数中,如果没有写this或者super(),那么则会默认添加一个默认的隐式super(),表示抵用父类的空参构造函数,此时如果父类没有空参构造函数,则会编译报错

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值