2009-7-29 1
Java程序设计
Programming in Java
2009-7-29 2
第 3章 面向对象程序设计
2009-7-29 3
面向对象程序设计整体介绍
面向对象程序设计 (OOP)
– 将 数据 (属性 )和 方法 (行为或功能 )封装 到类
(classes)中
数据 与 方法 常常是紧密相关的
– 对象 (objects),类的实例对象或类本身
– 三个基本特性,封装性,继承性 和 多态性
2009-7-29 4
比较
结构化程序设计
– 对应的典型的计算机语言,例如,C
– 面向操作 (action)的
– 函数 (方法 )是程序的基本单位
面向对象程序设计
– 对应的典型的计算机语言,例如,Java
– 面向 对象 (object)的
– 类 (class)是程序的基本单位
方法 (函数 )被封装在类中
数据 也常常被封装在类中
2009-7-29 5

类 (class)本身也是一种对象
类 (class)同时也是实例对象的模板
类 (class) 的基本组成,(成员 )域 和 (成员 )
方法
每个对象:拥有内存?存储成员域 /方法
– 静态的成员 域 /方法?属于类
– 其它成员 域 /方法?属于实例对象
2009-7-29 6
类的定义
类的定义格式如下:
[类修饰词 ] class 类名 [extends 父类名 ] [implements 接口名称列表 ]
{
类体
}
2009-7-29 7
多个类组成的程序
很多 Java程序需要多个类完成一项任务
一个文件一般只含有一个类
– 每个文件的长度一般不要太长
– 最长一般不要超过 2000行
2009-7-29 8
方法定义
与 C++程序不同的是,每个方法都必须隶属于某个类
方法定义的格式,
[方法修饰词 ] 返回类型 方法名 (方法的参数列表 )
{
方法体
}
– 返回类型,返回数据的数据类型
除了构造方法,一般要求返回类型,要么为 void,要么为某种数据类型 int,byte,float或 String
最多只能返回一个值
– 方法名,任何一个合法的标识符
– 参数列表,
用逗号 (,)分隔开
2009-7-29 9
自定义类
成员变量
成员方法
构造方法
2009-7-29 10
在 Java语言中,声明类的一般格式为:
[修饰符 ] class 类名 {
声明类的变量声明构造方法声明类的方法
}
2009-7-29 11
构造方法
构造方法 在创建新的实例对象时起作用
构造方法 通常用来初始化实例对象,例如,初始化成员域或设置工作环境
构造方法 的特点,
– 与类同名
– 没有返回值
可以含有多种 构造方法 (重载 )
– 但必须具有不同的参数列表
2009-7-29 12
默认的构造方法
如果没有显式地定义类的构造方法,则系统会为该类定义一个默认的构造方法。该构造方法不含任何参数。
– 这个默认的构造方法首先调用其父类的不含任何参数的构造方法,然后初始化新生成的实例的各个成员域变量
默认值,基本数值类型,0; boolean,false; 引用数据类型,null
– 最好自己写构造方法
一旦在类中定义了构造方法,系统就不会再创建这个默认的不含参数的构造方法。
2009-7-29 13
编写一个 Circle类
2009-7-29 14
2009-7-29 15
2009-7-29 16
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 17
继承性
继承性 – 软件重用的一种方法
– 根据已有的类创建新的类
采纳了旧的类的属性 (域 )及其行为 (方法 )
增加了新的能力
– 子类继承父类
子类增加了新的成员域或新的成员方法
– 有时可以理解成,(但不绝对 !)
子类对象 是 一种特殊的父类对象
2009-7-29 18
继承性 的实现
采用关键字 extends
public class J_HelloApplet extends Applet
{
// …
} // 类 J_HelloApplet结束
2009-7-29 19
关键字,instanceof
运算符,instanceof
例如,
if (p instanceof Circle)
– 上面的条件为 true,当且仅当引用 p所指向的对象是类 Circle(或其 子类 )的实例对象
2009-7-29 20
多重继承
在有些计算机语言中,允许一个类有多个直接父类。这种继承关系称为 多重继承
Java不支持 多重继承
Java 允许一个类有多个直接父接口
(interface)
2009-7-29 21
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 22
多态性
优点,
– 代码重用
– 简化设计、简化代码
– 便于程序扩展
2009-7-29 23
多态性的种类
1) 静态的多态性?重载
2) 动态的多态性?覆盖
2009-7-29 24
静态的多态性 (重载 )
在编译时就能够被识别
针对的是同一个类内的同名方法
例如,
public int square(int x)
{
return x * x;
}
public double square(double x)
{
return x * x;
}
2009-7-29 25
识别重载方法
识别标志,
– 参数的个数、类型、数据类型的排列顺序
– 返回值不能做为识别的标志
2009-7-29 26
动态多态性 (覆盖 )
在程序运行时才被识别
重写父类的方法
– 要求相同的声明
例如,
public class J_HelloApplet extends JApplet
{
public void paint(Graphics g)
{
g.clearRect(0,0,getWidth( ),getHeight( )); // 清除背景
g.drawString("小应用程序,您好 !",10,20);
} // 方法 paint结束
} // 类 J_HelloApplet结束
2009-7-29 27
源程序,J_Teacher.Java
// 文件名,J_Teacher.java; 开发者,雍俊海
class J_Employee
{
public int m_workYear; // 工作的年限
public J_Employee( )
{
m_workYear = 1;
} // J_Employee构造方法结束
public void mb_printInfo( )
{
System.out.println("该职工的工作年限为 " + m_workYear);
} // 方法 mb_printInfo结束
} // 类 J_Employee结束
2009-7-29 28
public class J_Teacher extends J_Employee
{
public int m_classHour; // 授课的课时
public J_Teacher( )
{
m_classHour = 96;
} // J_Teacher构造方法结束
public void mb_printInfo( )
{
System.out.println("该教师的工作年限为 " + m_workYear);
System.out.println("该教师授课的课时为 " + m_classHour);
} // 方法 mb_printInfo结束
public static void main(String args[ ])
{
J_Employee a = new J_Employee( );
a.mb_printInfo( );
a = new J_Teacher( );
a.mb_printInfo( );
} // 方法 main结束
} // 类 J_Teacher结束源程序,J_Teacher.Java
2009-7-29 29
编译、运行 & 结果
2009-7-29 30
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 31

