java基础4

一、课程说明

1.1课程简介

  • 继承
  • 方法的重写
  • super关键字

1.2你的收获

  • 可理解Java中继承存在的意义
  • 可掌握什么情况下两个类构成继承关系
  • 可掌握方法重写的意义及特点
  • 可理解super关键字存在的意义
  • 可了解Java对继承的支持性

二、需求

2.1具体描述

  • 声明猫类
  1. 属性:昵称、年龄、颜色
  2. 方法:print()//输出所有信息
  3. 编写测试类,创建猫的对象,并调用方法输出猫对象属性信息

  • 声明狗类
  1. 属性:昵称、年龄、颜色
  2. 方法:print()//输出所有信息
  3. 编写测试类,创建狗的对象,并调用方法输出狗对象属性信息

2.2代码实现

 

2.3问题提出

发现以上猫和狗两个类中有相同的属性和方法,而相同的代码理论上只需要写一次就可以了。

但是显然写了2次,结果就是代码存在冗余性,没有让代码得到复用

如何解决呢?则就可以使用继承完成

三、认识继承

3.1.生活中的继承

 

3.1.1动物之间的继承关系

食草动物相对于兔子和羊是父级动物, 兔子和羊相对食草动物是子级动物。

子级动物具备父级动物,通用的属性和行为。

对应食肉动物也是一样的

 

通过这样的一个例子,让我们知道了动物之间是有明确的子父级关系的,并且父级具备子级通用的属性和行为,也可以发现通过这样的子父级关系,让动物之间形成了一种类似于继承的关系。

3.2.Java中的继承

也有明确的子父级关系,并且在父级中存在子级相同的属性和行为,只不过在Java中,不叫做子父级关系,而是叫做子父类关系。

  • 比如:
    1. Animal-Dog、Cat
    2. Person-YaoMing、Kebi

3.2.1继承的由来

  • 为什么要有继承?

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。

 

 

(其中,多个类可以称为子类,单独那一个类称为父类、超类(superclass)或者基类。)

比如说:把上述略去的代码拿过来举列即可

3.2.3语法格式

3.2.3.1父类语法格式

[修饰符] class 父类类名{

编写公共的属性和公共的方法

}

3.2.3.2子类语法格式

[修饰符] class 子类类名 extends 父类类名{

编写独有的属性和独有的方法

}

class Subclass extends SuperClass{ }

3.2.4继承的使用

3.2.4.1需求

    利用继承完成之前所列举的,宠物猫和宠物狗的类的设计,声明动物类 Animal作为父类。

3.2.4.2代码实现

 

 

 

3.2.4.3继承使用后的分析

我们在设计Cat类时,并没有提供任何的属性和方法,但是在测试时,却可以通过Cat对象能够调用对应的属性和方法,这是因为什么呢?就是因为继承的存在,我们只要通过extends关键字继承了Animal类,那么Cat类就继承了Animal的属性和方法

  • Animal类—父类
  • Cat类—子类
  • Cat类  extends(继承) Animal类

从程序的角度理解所谓的继承就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。

3.2.5继承的好处

提高代码的复用性,因为子类Cat中 通过继承不需要写最基本的属性和方法了直接继承过来了,这就是提高代码的复用性。

我们通过继承,可以使多种事物之间形成一种关系体系。

  • 作用:

 继承的出现,更有利于功能的扩展。

 继承的出现让类与类之间产生了关系,提供了多态的前提。

  • 注意:不要仅为了获取其它类中某个功能而去继承

3.3继承的注意事项

  • 父类也叫做超类,也叫做基类superclass,子类也叫做派生类subclass
  • 子类继承父类时,没有继承父类的构造方法
  • 继承要满足的条件:is a(什么什么是什么的一种时)
    1. 比如:猫是动物的一种,狗是动物的一种........
  • 当一个类没有使用extends指定继承哪个父类时,则系统默认继承Object类
  • 在Java中, Object类是所有类的父类也叫做超类
  • 也就是:当继承Object父类时extends Object是可有可无
  • 子类继承了父类,就继承了父类的方法和属性。

 

  • 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,

而是对父类的“扩展”。

  • 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和

方法。

 

3.4 Java对继承的支持性

3.4.1 Java支持单继承

 

3.4.2 Java不支持多继承,但支持多层继承

 

  • 继承有两大特性
    1. 在Java中,类是单根性,一个类只能继承一个直接的父类,也就是:单继承
    2. 传递性

 

 

3.4 继承的随堂练习

(1)定义一个ManKind类,包括

  • 成员变量int sex和int salary;
  • 方法void manOrWoman():根据sex的值显示“man”(sex==1)或者“woman”(sex==0);
  • 方法void employeed():根据salary的值显示“no job”(salary==0)或者“ job”(salary!=0)。

(2)定义类Kids继承ManKind,并包括

  • 成员变量int yearsOld;
  • 方法printAge()打印yearsOld的值。

(3)定义类KidsTest,在类的main方法中实例化Kids的对象someKid,用该对象访问其父类的成员变量及方法。

四、方法的重写

