对象和类 - 东南大学计算机科学与工程系

Download Report

Transcript 对象和类 - 东南大学计算机科学与工程系

JAVA面向对象程序设计
•
•
沈傲东
东南大学影像科学与技术实验室
SEU-LIST
对象和类
• 类与对象的JAVA基础
• JAVA面向对象特性



重载【Overload】
覆盖【Override】
继承/扩展【Inherit/Extend】
• UML表示
2
SEU-LIST
类和对象
实物
分类
能吃的
吃好的
能坐的
坐好的
能穿的
穿好的
3
对象---类
最好用的
最好用不完的
SEU-LIST
封装的实体=数据+方法
• 类是具有共同属性和
行为的对象的抽象。
• 类可以定义为数据和
方法的集合。
• 类也称为模板,因为
它们提供了对象的基
本框架。
4
数据或变量
类
方法
抽
象
实
例
化
属性或状态
对象
操作或行为
SEU-LIST
创建类
在类中,属性是通过成员变
量体现的,而操作是用成员
函数(又称为方法)实现
的。
Java中定义类的通用格式:
class name {
type variable1;
…
type variableN;
成员变量(对象属
性)
type methodname1(parameter-list){
//方法体
}
…
type methodnameN(parameter-list){
//方法体
}
成员方法
(对象行为
或操作)
}
5
SEU-LIST
定义方法
•定义方法的一般格式:
发往某个对象的消息对应于
一个方法调用。作为对消息
的响应,对象将执行一个类
似于过程体的方法。方法是
包含在类中的函数。
[access] type methodname1([parameter-list]){
//方法体
}
修饰符,
可选
返回类型
方法名称
参数列
表,可选
• 举例:
public void setBirthday(int day, int month,
int year){
day=23; month=7; year=2003;
}
6
SEU-LIST
JAVA类设计
• 形式


主类(含有main函数的类)
非主类
• 构成


访问权限、类名、类体
允许内部类、匿名类
• 与字节码文件(一一对应)
• 与源文件的关系
• 一个源文件中尽
量只定义一个类
• 所有类都应处于
包中
(*.java)



