JavaSE-09 继承
学习要点
- 继承的优点和实现
- 子类重写父类方法
- 继承下构造方法的执行过程
- 抽象类和抽象方法的使用
- final修饰属性、方法和类
继承的优点和实现
宠物管理系统优化设计
宠物管理系统中的类有什么问题?

使用继承优化后的类图:

子类和父类是is-a的关系。即子类是父类的一个特例,一个具体实现。例如苹果是水果,小学生是学生,大学生是学生……
继承的实现
第一步:编写父类
class Pet {
//公共的属性和方法
}
第二步:编写子类
class Dog extends Pet { //注意:只能继承一个父类
//子类特有的属性和方法
}
子类访问父类成员
访问父类的构造方法
super(); super(name); // super调用构造方法时,只能是第一句
访问父类的成员变量
super.name;
访问父类的方法
super.print();
父类不能被继承的资源
- private成员
- 子类与父类不在同包,使用默认访问权限的成员
- 构造方法
访问控制符总结
|
|
private |
(默认)friendly |
protected |
public |
|
同一个类中 |
√ |
√ |
√ |
√ |
|
同一个包中 |
√ |
√ |
√ |
|
|
子类中 |
√ |
√ |
||
|
全局范围内 |
√ |
多重继承关系的初始化顺序
何时使用继承
- 继承和真实世界的描述一致:符合is-a的关系
- 继承实现代码的重用:将子类共有的属性和行为放到父类中
上机练习
练习1:阅读代码,说出控制台输出结果
class Car {
private int site = 4; //座位数
Car(){
System.out.println ("载客量是"+site+"人);
}
public void setSite(int site){
this.site = site;
}
void print(){
System.out.print("载客量是"+site+"人");
}
}
class Bus extends Car {
Bus(int site){
setSite(site);
}
}
public static void main(String[] args) {
Bus bus = new Bus(20);
bus.print();
}
练习2:使用继承完成宠物管理系统的优化
子类重写父类方法
父类的方法的局限性
在宠物管理系统中,父类的print()方法如下:

问题:他能输出子类特有的属性信息吗?如何修改?
方法重写的相关注意事项
构造方法因为无法被继承,所以不能重写。
方法重写的规则:
- 发生在父类和子类之间
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类;
- 访问权限不能严于父类
方法重写和重载的区别
|
位置 |
方法名 |
参数表 |
返回值 |
访问修饰符 |
|
|
方法重写 |
子类 |
相同 |
相同 |
相同或是其子类 |
不能比父类更严格 |
|
方法重载 |
同类 |
相同 |
不相同 |
无关 |
无关 |
上机练习
优化电子宠物系统,重写父类方法,输出子类特有属性。
提示:尝试使用super调用父类已存在方法重写或者完全重写。
抽象类和抽象方法的使用
抽象类
问题:在宠物管理系统中,去实例化一个宠物有意义吗?
Pet pet = new Pet ("小土狗",20,40);
pet.print();
pet是没有实际意义。所以使用abstract关键字去限制Pet类的实例化。
public abstract class Pet { //abstract修饰的类称为抽象类
}
抽象方法
在宠物管理系统中,父类Pet类中的print()方法是否存在问题?
public abstract class Pet {
public void print() {
//…
}
}
实际上每个子类的print()方法实现都不同。如何解决这个问题?父类不要实现这个方法,让子类去实现。
abstract也可用于方法——抽象方法
- 抽象方法没有方法体
- 抽象方法必须在抽象类里
- 抽象方法必须在子类中被实现,除非子类是抽象类
public abstract void print(); //没有方法体的抽象方法
上机练习
修改Pet类为抽象类
修改Pet类的print()方法为抽象方法
输出Dog和Penguin信息。
final修饰属性、方法和类
final类
Dog类不希望再被其他类继承?
public final class Dog extends Pet { //定义了一个终结版的类
//…
}
final方法
方法不希望被重写?
public final void print () { //定义了一个终结版的方法
//…
}
final成员变量
属性值不希望被修改?使用常量。
public class Penguin {
final String home ="南极";// 居住地
public void setHome(String name){
this.home=home; //错误,不可再赋值
}
}
使用final修饰引用型变量,变量的值是固定不变的,而变量所指向的对象的属性值是可变的。
class Dog {
String name;
public Dog(String name) {
this.name = name;
}
}
class Test {
public static void main(String[] args) {
final Dog dog = new Dog("旺旺");
dog.name = "小宝";
dog = new Dog("小土狗"); //错误:使用final修饰引用型变量,变量不可以再指向另外的对象。
}
}
综合案例
需求描述
某汽车租赁公司出租多种车辆,车型及租金情况如下
|
轿车 |
客车(金杯、金龙) |
||||
|
车型 |
别克商务舱GL8 |
宝马550i |
别克林荫大道 |
<=16座 |
>16座 |
|
日租费 元/天 |
600 |
500 |
300 |
800 |
1500 |
编写程序实现计算租赁价。
分析
发现类

发现类的属性

发现类的方法

优化设计

编写程序入口

程序界面


根据分析,完成系统设计和编码实现
总结
继承
- 符合is-a关系
- 使用extends关键字
- 代码复用
方法重写的规则
- 方法名相同
- 参数列表相同
- 返回值类型相同或者是其子类
- 访问权限不能严于父类
super关键字来访问父类的成员
- super只能出现在子类的方法和构造方法中
- super调用构造方法时,只能是第一句
- super不能访问父类的private成员
抽象类和抽象方法
- 抽象类不能被实例化
- 可以有0~多个抽象方法
- 非抽象类必须重写父类的所有抽象方法
final修饰符
- 修饰的类,不能再被继承
- 修饰的方法,不能被子类重写
- 修饰的变量将变成常量,只能在初始化时进行赋值
JavaSE-09 继承的更多相关文章
- JavaSE 类继承中函数重写
(1) /** * 继承时重写方法的返回类型可以不一样 * 这时的返回值类型必须是与父类相同或者为子类. */ class A { public Object func(){ return null; ...
- JavaSE习题 继承接口和泛型
问答题: 1.子类在什么情况下可以继承父类友好成员? 答:在同一个包内 2.子类通过怎样的方法可以隐藏继承的成员变量? 答:声明一个与父类相同变量名的成员变量 3.子类重写继承的方法原则是什么? 答: ...
- Java 基础入门随笔(11) JavaSE版——继承、覆盖、抽象类
1.面向对象的特征二:继承 定义: 指一个对象直接使用另一对象的属性和方法. 继承好处: 1.提供代码的复用性. 2.让类与类直接产生了关系,给第三个特征多态提供了前提. java中支持单继承.不直接 ...
- 关于properties文件在项目中的使用
这个是当时在学习JDBC的时候老师给讲的.web项目中把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 老师讲了两种读取 ...
- 《Thinking In Java第四版》拾遗
<Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...
- 使用Properties类和ResourceBundle类读取properties文件
一.介绍: 项目中经常把一些常用的用户名和密码都填写到一个对应的配置文件中,这样每次修改密码或者用户名的时候就可以直接修改这个配置文件了,不用动源码. 这里讲两种方式读取properties文件的方法 ...
- Spark RDD API扩展开发
原文链接: Spark RDD API扩展开发(1) Spark RDD API扩展开发(2):自定义RDD 我们都知道,Apache Spark内置了很多操作数据的API.但是很多时候,当我们在现实 ...
- 04C++核心编程
Day01 笔记 1 C++概述 1.1 C++两大编程思想 1.1.1 面向对象 1.1.2 泛型编程 1.2 移植性和标准 1.2.1 ANSI 在1998制定出C++第一套标准 2 c++初识 ...
- Windows7WithSP1/TeamFoundationServer2012update4/SQLServer2012
[Info @09:03:33.737] ====================================================================[Info @ ...
- JavaSE学习总结第09天_面向对象4
09.01 final关键字引入 例: class Fu { public final void show() { System.out.println("访问底层资源"); ...
随机推荐
- ios学习顺序表
- bzoj 2744 朋友圈
题目大意: 两个国家 各有A和B个人,每个人有一个数值. 若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友 若两个B国的人满足$val_ ...
- linux内存管理之全局框架
讲解复杂繁琐的机制原理,最通俗的方法就是用模型架构的方式向读者呈现,先要在整体上了解大方向大架构,再根据大方向大架构来进行分支深入,犹如毛主席那句话“战略上蔑视敌人,战术上重视敌人”.下面我也以这种方 ...
- bzoj3544
set+贪心 感觉当div2C挺好的... set维护前缀和%m,当前答案为sum[r]-sum[l-1],我们当然希望sum[l-1]是sum[r]的后继或者最小的数,所以求出来比较一下就行了 #i ...
- mysql 状态查询
select COUNT(case when info.State = '0' then State end ) as daichuliCount, COUNT(case when info.St ...
- POJ 1686 Lazy Math Instructor(栈)
原题目网址:http://poj.org/problem?id=1686 题目中文翻译: Description 数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公 ...
- git修改push的注释信息
修改还未push的注释: git commit --amend 修改后保存退出. 刚刚push到远端还没有人其他人下载或改动的: git commit --amend进入修改页面修改注释信息,修改后: ...
- not and or
not and or (逻辑表达式) 首先要做一些准备知识: 1,优先级:逻辑型 < 测试型 < 关系型 < 算数型 2,逻辑型优先级:or < and < not 3, ...
- jQuery 动作效果
隐藏和显示 jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: jQuery toggle() 通过 jQ ...
- 51nod1127 最短的包含字符串 尺取法
Bryce1010模板 #include <bits/stdc++.h> using namespace std; typedef long long LL; map<char,LL ...