4.1需求

  • 声明动物类
  1. 方法:go()//走路的方法、sound()//叫声的方法、print()//输出属性信息
  2. 编写测试类,创建猫的对象,并调用方法输出猫对象属性信息
  • 声明Cat类
  1. 继承动物类
  2. 编写测试类,创建猫的对象,完成方法的调用

4.2.1代码实现

 

 

 

4.2.2问题抛出

  • 当子类是Dog时,如何更改go()方法和sound()方法,来完成对狗的描述呢?
    1. 父类的go()方法和sound()方法描述的是Cat的,但是现在是Dog作为子类,程序应该随机应变,应该显示的是狗的一些行为。
  • 问题:父类的方法无法满足子类的需求了。

4.2方法重写的认识

4.2.1 方法重写的作用

  • 父类中的方法不能满足子类的需求,则就必须在子类中重写父类的方法。

4.2.2 重写快捷键

  • 光标放在子类中,按Ctrl + O选择要重写父类的方法,然后按回车键
  • 但是方法重写后具体实现功能的代码还需要自己根据需求来完成

4.2.3 重写演示

  • 此处代码略去……

4.2.4 重写本质

  • 就是根据自己的需求,在子类中把父类的方法去给重写一次

4.2.5 重写注意事项与特点

  • 注意事项
    1. 当子类重写父类的方法,再创建子类对象时,调用的是子类重写以后的方法,也就是说:父类中的方法使用不到,但是必须不能删除,原因:删除父类中的方法后,子类也就不能重写,报错。   
  • 特点
  1. 方法重写只能发生在子父类中,方法重写以后,子类中重写的方法,返回值类型,参数名称,参数列表与父类中被重写的方法必须一致。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

4.2.6新增属性和方法

4.2.6.1背景

  • 可根据自己的需求,在子类中新增属性或者方法(父类中没有的)

4.2.6.2新增属性

    比如说给猫新增属性 life代表生命值。

 

 

4.2.6.3新增方法

比如说给猫新增玩的方法 play()

 

 

4.3方法重写的注意事项

 

4.4方法重写的随堂练习

 

4.5方法重载和方法重写的区别  

 

 

  • 访问权限修饰符

5.1 作用

  • 可知道访问权限符存在的意义及各权限符的权限范围

 

 

为什么叫访问权限修饰符呢?

5.2封装的回顾

5.2.1封装作用

适当的封装可以让类的内部信息(属性和方法)更安全,防止该类的数据(属性和方法)被其它类随意访问,封装可被认为是一个保护屏障。

 

5.2.2对属性的封装

  • 将实例变量编写为private,代表实例变量只能在本类中使用,因为private表示私有的。

 

  • 封装就是隐藏类的内部信息(属性和方法),不允许外部程序直接访问,而是通过公有(public)的方法完成(赋值方法get()和取值方法set())。

5.3访问权限修饰符分类

5.3.1 private私有的

5.3.2默认的

5.3.3 protected受保护的

5.3.4 public公共的

5.4访问权限修饰符可修饰的内容

5.4.1修饰类

  • 有两种:公共类和非公共类
  • 如果类前面编写public修饰符,该类称为公共类;可以在任意包中使用该类
  • 如果类前面没有编写public修饰符,该类称为非公共类;只能在当前包中使用

5.4.2修饰成员(属性或者方法)

5.4.2.1 private

  • 权限范围:
    1. private权限符修饰属性或者方法时,仅能在本类中被访问。也就是:除了可以在本类中可以访问的到,在其它的类中是不能访问到被private修饰的属性或者方法的。
    2. 因此得到:private访问权限范围非常的严格。

5.4.2.2 默认地

注意默认地修饰符,修饰成员时,是指成员(属性或者方法)前面不加任何修饰符修饰。

  • 权限范围:
    1. 默认地权限符修饰属性或者方法时,在本类中可以访问到的同时还可以在当前包中的其它类中可以访问到。也就是:在其它包中的任意类下,也包括在其它包下的子类中是不能访问到被默认地修饰符修饰的属性或者方法的。
    2. 因此得到:默认地访问权限范围较为严格。

5.4.2.3 protected

  • 权限范围:
    1. protected权限符修饰属性或者方法时,在本类中可以访问到的同时还可以在当前包中的其它类中可以访问到、并且还可以在不同包的子类下访问得到。也就是:在其它包下的任意类中是不能访问到被protected修饰符修饰的属性或者方法的。
    2. 因此得到:protected访问权限范围一般严格。

5.4.2.4 public

  • 权限范围:
    1. public权限符修饰属性或者方法时,在当期类中、当前包中其它类下、不同包的子类下、任意包的任意类下都是可以访问到的。也就是:public权限符修饰属性或者方法时在任何一种情况下都是可以访问到的,
    2. 因此得到:public访问权限范围很松,权限等级是公开的。

5.5 访问权限范围总结

5.5.1 一表看权限

 