7
源文件可以包含多个类
源文件中至多有一个public类
源文件名要与public类名相同
SEU-LIST
构造函数
• 构造函数名称与类名称相同
• 构造函数没有返回类型
• 其任务是在创建对象时初始化其内部状态
class Fruit {
boolean seedLess;
boolean seasonal;
float price;
Fruit(boolean seed, boolean season, float p) {
seedLess = seed;
seasonal = season;
price
= p;
}
}
8
SEU-LIST
this引用
关键字 this 与对象关联
它用于指示当前对象
public class PassTest {
int x;
指明此对象的变
量 x 应赋值为
PassTest(int x) {
通过构造函数传
this.x=x;
递的自变量 x
}
的值。
public void passingValue(){
System.out.println(“x 等于 " +x);
}
public static void main(String args[]) {
PassTest test = new PassTest(10);
test.passingValue();
}
}
9
SEU-LIST
访问修饰符
• public 声明的数据成员
和成员函数可从类外部的
任何地方访问。
• 而private 数据将被隐藏,
在类外不可见,这就实现
了数据封装的思想。
• 要从类外操纵private 成
员,只能通过类的
public或protected成
员来实现。
10
SEU-LIST
类的修饰符
• 内部类与外部类
class Outer{
class Inner{
}
}
• 修饰内部类



11
protected
private
static
SEU-LIST
对象作为参数
class Test{
int a,b;
Test(int i,int j) {
a=i;
b=j;
}
//可以在函数中改变对象状态
void change(Test obj)
{
obj.a=50;
obj.b=40;
}
}
12
改变对象
状态
当对象作为函数参数时,
在函数中只能改变该对
象的状态,但不能改变
该对象的引用
void swapobj(Day x,Day y){
Day temp=y;
y=x;
引用本身
x=temp;
按值传递
}
obj1
Day
2002,5,30
obj2
x
Day
2003,7,23
y
调用swapobj(obj1,obj2)
SEU-LIST
类与对象的JAVA基础
JAVA面向对象特性
重载
覆盖
继承
UML表示
对象和类
13
SEU-LIST
面向对象特性
Encapsulation
融合数据和代码
“ 是一个”is a
封装
“有一个”Has a
多态
Inheritance
构建类系,实现抽象
聚合
14
Polymorphism
高度抽象到一般抽象
同一行为的不同表现
继承
Aggregation
功能复用,部分组合
SEU-LIST
继承
继承是面向对象编程技术的一块
基石,它允许创建分等级层次的
类。运用继承,可以创建一个通
用类定义一系列一般特性。该类
可以被更具体的类继承
• 被继承的类称为超类
• 继承父类的类称为子类
• 执行继承时,子类将获得父类的属性,并具有自
身特有的属性。
工人类,继承了父
类的姓名和性别属
性外还包含类别和
是否有服装津贴属性
Worker类:
category
dressAllowance
Emoloyee类:
name
sex
主任类,还包含
级别和是否配备
交通工具属性
职员类,具
有姓名和性
别两个属性
Officer类:
empClass
vehicle
SEU-LIST
extends关键字
• extends关键字用于继承类。
• 声明一个继承父类的类的通常形式如下:
class SubclassName extends SuperclassName {
//类体
}
注意



没有extends,默认父类为Object
只能有一个父类,即单继承
子类继承父类的全部成员
SEU-LIST
super关键字
• super关键字用来解决如何直接访问或初始化
从父类继承来的属性。
• super有两种通用形式:调用父类的构造函数、
用来访问被子类的成员覆盖的父类成员。
• 它用在对象的构造函数中,将构造细节通过继承
链往上传递。
• super()必须是在子类构造函数中的第一个执
行语句。
SEU-LIST
继承示例
class Employee {
String name; //姓名
char sex;
//性别
Employee(String n, char s){
name = n; sex = s;
}
class InheDemo {
public String getName() { return name; }
public static void main(String args[]) {
public char getSex(){ return sex;}}
Worker w = new Worker("M.John",'M','B',true);
System.out.println("工人信息");
class Worker extends Employee {
System.out.println("姓名 : "+w.getName());
char category;//类别
System.out.println("性别 : "+w.getSex());
boolean dressAllowance; //是否提供服装津贴
System.out.println("类别 : "+w.getCategory());
Worker(String n,char s,char c,boolean d){
if(w.getAll())
super(n,s);
System.out.println("提供服装津贴");
category = c; dressAllowance = d;
else
}
System.out.println(“未提供服装津贴”);
public char getCategory(){return category;}
}
public boolean getAll(){ return dressAllowance; }
}
}
SEU-LIST
方法覆盖(override)
• 方法覆盖是Java实现多态性机制的另一种方式。
• 在类层次结构中,如果子类中的一个方法与父类
中的方法有相同的方法名并具有相同数量和类型
的参数列表,这种情况称为方法覆盖。
• 当一个覆盖方法通过父类引用被调用,Java根
据当前被引用对象的类型来决定执行哪个版本的
方法。
• 可以通过super关键字调用直属父类中被覆盖的
方法版本。
SEU-LIST
方法覆盖示例
class SuperClass {
int a;
SuperClass(){ a = 10; }
public void printA(){System.out.println("父类中a ="+a);}
}
class SubClass extends SuperClass {
int a;
SubClass(int a){ this.a = a; }
public void printA(){ System.out.println("子类中a = "+a); }
}
public class OverrideDemo {
public static void main(String args[]) {
SuperClass s1 = new SubClass(10);
s1.printA();
}
将调用子类的printA方法
}
SEU-LIST
方法重载(overloading)
• 方法重载是Java实现面向对象的多态性机制的一
种方式。
• 同一个类中多个方法有相同的名字,不同的参数
列表,这种情况称为方法重载。
• 返回类型不同并不足以构成方法重载。
• 当重载方法被调用时,编译器根据参数的类型和
数量来确定实际调用哪个重载方法的版本。
SEU-LIST
方法重载示例
class Calculation {
public void add( int a, int b) {
int c = a + b;
System.out.println("两个整数相加得 "+ c);
class CalculationDemo {
}
public
static
void
public void add( float a, main(String
float b){
args[]) {
float c = a + b;
Calculation
c
=
new
System.out.println("两个浮点数相加得"+c);
Calculation();
}
c.add(10,20);
public void add( String a,c.add(40.0F,
String b) { 35.65F);
String c = a + b;
c.add("早上", "好");
System.out.println("两个字符串相加得
"+ c);
}
}
}
编译器决定
}
调用版本
SEU-LIST
重载构造函数
• Java 为每一个类自动提供缺省构造函数
• 缺省构造函数将成员变量的值初始化为缺省值
• 一旦创建了自己的构造函数,缺省的构造函数
public class constructOverload {
int x;
将不复存在。
constructOverload() {
• 重载构造函数提供了一组创建对象的方式,可
x=0;
System.out.println("不带参数的构造函数");
以根据需要决定是否带初始参数。
}
constructOverload(int x){
this.x=x;
System.out.println("带一个参数的构造函数");
}
}
SEU-LIST
多态性
• 静态(编译时)


方法重载
同一类中
• 动态(运行时)





取经人
void 除妖();
方法覆盖
层次类中
接口
抽象类
抽象方法等
SEU-LIST
高级访问控制
访问控制
private成
员
缺省的成员
protected成
员
public成员
同一类中成员




同一包中其他类
×



不同包中子类
×
×


不同包中非子类
×
×
×

SEU-LIST
类与对象的JAVA基础
JAVA面向对象特性
重载
覆盖
继承
UML表示
对象和类
26
SEU-LIST
UML 简介
• 统一建模语言UML(Unified Modeling Language)是一种绘
制软件蓝图的标准语言。
• 可以用UML对软件密集型系统进行可视化、详述、构造和文档
化。
• 从企业信息系统到基于Web的分布式应用,甚至严格的实时嵌
入式系统都适合于用UML来建模。
• 它是一种富有表达力的语言,可以描述开发所需要的各种视
图,然后以此为基础开发系统。
27
SEU-LIST
UML的特点
标准统一
面向对象
独立于过程
概念清晰
简单易用
http://www.uml.org
http://www.uml.org.cn
28
SEU-LIST
UML元素
29
SEU-LIST
模型元素
类
用例名
构件名
属性
操作
依赖
泛化
关联
聚集
(关联的一种形式)
30
SEU-LIST
类HelloWorld
HelloWorld
第一行表示类名
+paint()
第二行为空,
因为该类中不
需要属性
31
第三行由类包含的
操作或方法构成
SEU-LIST
类的关系
Applet
泛化关系
依赖关系
HelloWorld
Graphics
+paint()
32
SEU-LIST
用包来组织类
包被表示为带有标签的文件夹
java
HelloWorld
applet
awt
lang
有向的虚线段描述了对象与包之间
的依赖关系
33
SEU-LIST
HelloWorld.java的构件图
Hello.html
HelloWorld.class
HelloWorld.java
Hello.jpg
34
SEU-LIST
作业
• 构建动物、猫、老虎的类系结构

35
使用UML和代码分别表示
SEU-LIST