Java面向对象【基本特征之继承】

前言

它描述的是一种类与类之间的关系。

子类通过继承机制自动拥有来自于父类的属性和行为,无需重新定义一次。

目录

前言

语法

一、父类的哪些内容会被继承?

二、超类/基类

三、单继承

四、继承的内存模型

五、super关键字

this 和 super的对比

——   this() 与 super()

——   this. 与 super.

六、方法重写

七、根类Object

八、final关键字 


语法

在Java当中要想实现继承也很简单,使用extends关键字即可。

extends这个单词的本意其实不是继承,它的本意是扩展。也就是说:子类 extends 父类,描述的是子类在父类的基础上进行扩展。

这就给我们的设计带来了一个考量的分界线。书写父类的时候,我们的关注点是共有的内容;设计子类的时候,我们的关注点是这个子类特有的内容。这是一种思想的分离,让我们能够更加的专注。
public class Son extends Father{
}

继承就是让子类自动具备父类的属性和行为,从而达到代码的复用性

注意:不是只要分析出具备相同属性行为,我们就去做继承。必须要具备类与类之间有is-a关系,我们才会去做继承。

一、父类的哪些内容会被继承?

1、父类中的属性会被继承

就算是私有属性也会被继承,只是不能被看到而已; 访问修饰符控制的是是否能够被直接看到操作到,而不是是否能被继承。

2、父类中的行为也会被继承,与属性是同样的道理;

3、父类的构造方法不能被子类继承

  • 构造方法的名字必须和类名保持一致;父类的构造方法名字是父类类名;子类构造方法是子类类名。如果构造方法能够被继承,那么说明子类里面有一个构造方法,但名字是父类的,这很明显语法矛盾了;
  • 构造方法的作用是产生对象;父类构造方法产生父类对象,子类构造方法产生子类对象。如果子类通过继承拥有了父类的构造方法,那么说明子类拥有一个产生父类的方法,这很明显伦理不允许。

二、超类/基类

class Animal{

}

class Cat extends Animal{

}

class ChineseRuralCat extends Cat {

}

Animal称为父类、Cat 称为子类;

Animal称为超类或者基类,Cat 和ChineseRuralCat 都是它的派生类

如果需要画图表示类的关系,那么Animal ← Cat ← ChineseRuralCat ,注意箭头的方向永远指向父类。

不管继承了多少层,派生类都具备超类的属性行为

三、单继承

Java当中每个类能且只能有一个父类 --- 称之为"单继承" ;    
有些编程语言(C++)允许一个类有多个父类 --- 称之为"多继承";

强调:单继承是Java语言的选择设计,有些别的编程语言是支持多继承的。

单继承好 还是 多继承好?

1.各有优劣。

2.多继承的好处是丰富度的增加,子类既有来自于父类A的内容,也有来自于父类B的内容,甚至还有父类C。这样的话,可以让子类具备更高的丰富度。 但是,多继承也会带来关系复杂度的问题。比如,在继承结构上,多继承不可避免的会出现网状结构

3.单继承当中,类与类之间的关系只能形成层次结构清晰树形图。当然,丰富度肯定就被影响了。然后它在语法上选用"接口"的多实现来弥补丰富度。

总结:单继承是Java的选择,为了能够让类与类之间的关系清晰,然后牺牲了丰富度;为了解决这一问题,它又提出接口。

四、继承的内存模型

JVM是采用了一种叫做“内存叠加”的方式,来实现继承关系的。

当我们产生一个子类对象的时候,JVM是分两步走:

1、首先调用父类的构造方法,产生一个父类对象部分;

2、然后再调用子类构造,在上一步的父类对象部分之下

叠加上子类特有部分的内容,从而形成一个完整的子类对象。

注意: 1、每次new子类只产生了一个子类对象,而不是一个父类对象和一个子类对象;


五、super关键字

在默认的情况下,子类会自动调用的是父类的无参构造;

