35
SEU-LIST JAVA 面面面面面面面面 面面面 面面面面面面面面面面面面面面

JAVA 面向对象程序设计

Embed Size (px)

DESCRIPTION

沈傲东 东南大学影像科学与技术实验室. JAVA 面向对象程序设计. 对象和类. 类与对象的 JAVA 基础 JAVA 面向对象特性 重载 【Overload】 覆盖 【Override】 继承 / 扩展 【Inherit/Extend】 UML 表示. 类和对象. 实物. 分类. 能吃的. 吃好的. 能坐的. 坐好的. 对象 --- 类. 最好用的. 能穿的. 最好用不完的. 穿好的. 类是具有 共同属性和行为 的对象的 抽象 。 类可以定义为 数据和方法 的集合。 类也称为模板,因为它们提供了对象的基本框架。. - PowerPoint PPT Presentation

Citation preview

Page 1: JAVA 面向对象程序设计

SEU-LIST

JAVA 面向对象程序设计

• 沈傲东• 东南大学影像科学与技术实验室

Page 2: JAVA 面向对象程序设计

SEU-LIST

对象和类

• 类与对象的 JAVA 基础• JAVA 面向对象特性

重载【 Overload 】 覆盖【 Override 】 继承 / 扩展【 Inherit/Extend 】

• UML 表示

2

Page 3: JAVA 面向对象程序设计

SEU-LIST

类和对象

3

能吃的

能坐的

能穿的 最好用的

实物

分类

对象 --- 类

吃好的

坐好的

穿好的 最好用不完的

Page 4: JAVA 面向对象程序设计

SEU-LIST4

• 类是具有共同属性和行为的对象的抽象。

• 类可以定义为数据和方法的集合。

• 类也称为模板,因为它们提供了对象的基本框架。

对象

抽象

实例化

属性或状态

操作或行为

数据或变量

方法

封装的实体 = 数据 + 方法

Page 5: JAVA 面向对象程序设计

SEU-LIST

创建类

