null第一章第一章--封装和继承本门课程目标本门课程目标学完本门课程后,你能够:
使用Java编写面向对象的程序
使用集合存取对象
使用Java异常处理编写程序
使用JDBC操作数据库
使用Java操作XML文件本章目标本章目标使用类图描述设计
掌握面向对象设计基本步骤
掌握类和对象的概念
掌握构造
及其重载
掌握封装的概念及其使用
掌握继承的优点和实现
掌握子类重写父类方法
掌握继承下构造方法的执行过程
掌握final修饰属性、方法和类
回顾回顾什么是类,什么是对象?
如何在类中编写方法?
如何创建对象?
如何在程序中接收控制台的输入?
为什么使用面向对象2-1为什么使用面向对象2-1现实世界是由什么组成的? 世界由对象组成 为什么使用面向对象2-2为什么使用面向对象2-2软件出现的目的是为了:
用计算机的语言描述现实世界
用计算机解决现实世界的问
出现了软件危机,如何解决?
用面向对象的方式描述对象的世界 符合人类思维习惯 “问题”和“解”一致 … … 一个现实世界的问题 一个现实世界的问题 火车——现实世界的对象
如何在计算机中描述它?从现实中抽象出类分三步:
1. 找出它的种类
2. 找出它的属性
3. 找出它的行为 用面向对象描述世界3-1用面向对象描述世界3-1用面向对象的思想描述世界
第一步:发现类 根据“对象”抽象出“类” class Train {
}用面向对象描述世界3-2用面向对象描述世界3-2第二步:发现类的属性 火车共有的特征:
1. 类型
2. 速度
3. 车厢节数
4. 起点名称
5. 发车时间
6.… …class Train {
String sort; // 类型
int speed; // 速度
int count; // 车厢节数
String station; // 起点名称
………
}名词用面向对象描述世界3-3用面向对象描述世界3-3第三步:发现类的方法 火车共有的行为:
1. 出发
2. 到站
3. 检修
4. 输出火车的信息
… …动词class Train {
String sort; // 类型
int speed; // 速度
int count; // 车厢节数
String station; // 起点名称
………
/* 输出火车的信息 */
public void print() {
// 输出火车信息的代码
}
}类图类图使用类图描述类
用于分析和设计“类”
直观、容易理解“+”:public
“-”:private类名返回值类型类型属性名参数:
名字:类型,名字:类型方法名小结小结
面向对象设计的过程是什么?
抽象的原则是什么?
为什么说类图是面向对象设计的好工具?
实现火车站火车管理实现火车站火车管理
实现开通火车功能
编写火车类CrhTrain和GoodsTrain
创建对象火车,输入火车信息,最后输出构造方法 3-1构造方法 3-1对象初始化CrhTrain d121 = new CrhTrain();
d121.name = " d121 ";
d121.speed = 300;
d121.station = " beijing ";class CrhTrain{
// 属性
/* 无参构造方法 */
public CrhTrain() {
name = " d121 ";
speed = 300;
station = " beijing ";
System.out.println("执行构造方法");
}
}使用构造方法:
CrhTrain d121 = new CrhTrain();能否在创建对象的同时就完成赋值?构造方法构造方法 3-2构造方法 3-2
构造方法public 构造方法名( ) {
//初始化代码
}与类名相同没有返回值类型 public CrhTrain() {
name = " d121 ";
speed = 300;
station = " beijing ";
System.out.println("执行构造方法");
}可以指定参数 构造方法 3-3构造方法 3-3
阅读代码,说出运行结果,并指出原因class CrhTrain{
public void CrhTrain() {
name = " d121 ";
speed = 300;
station = " beijing ";
System.out.println("执行构造方法");
}
public void print() {
System.out.println(“火车的车次:" + name
+ “,速度是" + speed
+ “,起点是" + station);
}
}CrhTrain d121 = new CrhTrain();
d121.print();有返回值类型,不是构造方法 方法重载方法重载一个类是否可以有多个构造方法?
方法重载,指同一个类中多个方法:
方法名相同
参数列
不同与返回值、访问修饰符无关 静态常量静态常量 CrhTrain d121 = new CrhTrain();
d121.sort = Train.CRH_TRAIN; class Train {
static final String CRH_TRAIN=“动车";
static final String Goods_TRAIN=“货车";
static final int MAX_SPEED=350;
} Java中定义常量的语法static void print() { }用类名调用: CrhTrain.print(); 使用static定义方法 可否这样赋值?静态常量静态常量static可以用来修饰属性、方法和代码块
static修饰的属性和方法称为类属性(类变量)、类方法
不使用static修饰的属性和方法,属于单个对象,通常称为实例属性(实例变量)、实例方法
static修饰的变量和方法可以通过类名和对象名访问,而不用static修饰的变量和方法只能通过对象名访问
final可以用来修饰属性、方法和类
用final修饰的变量成为常量,其值固定不变
在方法里不可以定义static变量
为什么要使用封装 为什么要使用封装
下面代码有什么问题?
如何解决上面设计的缺陷?CrhTrain d101 = new CrhTrain();
d101.speed = 10000; 不合理的赋值 使用封装 什么是封装什么是封装面向对象三大特征之一——封装
封装的概念
封装的好处封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 隐藏类的实现细节只能通过规定方法访问数据方便加入控制语句方便修改实现如何使用封装如何使用封装封装的步骤 修改属性的可见性 创建getter/setter方法 在getter/setter方法中加入属性控制语句 设为private用于属性的读写 对属性值的合法性进行判断 this的用法this的用法this关键字的用法
调用属性
调用方法
调用构造方法this.speed = 100;
this.name = “d101";this.print(); this();如果使用,必须是构造方法中的第一条语句 this(“d101",100,4,“beijing");如何使用继承如何使用继承使用继承
编写父类
编写子类,继承父类class Train {
//公共的属性和方法
}class CrhTrain extends Train {
//子类特有的属性和方法
}只能继承一个父类 继承关键字 理解继承4-1理解继承4-1子类访问父类成员
访问父类属性
访问父类方法 使用super关键字 super.name;super.print();super代表父类对象 理解继承4-2理解继承4-2有些父类成员不能继承
private成员
子类与父类不在同包,使用默认访问权限的成员
构造方法理解继承4-3理解继承4-3访问修饰符protected
可以修饰属性和方法
本类、同包、子类可以访问
访问修饰符
理解继承4-4理解继承4-4继承后的初始化顺序 父类属性 子类属性 父类构造方法 子类构造方法 在何处使用继承在何处使用继承
何时使用继承?
继承与真实世界类似
只要说“猫是哺乳动物”,猫的很多属性、行为
就不言自明了
藏獒是一种狗
继承是代码重用的一种方式 将子类都有的属性和行为放到父类中 符合is-a关系的设计使用继承 小结2-1小结2-1
继承使用什么关键字?
子类可以继承父类的哪些成员?
使用继承有什么好处?小结2-2小结2-2
阅读代码,说出运行结果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();
}载客量是4人
载客量是20人 方法重写方法重写
子类中有和父类相同签名的方法,会如何? 子类重写父类方法 继承中的构造方法继承中的构造方法
构造方法也会被重写吗?
如何在子类中调用父类的构造方法?super();super(参数表);可以被默认添加 只能是构造方法的第一条语句 不能被继承因此不能重写 final用法final用法
类不希望再被其他类继承?
使用final类
方法不希望被重写?
使用final方法
属性值不希望被修改?
使用final方法public final class CrhTrain extends Train{
//…
}最终版的类 public final void print () {
//…
}最终版的方法public class CrhTrain{
final String sort =“crh”;// 类型
}最终版的属性值优化火车类优化火车类继承 练习1练习1需求说明:
运用面向对象思想抽象出动车类和货车类,画出对应类图
根据类图编写CrhTrain类和GoodsTrain类
添加默认构造方法练习2练习2训练要点:
类的结构,对象的创建,类的属性和方法的调用
类的封装
需求说明:
根据控制台提示信息选择要开通的火车类型,
输入车次、起始站、速度等
打印火车信息
要保证速度的有效性(在1到300之间)练习3练习3需求说明:
增加带参构造方法
CrhTrain(String name, int speed, String station)GoodsTrain(String name, int carryweight, String station)练习4练习4
抽象出动车类和货车类的父类:火车类。
使用继承改写动车类和货车类。练习5练习5分析需求,用封装方式设计类,画出类图
汽车销售人员销售汽车,可售款式有凯越、君威
每款汽车有款式和编号,款式、编号不能修改
汽车销售人员有姓名,姓名不能修改
销售人员有两种销售方式:
按车辆销售,每次一辆
按车型销售(凯越),要同时告诉销售人员购买数量 凯越 君威 销售员