【Java】面向对象的特征之一:继承

目录

二、继承

1.为什么要继承?

2.什么是继承?

3.如何进行继承?

1.继承格式

2.子类访问父类

1.子类访问父类中的成员变量

子类和父类不存在同名成员变量

子类和父类存在同名成员变量

2.子类访问父类中的成员方法 

子类和父类成员方法名不同

子类和父类成员方法名相同

1.参数相同 ​编辑

2.参数不同

4.super关键字

super关键字的作用:在子类方法中访问父类成员

如何使用super关键字?

在子类成员变量中使用:

在子类成员方法中使用:

super与this

相同点:

不同点: 

5.子类构造方法

 子类构造方法: 

​编辑 构造方法顺序:

代码块执行顺序

6.protect关键字

7.继承方式 

 8.final关键字

什么是final关键字?

final关键字的作用有哪些? 

1.修饰变量:将变量变成常量,其值不能被修改

2.修饰类:可以染这个类不被其他类继承,此时这个类叫做密封类

3. 修饰方法:表示该方法不能被重写

9.继承与组合


二、继承

1.为什么要继承?

我们先写两个类,猫类和狗类,以及Test对他们进行实例化。

我们发现猫类和狗类有很多共性,那我们能否将这些共性进行抽取 ?

于是有了继承的概念,用来进行共性的抽取和代码的复用

2.什么是继承?

继承主要解决的问题就是:共性的抽取,实现代码的复用 

我们将猫和狗的共性进行抽取,然后采用共性的思想达到共用 

由上图可知,Dog和Cat继承Animal,Animal类称为父类/基类/超类,Dog和Cat称为子类/派生类,继承后,子类可以复用父类中的成员变量或成员方法。

3.如何进行继承?

1.继承格式

修饰符 class 子类 extends 父类{

         ........

}

继承之后,子类当中会隐含父类中的成员 

  • 继承后,子类会继承父类中的成员变量和成员方法;
  • 如果子类和父类成员变量和成员方法都相同,那将毫无意义;

2.子类访问父类

1.子类访问父类中的成员变量
子类和父类不存在同名成员变量

子类和父类存在同名成员变量

  • 如果子类和父类出现相同的成员变量,优先访问子类中的变量 
2.子类访问父类中的成员方法 
子类和父类成员方法名不同

子类和父类成员方法名相同
1.参数相同 
  • 子类和父类的成法名相同时,参数也相同(重写),遵循就近原则,子类优先;
2.参数不同

  • 子类和父类成员方法名相同,参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问 ;

但是如果我想在子类和父类成员变量名或成员方法中访问父类,那又应该怎么办?

4.super关键字

super关键字的作用:在子类方法中访问父类成员

super只能指代当前的父类,不能指代父类的父类,甚至继续往上指代

如何使用super关键字?

通过 super. 来访问父类中的成员

在子类成员变量中使用:

在子类成员方法中使用:

super与this

相同点:
  1. 都是java关键字;
  2. 可以在成员方法和成员变量中使用;
  3. 只能在类的非静态中使用;
  4. 都可以调用构造方法,在调用时,必须是构造方法中的第一条语句
不同点: 
  1. this表示的是当前对象的引用,而super表示子类从父类继承下来部分成员的引用;
  2. 在非静态成员放方法中,this用来访问当前类的方法和属性,super用来访问从父类继承下来的成员方法和属性;
  3. 在构造方法中,this()用来调用当前类的构造方法,super()用来调用父类构造方法,两种调用方法不能同时出现在构造方法中;
  4. 构造方法中一定会存在super()的调用,即使用户没有写编译器也会增加,但是this()不写就没有;

5.子类构造方法

  • 在父类中使用构造方法的时候,在子类中也要提供构造方法,否则报错 

为什么会出现这样的情况?

父子父子就是先有父再有子,我们要先帮助父类进行初始化。我对父类使用构造方法就是初始化了?我初始化了什么?他初始化的名字,年龄,颜色又是多少?我们都不知道,所以我们要通过子类帮助父类来进行初始化。当子类 继承父类之后,子类需要显示调用父类的构造方法,先帮助父类进行初始化。

  • 由上图可以知道,子类中的值会传到父类的构造方法中进行初始化 

 子类构造方法: 

 构造方法顺序:

  • 由上图可以知道,构造方法的构造顺序是,先构造父类,在构造子类中的构造方法。

注意:

  1. 如果用户没有写构造方法的时候,编译器会默认提供一个构造方法;如果写了编译器将不会提供构造方法;
  2. 在子类构造方法中,super()必须是子类构造方法中的第一条语句;
  3. this()和super()必须都在第一行,所以两者在构造方法中不能同时出现。 

代码块执行顺序

  • 代码块的执行顺序:
  1. 先执行父类和子类的静态代码块;
  2. 在执行父类的实例化代码块和构造方法;
  3. 最后再执行子类的实例化代码块和构造方法 。
  • 静态代码块只执行一次,第二次实例化对象是,子类和父类的静态代码块不会在执行。 

6.protect关键字

 在封装中我们也有提到四种访问限定符,protected就是其中一种访问限定符,访问限定符就是限定:类或者类中成员能否在类外或者其他包中被访问

protected的作用就是:同一个包底下的类都可以访问,但是不同包下的只有子类才能使用

7.继承方式 

 

继承方式还有一种多继承,比如猫继承狗的同时继承动物,也就是有两个父类甚至更多,这种继承方式在Java中并不支持,所以会用到接口

在多层继承中一般不超过三层的继承关系

 8.final关键字

什么是final关键字?

final关键字:用来修饰变量、成员方法以及类

final关键字的作用有哪些? 

1.修饰变量:将变量变成常量,其值不能被修改

2.修饰类:可以染这个类不被其他类继承,此时这个类叫做密封类

3. 修饰方法:表示该方法不能被重写

9.继承与组合

什么是组合?

组合:与继承相似,也是一种表达类之间的关系,也是能够达到代码重用的效果。没有涉及到extends这样的关键字,仅仅是将一个类的实例作为另一个类的字段。

  • 继承表示对象之间的关系是is—a,比如猫是动物....
  • 组合表示对象之间的关系是has—a, 比如钱包里面有钱,口红....

代码示例:钱包里面有钱、口红

public class Money {
}
public class Paper {
}
public class Wallet {
    public Money money=new Money();
    public Paper paper=new Paper();
}

继承和组合都可以实现代码复用,根据不同情况进行选择,建议:能使用组合用组合 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值