class name { type variable1; … type variableN;  type methodname1(parameter-list){ // 方法体 } … type methodnameN(parameter-list){ // 方法体 }

}

5

在类中,属性是通过成员变量体现的,而操作是用成员

函数(又称为方法)实现的。

Java 中定义类的通用格式:

成员变量(对象属性)

成员方法(对象行为

或操作)

Page 6: JAVA 面向对象程序设计

SEU-LIST

定义方法

• 定义方法的一般格式:

[access] type methodname1([parameter-list]){ // 方法体}

6

发往某个对象的消息对应于一个方法调用。作为对消息的响应,对象将执行一个类似于过程体的方法。方法是

包含在类中的函数。

方法名称返回类型修饰符,可选

参数列表,可选

• 举例:public void setBirthday(int day, int month, int year){

day=23; month=7; year=2003;}

Page 7: JAVA 面向对象程序设计

SEU-LIST

JAVA 类设计

• 形式 主类(含有 main 函数的类) 非主类

• 构成 访问权限、类名、类体 允许内部类、匿名类

• 与字节码文件(一一对应)• 与源文件的关系

( *.java ) 源文件可以包含多个类 源文件中至多有一个 public

类 源文件名要与 public 类名相

同7

• 一个源文件中尽量只定义一个类

• 所有类都应处于包中

DEMO

Page 8: JAVA 面向对象程序设计

SEU-LIST

构造函数• 构造函数名称与类名称相同• 构造函数没有返回类型• 其任务是在创建对象时初始化其内部状态

8

class Fruit { boolean seedLess; boolean seasonal; float price; Fruit(boolean seed, boolean season, float p) { seedLess = seed; seasonal = season; price = p; } }

Page 9: JAVA 面向对象程序设计

SEU-LIST

this 引用

9

public class PassTest { int x; PassTest(int x) { this.x=x; } public void passingValue(){ System.out.println(“x 等于 " +x); } public static void main(String args[]) { PassTest test = new PassTest(10); test.passingValue(); }}

关键字 this 与对象关联

它用于指示当前对象

指明此对象的变量 x 应赋值为通过构造函数传

递的自变量 x 的值。

Page 10: JAVA 面向对象程序设计

SEU-LIST

访问修饰符

10

• public 声明的数据成员和成员函数可从类外部的任何地方访问。

• 而 private 数据将被隐藏,在类外不可见,这就实现了数据封装的思想。

• 要从类外操纵 private 成员,只能通过类的public 或 protected成员来实现。

Page 11: JAVA 面向对象程序设计

SEU-LIST

类的修饰符

• 内部类与外部类class Outer{

class Inner{}

}

• 修饰内部类 protected private static

11

Page 12: JAVA 面向对象程序设计

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;}

引用本身按值传递

Day

2002,5,30

Day

2003,7,23

obj1

obj2

x

y

调用swapobj(obj1,obj2)

改变对象状态

x

y

Page 13: JAVA 面向对象程序设计

SEU-LIST

对象和类

类与对象的 JAVA 基础JAVA 面向对象特性

重载覆盖继承

UML 表示

13

Page 14: JAVA 面向对象程序设计

SEU-LIST

面向对象特性

14

Encapsulation融合数据和代码

Polymorphism高度抽象到一般抽象同一行为的不同表现

Inheritance构建类系,实现抽象

封装

继承

多态

聚合Aggregation功能复用,部分组合

“ 是一个” is a

“ 有一个” Has a

Page 15: JAVA 面向对象程序设计

SEU-LIST

继承

• 被继承的类称为超类• 继承父类的类称为子类• 执行继承时,子类将获得父类的属性,并具有自

身特有的属性。

继承是面向对象编程技术的一块基石,它允许创建分等级层次的类。运用继承,可以创建一个通用类定义一系列一般特性。该类可以被更具体的类继承

Emoloyee 类: name sex

Worker 类: category dressAllowance

Officer 类: empClass vehicle

职员类,具有姓名和性别两个属性

工人类,继承了父类的姓名和性别属性外还包含类别和

是否有服装津贴属性

主任类,还包含级别和是否配备

交通工具属性

Page 16: JAVA 面向对象程序设计

SEU-LIST

extends 关键字

• extends 关键字用于继承类。• 声明一个继承父类的类的通常形式如下: class SubclassName extends SuperclassName { // 类体 }

没有 extends ,默认父类为 Object 只能有一个父类,即单继承 子类继承父类的全部成员

注意

Page 17: JAVA 面向对象程序设计

SEU-LIST

super 关键字• super 关键字用来解决如何直接访问或初始化

从父类继承来的属性。

• super 有两种通用形式:调用父类的构造函数、用来访问被子类的成员覆盖的父类成员。

• 它用在对象的构造函数中,将构造细节通过继承链往上传递。

• super() 必须是在子类构造函数中的第一个执行语句。

Page 18: JAVA 面向对象程序设计

SEU-LIST

继承示例class Employee { String name; // 姓名 char sex; // 性别 Employee(String n, char s){ name = n; sex = s; } public String getName() { return name; } public char getSex(){ return sex;}}

class Worker extends Employee { char category;// 类别 boolean dressAllowance; // 是否提供服装津贴 Worker(String n,char s,char c,boolean d){ super(n,s); category = c; dressAllowance = d; } public char getCategory(){return category;} public boolean getAll(){ return dressAllowance; }}

class InheDemo { public static void main(String args[]) { Worker w = new Worker("M.John",'M','B',true); System.out.println(" 工人信息 "); System.out.println(" 姓名 : "+w.getName()); System.out.println(" 性别 : "+w.getSex()); System.out.println(" 类别 : "+w.getCategory()); if(w.getAll()) System.out.println(" 提供服装津贴 "); else System.out.println(“未提供服装津贴” ); }}

Page 19: JAVA 面向对象程序设计

SEU-LIST

方法覆盖( override )

• 方法覆盖是 Java 实现多态性机制的另一种方式。• 在类层次结构中,如果子类中的一个方法与父类

中的方法有相同的方法名并具有相同数量和类型的参数列表,这种情况称为方法覆盖。

• 当一个覆盖方法通过父类引用被调用, Java根据当前被引用对象的类型来决定执行哪个版本的方法。

• 可以通过 super 关键字调用直属父类中被覆盖的方法版本。

Page 20: JAVA 面向对象程序设计

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 方

Page 21: JAVA 面向对象程序设计

SEU-LIST

方法重载( overloading )

• 方法重载是 Java 实现面向对象的多态性机制的一种方式。

• 同一个类中多个方法有相同的名字,不同的参数列表,这种情况称为方法重载。

• 返回类型不同并不足以构成方法重载。• 当重载方法被调用时,编译器根据参数的类型和

数量来确定实际调用哪个重载方法的版本。

Page 22: JAVA 面向对象程序设计

SEU-LIST

方法重载示例

class Calculation { public void add( int a, int b) { int c = a + b; System.out.println(" 两个整数相加得 "+ c); } public void add( float a, float b){ float c = a + b; System.out.println(" 两个浮点数相加得 "+c); } public void add( String a, String b) { String c = a + b; System.out.println(" 两个字符串相加得 "+ c); }}

class CalculationDemo { public static void

main(String args[]) {Calculation c = new Calculation();c.add(10,20);c.add(40.0F, 35.65F);

c.add("早上 ", "好 "); }} 编译器决定

调用版本

Page 23: JAVA 面向对象程序设计

SEU-LIST

重载构造函数

• Java 为每一个类自动提供缺省构造函数• 缺省构造函数将成员变量的值初始化为 缺省值• 一旦创建了自己的构造函数,缺省的构造函数

将不复存在。• 重载构造函数提供了一组创建对象的方式,可

以根据需要决定是否带初始参数。

public class constructOverload { int x; constructOverload() { x=0; System.out.println(" 不带参数的构造函数 "); } constructOverload(int x){ this.x=x; System.out.println("带一个参数的构造函数 "); } }

Page 24: JAVA 面向对象程序设计

SEU-LIST

多态性

• 静态(编译时) 方法重载 同一类中

• 动态(运行时) 方法覆盖 层次类中 接口 抽象类 抽象方法等

取经人void 除妖 ();

Page 25: JAVA 面向对象程序设计

SEU-LIST

高级访问控制

访问控制 private成员

缺省的成员 protected成员

public成员

同一类中成员

同一包中其他类 ×

不同包中子类 × ×

不同包中非子类 × × ×

Page 26: JAVA 面向对象程序设计

SEU-LIST

对象和类

类与对象的 JAVA 基础JAVA 面向对象特性

重载覆盖继承

UML 表示

26

Page 27: JAVA 面向对象程序设计

SEU-LIST

UML 简介

27

• 统一建模语言 UML ( Unified Modeling Language )是一种绘制软件蓝图的标准语言。

• 可以用 UML 对软件密集型系统进行可视化、 详述、构造和文档化。

• 从企业信息系统到基于 Web 的分布式应用,甚至严格的实时嵌入式系统都适合于用 UML 来建模。

• 它是一种富有表达力的语言,可以描述开发所需要的各种视图,然后以此为基础开发系统。

Page 28: JAVA 面向对象程序设计

SEU-LIST

UML 的特点

28

标准统一 面向对象

独立于过程 概念清晰简单易用

http://www.uml.orghttp://www.uml.org.cn

Page 29: JAVA 面向对象程序设计

SEU-LIST

UML 元素

29

Page 30: JAVA 面向对象程序设计

SEU-LIST

模型元素

30

构件名依赖泛化

关联

聚集(关联的一种形式)

属性

操作

用例名

Page 31: JAVA 面向对象程序设计

SEU-LIST

类 HelloWorld

31

+pai nt()

Hel l oWorl d 第一行表示类名

第三行由类包含的操作或方法构成

第二行为空,因为该类中不需要属性

Page 32: JAVA 面向对象程序设计

SEU-LIST

类的关系

32

+pai nt()

Hel l oWorl d

Applet

Graphics

泛化关系

依赖关系

Page 33: JAVA 面向对象程序设计

SEU-LIST

用包来组织类

33

HelloWorld

java

applet

awt

lang

包被表示为带有标签的文件夹

有向的虚线段描述了对象与包之间的依赖关系

Page 34: JAVA 面向对象程序设计

SEU-LIST

HelloWorld.java 的构件图

34

Hello.html

HelloWorld.java

Hello.jpg

HelloWorld.class

Page 35: JAVA 面向对象程序设计

SEU-LIST

作业

• 构建动物、猫、老虎的类系结构 使用 UML 和代码分别表示

35