可以将一组相关的类或接口封装在包
(package)里,从而更好地管理已经开发的 Java代码
包含组织类与接口的目录结构
方便程序重用
2009-7-29 32
Java 包
Java系统提供了很多已经写好的包
– 数学计算、输入 /输出、字符串操作
– 尽量利用已有的包、避免重复工作
使用包中类
– 利用 import 语句指定类的位置
– 例如,
import javax.swing.JApplet;
2009-7-29 33

包 java.lang
– java.lang.Object
– java.lang.Math
包 java.util
– java.util.Random
2009-7-29 34
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 35
类成员的封装性
成员 (域或方法 )的访问控制方式,
1) public
2) private
3) protected
4) default(缺省方式 )
2009-7-29 36
成员的访问控制方式,public
则该成员可以被任何类中的方法访问
表明对外开放的方式
少量 (或者没有 ) public 域
部分 public 方法
2009-7-29 37
成员的访问控制方式,private
目的,隐藏具体的实现细节
只有同一个类的成员方法才能访问私有成员
域常常是 private
– 采用 public,get” 方法?读取数据
– 采用 public,set”方法?写数据
2009-7-29 38
成员的访问控制方式,protected
介于 public 和 private之间
同一个包内的所有类的所有方法都能访问该成员
如果不在同一个包内的类的方法要访问该成员,则该类必须是该成员所在的类的子类
2009-7-29 39
成员的访问控制方式,default (缺省方式 )
只有在同一个包内的类的方法才能访问该方法
2009-7-29 40
类成员封装性总结
2009-7-29 41
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 42
abstract
Java允许定义抽象 (abstract)的类和方法
抽象 (abstract)的方法可以只提供方法的头部,但不提供实现的部分
抽象 (abstract)的方法只能是抽象 (abstract)类中的方法
例如,
public abstract class J_Vehicle public abstract class J_Shape
{ {
public abstract void fuel(); public abstract void mb_draw();
} }
2009-7-29 43
关键字,static
静态的 (static)域 和静态的 (static)方法 实际上隶属于类对象
静态的 (static)域
– 示例,System.out
静态的 (static)方法
– 示例,main( )
– 示例,Math.sqrt( )
public static double sqrt(double a)
2009-7-29 44
关键字,final
可以修饰的对象,
1) final 域
2) final 方法
3) final 类
2009-7-29 45
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 46
接口 (interface)
接口 (interface)就象是一种特殊的类
– 成员方法,abstract
– 成员域,final和 static
接口 (interface)中所有的方法和域必须都是 public的
每个接口一般定义在一个,java文件中
2009-7-29 47
示例
例 1,通过接口定义一些常量
public interface J_Constants
{
public static final int ONE = 1;
public static final int TWO = 2;
public static final int THREE = 3;
} // 接口 J_Constants结束
例 2:
interface J_Shape
{
public abstract void mb_draw(Graphics2D g);
} // 接口 J_Shape结束
2009-7-29 48
注意事项
接口中成员方法的默认方式是 public 和
abstract
接口中成员域的默认方式是 public、
static和 final
2009-7-29 49
优点
一个类可以继承多个接口
例如,
public class A extends B implements C,D
{
}
2009-7-29 50
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 51
内部类
定义在其它类内部的类称为 内部类
内部类有些类似于类的成员域或成员方法
2009-7-29 52
匿名内部类
没有类名
常常用在图形用户界面设计 (GUI)中,进行各种事件处理
– 例如,鼠标事件、按钮事件和键盘事件等
2009-7-29 53
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 54
变量的作用域范围
作用域范围,程序中能够使用该变量 (域与局部变量 )的范围
分类,类作用域范围 和 块作用域范围
2009-7-29 55
类作用域范围
从类定义的第一个,{”开始,到 最后一个
,}”结束
超出类的范围,类的成员方法不能直接通过它的名称进行访问
例如,
– 成员域
2009-7-29 56
块作用域范围
从变量声明之处,到该块的最后一个,}”
– 例如,局部变量与成员方法的参数
2009-7-29 57
值传递示例
// ////////////////////////////////////////////////////////
// 编写一个程序用来说明
// Java方法调用过程中
// 值传递方式
// ////////////////////////////////////////////////////////
2009-7-29 58
源程序
// 文件名,J_Primitive.java; 开发者,雍俊海
public class J_Primitive
{
public static void mb_method( int a )
{
System.out.println("在 a++之前方法参数 a=" + a);
a++;
System.out.println("在 a++之后方法参数 a=" + a);
} // 方法 mb_method结束
public static void main(String args[ ])
{
int i=0;
System.out.println("在方法调用之前变量 i=" + i);
mb_method(i);
System.out.println("在方法调用之后变量 i=" + i);
} // 方法 main结束
} // 类 J_Primitive结束
2009-7-29 59
编译、运行 & 结果
编译命令为:
javac J_Primitive.java
执行命令为,
java J_Primitive
最后执行的结果为,
在方法调用之前变量 i=0
在 a++之前方法参数 a=0
在 a++之后方法参数 a=1
在方法调用之后变量 i=0
2009-7-29 60
本章总体纲要
类、域、方法和实例对象
继承性
多态性
包 (package)
封装性
关键字 abstract,static,final和 this
接口
内部类
变量作用域范围和参数传递方式
面向对象程序设计基本思想
2009-7-29 61
示例
// ////////////////////////////////////////////////////////
// 编写一个程序用来说明
// 求解矩形和圆面积
// ////////////////////////////////////////////////////////
2009-7-29 62
按对象进行分解
1,编写文件 J_Shape.java,实现接口 J_Shape
2,编写文件 J_Circle.java,实现类 J_Circle
– 继承自接口 J_Shape
3,编写文件 J_Rectangle.java,实现类 J_Rectangle
– 继承自接口 J_Shape
4,编写文件 J_Area.java,实现类 J_Area
– 计算矩形和圆面积
– 利用类 J_Circle和类 J_Rectangle
2009-7-29 63
源程序,J_Shape.java
// 文件名,J_Shape.java; 开发者,雍俊海
public interface J_Shape
{
// 计算并返回形状的面积
public abstract double mb_getArea( );
} // 接口 J_Shape结束
2009-7-29 64
源程序,J_Circle.java
// 文件名,J_Circle.java; 开发者,雍俊海 (待续 )
public class J_Circle implements J_Shape
{
public double m_x,m_y; // 圆心坐标
public double m_radius; // 半径
public J_Circle(double r)
{
m_x = 0;
m_y = 0;
m_radius = r;
} // J_Circle构造方法结束
2009-7-29 65
源程序,J_Circle.java
// 文件名,J_Circle.java; 开发者,雍俊海 (续 )
public J_Circle(double x,double y,double r)
{
m_x = x;
m_y = y;
m_radius = r;
} // J_Circle构造方法结束
// 计算并返回形状的面积
public double mb_getArea( )
{
return (Math.PI*m_radius*m_radius);
} // 方法 mb_getArea结束
} // 类 J_Circle结束
2009-7-29 66
源程序,J_Rectangle.java
// 文件名,J_Rectangle.java; 开发者,雍俊海 (待续 )
public class J_Rectangle implements J_Shape
{
public double m_minX,m_minY; // 第一个角点坐标
public double m_maxX,m_maxY; // 另一个角点坐标
public J_Rectangle(double x1,double y1,double x2,double y2)
{
if (x1<x2)
{
m_minX = x1;
m_maxX = x2;
}
else
{
m_minX = x2;
m_maxX = x1;
} // if-else结构结束
2009-7-29 67
源程序,J_Rectangle.java
// 文件名,J_Rectangle.java; 开发者,雍俊海 (续 )
if (y1<y2)
{
m_minY = y1;
m_maxY = y2;
}
else
{
m_minY = y2;
m_maxY = y1;
} // if-else结构结束
} // J_Rectangle构造方法结束
// 计算并返回形状的面积
public double mb_getArea( )
{
return ( (m_maxY-m_minY) * (m_maxX-m_minX) );
} // 方法 mb_getArea结束
} // 类 J_Rectangle结束
2009-7-29 68
源程序,J_Area.java
// 文件名,J_Area.java; 开发者,雍俊海
public class J_Area
{
public static void main(String args[ ])
{
J_Shape a = new J_Circle( 5 );
System.out.println("半径为 5的圆的面积是 " + a.mb_getArea( ));
a = new J_Rectangle(0,0,3,4);
System.out.println("给定的矩形面积是 " + a.mb_getArea( ));
} // 方法 main结束
} // 类 J_Area结束
2009-7-29 69
作业
1,教材习题 3.9
2,教材习题 3.13
2009-7-29 70
本课件使用要求
使用本课件,必须注明引用 (具体见下一个幻灯片 )
书及课件均可能出现一些错误和缺陷,
恳切希望广大读者特别是讲授此课程的老师批评指正
2009-7-29 71
引用声明
本课件来源于 (或参考了 )下面的书及其课件,
– 雍俊海,,Java程序设计,,北京,清华大学出版社,2008.
2009-7-29 72
免责声明
请合法使用课件,其用途应当合法有益而且不应对任何人造成任何伤害或损失
同时请注意教材作者及出版社没有对本课件做出任何承诺与保证
2009-7-29 73
参考文献
本课件的参考文献与下列书的参考文献相同
– 雍俊海,Java程序设计,北京,清华大学出版社,2008.
– 雍俊海,Java程序设计教程(第 2版),北京,
清华大学出版社,2007.
– 雍俊海,Java程序设计习题集 (含参考答案 ),
北京,清华大学出版社,2006,
– 雍俊海,Java程序设计,北京,清华大学出版社,2004.
2009-7-29 74
谢谢
请多指教