5.5.2 总结

  • 当没有要求时,建议:属性编写为默认的访问权限
  • 当要求使用封装完成,建议:实例变量编写为private访问权限
  • 当要求该属性在本类以及子类中使用,建议:属性编写为protected访问权限。
  • 大多数情况下,方法使用public访问权限,属性使用private访问权限

5.6方法重写中的访问权限说明

方法的重写也叫做方法覆盖override

  • 重写的规则
  • 不能缩小访问权限
  • 返回值类型一致 或者 父类方法返回值类型的子类类型
  • 方法名称必须一致
  • 参数列表必须一致

六、super关键字

6.1 问题抛出

  • 当子类中重写父类的方法时,如果再在子类的重写的方法体中调用父类中的该方法,该如何实现呢?
  • 直接调用父类中的方法
    1. 死循环,没有意义。

 

 

  • 当子类中重写父类的方法时,如果再在子类的方法体中调用父类中的方法,则只能使用super.方法。否则自己调用自己,就会出现死循环,没有意义(递归调用)  

6.2 方法重写的回顾

  • 父类中的方法无法满足子类的需求时,则就必须在子类中重写父类的方法。

 

  •  当子类中重写父类的方法时,如果再在子类的重写的方法体中调用父类中的该方法,就得用super。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

6.3.认识super关键字

6.3.1描述

  • 代表父类、超类。用于在子类中访问父类中的属性或者方法。

6.3.2 super使用区域

  • 只能在子类中使用。

6.3.3 super的作用

  • 只能在子类中访问父类中的实例变量或者实例方法
  • 还可以访问父类中的构造方法

6.3.4 super的使用

 

  • 在子类中访问父类中的实例变量

……

  • 在子类中访问父类中的实例方法
  • 在子类中访问父类中的构造方法

 

 

6.3.5使用总结

  • super使用时,是调用父类中的实例变量或者实例方法。
  • 因此得到结论:
  1. 访问父类中的实例变量或者实例方法时,使用super.
  • 当子类中重写父类的方法时,如果再在子类的方法体中调用父类中的方法,则只能使用super.方法。否则自己调用自己,就会出现死循环,没有意义(递归调用)

七、this关键字与super关键字的区别

7.1 this

7.1.1自身描述

  • 代表当前这个对象,也就是:当前谁调用这个方法则this代表的就是谁

7.1.2使用区域

  • this可以在哪里使用:在当前类(本类)中使用

7.1.3访问目标

  • this关键字可以访问谁:

7.1.4查找顺序

 

this关键字访问实例变量或实例变量时,查找顺序:先在当前类中找该实例变量或实例方法,如果找不到则再去父类中找该实例变量或实例方法

7.2 super 

7.2.1自身描述

  • 代表父类、超类

7.2.2使用区域

  • super可以在哪里使用:只能在子类中使用

7.2.3访问目标

  • super关键字可以访问谁:
    1. 只能在子类中访问父类中的实例变量或实例方法
    2. 还可以访问父类中的构造方法

 

7.2.4查找顺序

  • 直接去父类中找该实例变量或实例方法
  • 因此得到结论:
    1. 访问父类中的实例变量或实例方法时,使用super.查找速度相对更快或者执行效率更高。

7.3 this与super的随堂练习

 

  • 子类对象实例化过程
  • 当创建子类对象时,父类做了什么?
/**

当创建子类对象时父类做了什么?

    当创建子类对象时,先跳转到子类相匹配的构造方法

    当前子类构造方法中,如果没有使用super指定调用父类哪个构造方法时,则系统默认调用父类的无参构造方法,等价于编写super();

    因此得到结论:当创建子类对象,先执行父类构造方法,然后再执行子类相匹配的构造方法

 */

 

思考

  1. .为什么super(…)和this(…)调用语句不能同时在一个构造器中出现?

思路:首先要明白this()与super()各自的功能,再谈两者同时出现在一个构造函数中时,为什么会报错。

首先是不安全,因为在构造函数中,会在第一行声明super(),此时super()默认先调用父类的无参构造,或者super()调用有参构造,然后再完成子类特有属性的初始化。而在子类的构造函数中this()调用的是子类中的其他构造函数,其他构造函数中必然会有默认调用父类无参构造方法,或直接调用有参构造方法的构造函数,此时,同一个子类构造器中声明了两次父类构造函数,即父类初始化了两次,造成不安全的问题。

再者是失去了语句的意义,如果同时在子类构造方法中调用了两次同样的构造函数,编译器不通过。

2).为什么super(…)或this(…)调用语句只能作为构造器中的第一句出现?

  • 总结
  • 继承
  • 可掌握什么情况下两个类构成继承关系
  • 可掌握方法重写的意义及特点
  • 可理解super关键字存在的意义
  • 可了解Java对继承的支持性
  • 当创建子类对象时,父类做了什么?

 

https://blog.csdn.net/shalimu/article/details/128019628

  • this关键字与super的区别

https://blog.csdn.net/m0_46151790/article/details/128260474

  • 访问权限修饰符
  • 什么是?
  • 分类:
  • 每一种的访问权限

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加菲猫���

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

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

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

打赏作者

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

抵扣说明:

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

余额充值