解决方案:养成书写公共无参构造的习惯;这本身也是JavaBean的规范。

如果一定要去调用某个带参构造,那么我们就要学会使用另一个关键字了:super

super,大家可以看成是和this成对的。this有this.和this()两种用法,super也有super.和super()两种用法。其中,super()就是专门写在子类的构造方法里面,明确表示调用父类的哪一个构造。同样是通过形参与实参的匹配关系。 super()与this()一样,都只能写在构造方法里面,且只能是第一句。

this 和 super的对比

——   this() 与 super()

作用不同

  • this() 的作用,在本类的构造方法当中,调用本类的其它构造;
  • super()的作用;传参时在子类构造方法当中调用父类指定构造,不传参数时调用的是父类的无参构造

书写位置相同

  • this()只能写在一个类的构造方法里面,且只能是第一句;
  • super()只能写在一个类的构造方法里面,且也只能是第一句。 所以两者不能共存

默认的情况:

  • 一个构造方法里面如果不写this(),那么是没有默认的,即它不会主动自己去调用本类的另一个构造。
  • 一个构造方法里面如果不写super(),那么是有默认的,即它一定会自己去调用父类的无参构造

——   this. 与 super.

作用

this.是书写在一个类的内部代码块当中,用来调用当前对象属性行为的;

含义是:当前对象,即“我”;

*this.能够看到本类自己定义的,也能够看到从父类继承而来的(但要受访问修饰符限制。) 

super.也是书写在一个类的内部代码块当中,用来调用当前对象父类那里继承而来的属性或行为的;

含义是:当前对象的父类对象部分;注意:super.也要受访问修饰符的限制。

*super.只能看到从父类继承而来的(但是要受访问修饰符限制)

结论

1、this. 能看到的 super.不一定能看到;

2、super. 能看到的 this.一定能看到。

3、所以我们通常都是使用this.

4、只有一种情况下,我们会使用super.,那就是调用重写方法的时候。

用this.调用的是子类重写后的方法,用super.调用的是子类重写前的方法

六、方法重写

概念:

当子类拥有父类的某个行为,但实现是子类特有的,那么我们应该把这个行为首先在父类中定义,然后让子类重新实现一次,这种方式就称为“方法的重写”---Override
重写以后,并不是说子类拥有了两个同名方法,而是仍然只有一个。

子类从父类那里继承了一个方法,然后把这个方法给重新实现了。

重写的要求

1、方法名不能变;

2、参数列表不能变

3、返回类型不能变;

4、访问修饰符可以变大

重写 与 重载

重载是指:在一个类当中拥有多个同名方法参数列表不同

重写是指:子类把从父类那里继承而来的方法重新实现了,要求方法名不变,参数列表不变,返回类型不变,访问修饰符不变或变大。

简单的举个例:

重载:学生写文章 ;别人给了他铅笔,他就用铅笔写,给他钢笔就用钢笔写

(这里学生就是学生类;写文章就是个行为方法;铅笔钢笔就是外部参数)

重写:人写文章;网络作家用电脑键盘书写,作家用钢笔写,小学生用铅笔写

(这里的人相当于父类,子类就是网络作家、作家、小学生;行为是写文章;不同的子类有自己特有的内容)

七、根类Object

一个类不写extends的语法,那么这个类也会有默认的父类 ----- Object

意义:
Object类是Java设计者给所有类(包括数组)设计的“根类”。
它当中的方法非常重要,都是设计者认为只要是引用类型就应该具有的行为,所以这些方法具有最大的共用性

八、final关键字 

final关键字修饰的含义就是“最终的”、“不变的”

1、final修饰变量,该变量不能变,成为常量
     语法:final int MAX = 1000;

2、final修饰方法(不包括构造方法),该方法不能被重写
      语法: public final void test(){.......} 

 3、final修饰,表示这个类不能被继承。这样的类叫做“终态类”、“最终类”;
      语法: public final class 类名{........}

4、final不能修饰构造方法 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BroRiver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值