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("访问底层资源"); ...
随机推荐
- I.MX6 wpa_cli 使用
/*********************************************************************** * I.MX6 wpa_cli 使用 * 说明: * ...
- BZOJ_4177_Mike的农场_最小割
BZOJ_4177_Mike的农场_最小割 Description Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不 ...
- Velocity魔法堂系列一:入门示例(转)
Velocity魔法堂系列一:入门示例 一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本 ...
- EF7学习资料整理
EntityFramework 7 开发纪录 http://www.cnblogs.com/xishuai/archive/2014/11/28/ef7-develop-note.html Entit ...
- 鸭子类型(Duck Typing)
鸭子类型(Duck Typing) 动态类型.没有类型检验.不关注类型,关注方法 相当于静态类型语言的多态 这是程序设计中的一种类型推断风格,这种风格适用于动态语言(比如PHP.Python.Ruby ...
- 利用jenv安装maven, tomcat,zookeeper等
jenv有关的网站: http://jenv.io https://github.com/gcuisinier/jenv 1. 执行jenv安装 $ curl -L -s get.jenv.io | ...
- thinkphp 中 dump 函数调试数组时显示不全解决方法
在php.ini里的 xdebug 节点中,加入如下 xdebug.var_display_max_children=128 #子级节点最多显示的的字符数xdebug.var_display_max_ ...
- ionic2 如何引入第三方cordova插件
例如:cordova-plugin-wechat 这个插件可以做微信登录,分享支付等 首先第一步:ionic plugin add cordova-plugin-wechat --variable w ...
- win7/8系统中php5.3和5.4、5.5不能加载php_curl.dll解决办法
win7/8系统中php5.3和5.4.5.5不能加载php_curl.dll解决办法 作者:用户 来源:互联网 时间:2016-06-23 18:54:33 php变量注释系统模块 摘要: 本文 ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...