You are on page 1of 73

Java 与面向 对象技术

Object-Oriented Programme 1

Java 与面向对象技术
 1、面向对象的概 念
 2、 Java 中的类、方 法和属性
 3、 Java 名字空间及 访问规则
 4、 Java 中的抽象类 、接口和程 序包
 5、对象的构造方 法

Object-Oriented Programme 2

1 、面向对象 的概念
 面向对象的方法
 分析、设计和实现一个系统的方法尽可能地接近我们认识
一个系统的方法。包括:
 面向对象的分析( OOA, Object-Oriented Analysis )
 面向对象的设计( OOD, Object-Oriented Design )
 面向对象的程序设计 (OOP, Object-Oriented Program)
 面向对象技术主要围绕以下几个概念 :
 对象
 抽象数据类型
 类、类型层次(子类)
 继承性
 多态性

Object-Oriented Programme 3

对象  对象有两个层次的概念:  现实生活中对象指的是客观世界的实体;  程序中对象就是一组属性和相关方法的集合,其 中属性表明对象的状态,方法表明对象所具有的 行为。 属性 方法 Object-Oriented Programme 4 .

抽象数据类型 抽象数据类型 现实 生活中的汽 车 Class Car 颜色 { 车门 数量 int color_number. …… 提速 void brake() { … } 减速 void speedUp() {…} 刹车 void slowDown() { … } …… } Object-Oriented Programme 5 . 最大 车速 int door_number. int speed.

什么是类呢?  类是描述对象的“基本原型”,它定义一类对象所 能拥有的数据和能完成的操作。  在面向对象的程序设计中,类是程序的基本单元。  程序的编写由定义类开始,或者说数据的类型由程序员自 己定义  再生成类的实例--对象  对象之间相互协作完成程序功能  相似的对象可以归并到同一个类中  类似传统语言中的变量与类型关系一样。  程序中的对象是类的一个实例,是一个软件单元  由一组结构化的数据和在其上的一组操作构成。 Object-Oriented Programme 6 .

…… …… Car carBlue. Object-Oriented Programme 7 . Car carYellow.现实生活中的相同事物与程序中的对象 Car carRed.

brake(). 对象的成员与对象间的通信  字段 / 属性:  指对象的数据单元,指示对象的状态  方法:  指对象的功能单元,指示对象的行为  消息  软件对象通过相互间传递消息来相互作用和通信,一个消 息由三部分组成 :  1. 接受消息的对象 消息  2. 方法需要的参数 mycar. 对象 B 对象 A 8 Object-Oriented Programme . speedUp(50). mycar. 接收对象要采取的方法  3.

showString(). 一个例子  在程序中所操作的 class Hello 属性 方法  对象是类的一个实例。 { private String s ; showString()  创建一个对象: public void showString()  Hello obj=new Hello().  调用方法: }  obj.println(s). { System. public void changeString(String str) { s = str. 方法 } changeString() }  调用对象的方法相当于给对象发送消息  收到消息的对象通过改变自身的状态或者向其它对 象发送消息来响应消息。 Object-Oriented Programme 9 .out.

为什么要使用类?  如果没有使用类  采用简单数据类型表示现实世界中概念的局存在很大的限 性。例如:采用 int 型数据表示一个日期概念,需要使用 3 个变量:  int day.  表示2 个人的生日,要使用 6 个变量  并且在使用中必须时刻注意三者的联系和约束关系  同时在使用日期概念时要同时对三个变量进行访问   使用类可以把现实问题中的对象映射为程序中的一 个整体——类。  如使用日期类型 Date. 只需使用管理一个对象变量 Object-Oriented Programme 10 . month. year.

为什么要使用类? • 类中不但有变量 ( 称为属性 ) ,还有与之相关 的操作所定义的方法。 • 将变量和方法封装在一个类中,可以对成员 变量 ( 成员属性 ) 进行隐藏 ,外部对类成员 的访问都通过方法进行, • 保护类成员不被 非法修改 。 Object-Oriented Programme 11 .

还是生日的例子 class BirthDate  BirthDate date. Object-Oriented Programme 12 .day 已经为 31 ,操作结果是非法状态 } 怎么办? BirthDate mybirth.day =date.year. yourbirth. { private int day.  已知当前日期对象,想计算第 2 天的日期对象 public int tomorrow() : {  date.day+1.month.  可以定义一个 public 成员方法 tomorrow() , 求第 2 天的日期对象。保证日期值在有效的范 围之内  外部要获得当前日期的后一天时,只要调用: date. // 合适吗? …… }  如果 date.tomorrow().

面向对 象的概念— —封装  封装把对象的所有组成部分组合在一起  封装定义程序如何引用对象的数据,封装实际上 使用方法将类的数据隐藏起来,控制用户对类的 修改和访问数据的程度。 公有 数据 数据 私有 数 据 方 方 法 法 对象 A 对象 B Object-Oriented Programme 13 .

面向对 象的概念 - 子类 子类是作为另一个类的扩充或修正而定义的一 个类。 bicycle (super class) sub class Mountain bikes Racing bikes Tandem bikes Object-Oriented Programme 14 .

int speed. 面向对 象的概念 - 继承  继承是子类利用父类中定义的方法和属性,就 像它们属于子类本身一样。 class Car { class Trash_Car extends Car int color_number. { int door_number. public void fill_trash() public void push_break() { { … … } } } public void add_oil() { … } } Object-Oriented Programme 15 . double amount.

public void add_oil() { … } } } } Object-Oriented Programme 16 . class Trash_Car extends Car int door_number. public void push_break() public void fill_trash() { … } { public void push_break() speed = 0. double amount. 面向对 象的概念 - 方法的覆盖  方法的覆盖  子类中可以重新定义父类中已有的方法  体现出子类自己的行为。 class Car { int color_number. { } speed = speed – 10. { int speed.

int len).  还有众多的 println()…… Object-Oriented Programme 17 .23 void show(double double_num) 123.23 void show(int int_num. float float_num)  例如对于 StringBuffer 类,它有方法  public StringBuffer append(int i). 面向对 象的概念 -方 法的重载( 多态性 )  重载指得是在同一个类中至少有两个方法使用同一个名字, 但有不同的参数。 void show(int int_num) 123 类 1.  public StringBuffer append(double d).1.  public StringBuffer append(char[] str.  public StringBuffer append(String s). int offset.

2 、 Java 中的类、方法和字段  类、方法、字段定义的语法规范  对象的创建和使用  继承、覆盖、重载、多态等概念  内嵌类 (inner class) Object-Oriented Programme 18 .

类定义的语法规范  类的严格定义及修饰字 [ 类的修 饰字 ] class 类名称 [extends 父类名称 ][implements 接口 名称列表 ] { 属性定 义及初 始化 ;类体 ,其 中定义 了该 类中所 有的 属性 和该类 所支 持的方 方法定 义及方 法体 ;法, 称为 成员属 性和 成员方 法。 }  类的修饰字:  [public] [abstract | final]  缺省方 式为 friendly Object-Oriented Programme 19 .

属性的定义及修饰字 [ 属性修饰 字 ] 属性数 据类 型 属 性名 1. [public | protected | private ] [static] [final ] [transient ][volatile]  成员属性的类型可以是Java 中任意的数据类 型,包括简单类型,类,接口,数组。在一个 类中的成员属性应该是唯一的。 Object-Oriented Programme 20 . 属性名 2[= 属性初 值 ]….

) // 方法体:方法的 内容 } [public | protected | private ] [static] [final | abstract] [native] [synchronized]  返回类型可以是任意的 Java 数据类型,当一 个方法不需要返回值时,返回类型为 void 。  参数的类型可以是简单数据类型,也可以是引 用数据类型(数组、类或接口),参数传递方 式是值传递。  方法体是对方法的实现。它包括局部变量的声 明以及所有合法的 Java 指令。局部变量的作 用域只在该方法内部。 21 Object-Oriented Programme .…) [throws exceptionList] { …(statements. 方法的定义及修饰字 [ 方法修 饰字 ] 返回 类型 方 法名称 ( 参数 1. 参数 2.

sb). // 此语句 不起 作用 sb.out. StringBuffer sb) { s = “aaaa”. change(s. sb.append(“aaaa”). 参数的传递方式是值传递 class A { static void change(String s. } public static void main(String args[]) { String s = “bbbb”.println(s). } 输出结果: } bbbb aaaa Object-Oriented Programme 22 .setLength(0). StringBuffer sb = new StringBuffer(“bbbb”). System.println(sb).out. System.

show_number(). } } } void show_number() { System. { Car Democar=new Car(). car_number=car_num. } } My car No. void set_number(int car_num) DemoCar. is : ”+car_number).out.println (“My car No. 一个简单的类 class CarDemo class Car { public static void main(String args[]) { int car_number. { DemoCar.set_number(3838). is : 3838 Object-Oriented Programme 23 .

 demoCar = new Car(). ( 2 )对象的构造过程  为对象开辟空间,并对对象的成员属性进行缺省的初始化 ;  对成员属性进行指定的初始化;  调用构造方法。 Object-Oriented Programme 24 . 对象  类是说明书 / 图纸,对象是产品,怎么生产呢?  ( 1 )对象的生成  通过 new 操作符生成一个对象;例如:  Car demoCar.

day = date. int day.day. 对象 3 )对象的使用 ( 对象的使用是通过一个引用类型的变量 来实现,包括引用对象的成员属性和方法,通 过运算符 · ( 句点 ) 可以实现对属性的访问和 方法的调用。如: BirthDate date. // 调用 date 的方法 tomorrow() Object-Oriented Programme 25 . // 引用 date 的成员属性 day date.tomorrow().

类的继承
class Car
{
int car_number;
void set_number(int car_num)
{
car_number=car_num;
}

void show_number()
{
System.out.println (“My 26
Object-Oriented Programme
car No. is :”+car_number);

继承
class TrashCar extends Car
{
int capacity;
void set_capacity(int trash_car_capacity)
{
capacity=trash_car_capacity;
}
void show_capacity()
{
System.out.println(“My capacity is:
” + capacity);
}
}

Object-Oriented Programme 27

继承
 Car
是父类, TrashCar 是子类。 TrashCar
中继承了 Car 中的两个方法,同时又增加了
两个新方法。
class CarDemo
{
public static void main(String args[])
{
TrashCar demoTrashCar = new TrashCar();
demoTrashCar.set_number(4949);
demoTrashCar.show_number(); 继承的方 法
demoTrashCar.set_capacity(20);
demoTrashCar.show_capacity(); 新增加的 方法
}
}
Object-Oriented Programme 28

继承  继承性是面向对象程序设计语言的另一基本 特征,通过继承可以实现代码的复用。  继承而得到的类为子类,被继承的类为父类, 父类包括所有直接或间接被继承的类。 Java 中不支持多重继承。通过在类的声明中加入 extends 子句来创建一个类的子类: class SubClass extends SuperClass { …… } Object-Oriented Programme 29 .

Object 的子类。  子类可以继承父类中访问权限设定为 public 、 protected 、 default 的成员属性和 方法  不能继承访问权限为 private 的成员属性和方 法。 Object-Oriented Programme 30 .lang. 继承  Object 是所有类的祖先!  如果缺省 extends 子句,则该类为 java.

何时选择继承 ?  一个很好的经验:“ B 是一个 A 吗 ?”  如果是则让 B 做 A 的子类 . 常犯的 错误 A 有一个 B 吗 ? 例如 让汽车 轮子成为 汽车的子类 是错 误的 Object-Oriented Programme 31 .

继承 Shape Shape Point Circle Cylinder Point Circle 在更多的时候,组成 (聚 集) 关系比继承更能使系统具有高度 的灵活性,可维护行,并且提高 Cylinder 系统的可重用性。 Object-Oriented Programme 32 .

speed = speed – 10. } } public void add_oil() { … } } } Object-Oriented Programme 33 . { int door_number. 类方法的覆盖  方法覆盖  在子类中重新定义父类中已有的方法 class Car class Trash_Car extends Car { int color_number. double amount. int speed. public void fill_trash() { … } public void push_break() public void push_break() { { speed = 0.

push_break( ). push_break( ) 方 aCar. } 法将被调用。 } Object-Oriented Programme 34 . 覆盖方法的调用  对于重写的方法, Java 运行时系统根据调 用该方法的实例的类型来决定选择哪个方法调 用。 public class DemoCar { public static void main( String args[ ] ) 在这里, 类 { Trash_Car 中的 Car aCar = new Trash_Car( ).

覆盖后的方法不能比被覆盖的方法有更严格的访 问权限。 2. 方法覆盖时应遵循的原则 1. 覆盖后的方法不能比被覆盖的方法产生更多的异 常。 Object-Oriented Programme 35 .

println(String). 类方法的重载  方法重载  多个方法可以享有相同的名字。  这些方法的参数必须不同,或者是参数个数不同, 或者是参数类型不同。  例如,要打印不同类型的数据, int. 不需要 定义不同名的方法:  printInt(int). printString(String) 。  利用方法重载,只需要定义一个方法名: println() ,接 收不同的参数:  println(int). float. println(float). String. printFloat(float).  Object-Oriented Programme 36 .

// 合法语句  通过instanceof 可以判断父类引用所引用的对象实 例的实际类型。 Object-Oriented Programme 37 . 多态性  类方法的重载是一种多态性。  程序中需要使用父类对象的地方,都可以用子类对 象来代替。 例如: public class Employee extends Object {……} public class Manager extends Employee {……}  则: Employee e = new Manager().

} …… } Object-Oriented Programme 38 . …… void setX(int var ) { x = var. 成员属性的隐藏  可以用方法来实现对成员属性的隐藏:  设置属性方法: setVariable()  获取属性方法: getVariable() class Sample { protected int x. } int getX() { return x.

对象状态的确定 Java 语言中,提供了操作符 instanceof 用 在 来判断对象是否属于某个类的实例。 public void method (Employee e) { if ( e instanceof Manager ) { …//do something as a Manager Employee } else if ( e instanceof Contractor ) { …//do something as a Contractor } Manager Contractor else { … //do something else } } Object-Oriented Programme 39 .

内嵌类( inner class ) 在一个类的内部声明的类,称为内嵌类。  内嵌类只能在包含它的类中使用,同时它可 以看作是该包含类的一段特殊代码,可以直接 使用该包含类的属性和方法。  内嵌类编译后也会形成一个单独的 class ,但 它附属于其包含类。 Object-Oriented Programme 40 .

} } } Object-Oriented Programme 41 .elementAt(currentItem--).. 内嵌类( inner class )例子 public class Stack { private Vector items..size() . } public Object nextElement() { if (!hasMoreElements()) throw new NoSuchElementException().1.//code for Stack's methods and constructors not shown. else return items... public boolean hasMoreElements() { return (currentItem >= 0). public Enumeration enumerator() { return new StackEnum(). } class StackEnum implements Enumeration { int currentItem = items. .

3 、 Java 名字空间及访问规则  每个类都拥有自己的名字空间,  类及其方法和属性可以在一定的范围内知道彼此 的存在,可以相互使用。  对类而言:  abstract 类:不能直接产生属于这个类的对象;  final 类:不能被其他任何类所继承 ( 安全的考 虑);  public 类:不但可以被同一程序包 (package) 中的 其它类使用,别的程序包中的类也可以使用;  friendly 类 ( 缺省,包访问类 ) :只能被本程序包 中的其它类使用,不能被别的程序包中的类使用 42 Object-Oriented Programme .

访问权限  当一个类可以被访问时,对类内的成员属性 和成员方 法而言,其应用范围可以通过施以 一定的来限定。 可访问性 同类中 同包中 不同包的子类 不同包非子类 (任意类) private ★ default ★ ★ protected ★ ★ ★ public ★ ★ ★ ★ Object-Oriented Programme 43 .

访问权限  public: 任何其它类、对象只要可以看到这个 类的话,那么它就可以存取属性的数据,或使 用方法。  protected :同一类,同一包可以使用。不同 包的类要使用,必须是该类的子类。  private :不允许任何其他类存取和调用。  friendly(default ,前边没有修饰字的情况 ) : 在同一程序包中出现的类才可以直接使用它的 数据和方法 . Object-Oriented Programme 44 .

data_a=5 Object-Oriented Programme 45 .out. 注意 n 当子类中的属性名与父类的相同,父类的属性 被遮盖。 class A class B extends A { { int data_a=3.println(“A.println(“data_a= ”+data_a).data_a= ”+A.out.data_a=3 c. } } class C extends B { void print_out() { System.data_a).data_a= ”+B.println(“B.data_a). int data_a = 5. } } class demo { data_a=5 public static void main(String args[]) { C c = new C(). } } B. A. System. System.out.println_out().

final :到此为止  final 在类之前  表示该类是最终类,不能再被继承及扩展。  final 在方法之前  表示该方法是最终方法,该方法不能被任何派生 的子类覆盖。  final 在属性之前  表示属性的值在初始化之后就不能再改变;相当 于定义了一个常量。 Object-Oriented Programme 46 .

static :类属性和类方法  static 在属性或方法之前,表明它们是属于类 的,称为类方法(静态方法)或类属性(静态 属性)。  若无 static 修饰,则是实例方法和实例属性。  类属性在各实例间共享 object d char data class ABCD { char data. char datashare_data char data } class Demo { Object b ABCD a.c.d. } char data Object-Oriented Programme 47 .b. object a static int object c static int share_data.

number. } Object-Oriented Programme 48 } . number =5.out public class StaticVar static { { public static int number = 5. } } public class OtherClass { public void method() { int x = StaticVar. static :类属性和 类方法  类属性 的生存期不依赖于对象,相当于 C语 言中全局属性的作用。  其它类可以不用通过创建该类的实例,直接通 过类名访问它们。如 System.

} Object-Oriented Programme 49 } .b).addUp(a. int b =10.int y) { return x+y. } } public class UseGeneral { public void method() { int a = 9. static :类属性和类方法  类方法 则相当于 C 语言中的全局函数,其他的类也 可以直接通过类名来访问类方法。  Java 程序的入口方法 main() 就是一个类方法  Java 中的数学计算的函数公式都是类方法! (Demo) public class GeneralFunction { public static int addUp(int x. int c = GeneralFunction.

static :类属性和类方法  同一个类的实例方法可以访问该类的类属性 和类方法;  而类方法只能访问该类的类属性和类方法, 不能直接访问实例的属性和方法。 Object-Oriented Programme 50 .

out.println(mystring).println(mystring).” 。  为什么不正确: 不能对非静态字段 mystring 进行静态引用! 此时的 mystring 还没有实例化! 51 Object-Oriented Programme . 一个例子  不正确的引用 class StaticError { String mystring=“hello”. } }  编译时错误信息: nonstatic variable mystring cannot be referenced from a static context “System.out. public static void main(String args[]) { System.

解决的办法  1.println(mystring). } } Object-Oriented Programme 52 .out. 将属性改成类 属性 class NoStaticError { static String mystring=“hello”. public static void main(String args[]) { System.

System.out. noError = new NoStaticError(). 解决的办法  2. } } Object-Oriented Programme 53 .mystring). 先创建 一个 类的实 例 class NoStaticError { String mystring=“hello”.println(noError. public static void main(String args[]) { NoStaticError noError.

4 、 Java 中的抽象类、接口和程序包  抽象类  接口  程序包 Object-Oriented Programme 54 .

Object-Oriented Programme 55 . 抽象类与抽象方法  抽象类:用abstract 关键字来修饰一个类时,该类 叫做抽象类;  抽象类必须被继承。  抽象类不能被直接实例化。它只能作为其它类的超类,这 一点与最终类( final 类)正好相反。  抽象方法:用abstract 来修饰一个方法时,该方法 叫做抽象方法。  抽象方法必须被重写  抽象方法只有声明,不能有实现。  定义了抽象方法的类必须是抽象类。  abstract returnType abstractMethod ( [paramlist] ).

height. // 这里不需 "this" this. Circle(float r) Rectangle (float w.r = r. public float width. } } public float area() public float area() { { return 3. 先看这个例子  两个类 Circle 和 Rectangle ,完成相关参数的 计算 class Circle class Rectangle { public float r. } } } Object-Oriented Programme 56 .14*r*r. float h) { { width = w. return width*height. //this 指 " 这个 对象的 " height = h.

i++) { area_total += shape[i].length. } Object-Oriented Programme 57 .area(). 问题的提出 Circle ,以及若干个 Rectangle ,希  假设有若干个 望计算它们的总面积,  直截了当的做法是将它们分别放到两个数组中,用两个循 环,加上一个加法,这种做法是不漂亮的。  如果还有其它形状: Triangle , Ellipses 等,上述 方法显得“累赘”。  能不能这样呢?  我们希望有一种统一的表示,例如用一个数组 shape[] , 接受所有的形状,然后用: for (i=0. i<shape.

// 这里不需 "this" this. return width*height. } } } } Object-Oriented Programme 58 . public float width. } } public float area() public float area() { { return 3. float h) { { width = w. } class Circle extends Shape class Rectangle extends Shape { { public float r. Circle(float r) Rectangle (float w.14*r*r. 抽象类与抽象方法 abstract class Shape { abstract float area().height. //this 指 " 这个对象的 " height = h.r = r.

Interface 接口  接口方法定义和常量值的集合。  从本质上讲,接口是一种特殊的抽象类,这种 抽象类中只包含常量和方法的定义,而没有方 法的实现。  通过接口可以实现不相关类的相同行为,而不需 要考虑这些类之间的层次关系。  通过接口可以指明多个类需要实现的方法。  通过接口可以了解对象的交互界面,而不需了解 对象所对应的类。 Object-Oriented Programme 59 .

java 文件中 Object-Oriented Programme 60 . 接口的定义 [public] interface interfaceName [extends SuperInterfaceList] { …… // 常量定义和方法定义 }  接口( interface )作为特殊形式的抽象类, 和类( class )在使用上具有类似的约束。  与类继承不同,一个接口可以继承多个父接口  一个 public 接口只能定义在同名的 .

接口说 明  用 implements 子句来表示一个类使用某个 接口。  在类体中可以使用接口中定义的常量,而且 必须实现接口中定义的所有方法。  利用接口可实现多重 继承,即一个类可以实 现多个接口,在 implements 子句中用逗号分 隔。  接口的作用和抽象类相似,只定义原型,不直 接定义方法的内容。  接口中的方法和属性必须是 public 的。 Object-Oriented Programme 61 .

} int currentCount() int currentCount ( ). …… Object find (Object obj). 接口 class FIFOQueue implements Collection { void add ( Object obj ) { …… } interface Collection void delete( Object obj ) { { …… int MAX_NUM=100. } void add (Object obj). { } …… } Object-Oriented Programme 62 } . Object find( Object obj ) { void delete (Object obj).

java.util 类包中的一些接口  Demo In API DOC <<interface>> Collection AbstractCollection <<interface>> AbstractList List LinkedList ArrayList Object-Oriented Programme 63 .

程序包(类包) Java 编译器为每个类生成一个字节码文  由于 件,且文件名与类名相同,因此同名的类有可 能发生冲突。为了解决这一问题, Java 提供 包来管理类名空间。  程序包相当于其它语言中的库函数。或命名空 间 Object-Oriented Programme 64 .

如何打包  Java中用 package 语句来将一个 Java 源文件中的 类打成一个包。  package 语句作为 Java 源文件的第一条语句,指明 该文件中定义的类所在的包。 ( 若没有该语句,则指 定为无名包 / 或叫缺省包 ) 。  它的格式为:  package pkg1[. ( 句点 ) 来指明目录的层次。 Object-Oriented Programme 65 .  Java 编译器把包对应于文件系统的目录管理, package 语句中,用 .pkg2[.pkg3…]].

这条语句指定 这个包中的文件存储在目录 path/myclass/graphics 下。  包层次的根目录 path 是由环境变量 CLASSPATH 来确定的。 Object-Oriented Programme 66 .} class Triangle {…. Square.}  package myclass.java class Square {….} class Circle {….graphics. Java 用目录来组织类包 package myclass.graphics.

class 文件 都放到 destpath/ myclass/graphics 下。  destpath 应该是环境变量 CLASSPATH 中指 定的 Object-Oriented Programme 67 .java  编译器会自动在 destpath 目录下建立子目录 myclass/graphics ,并将生成的 .java 中已定义了 myclass. 编译和生成包  如在前面 Square.graphics ,编译时可以采用如下方 式:  javac [-d destpath] Square.

io.(classname |*).* ;  import java. 使用其它的类  为了能使用 Java 中已提供的类,我们需要用 import 语句来引入所需要的类。  import package1[.package2…].* ; graphics myclass 由环境 变量 CLASSPATH 确定 Square Object-Oriented Programme 68 .graphics.  Import 须出现在任何类定义之前  例如:  import path myclass.

5 、对象的构造方法  构造方法 (Constructor) 是一种特殊的方法。 Java 中 的每个类都有构造方法,用来初始化该类的一个新 的对象。  构造方法具有和类名相同的名称,而且不返回任何 数据类型。  系统在产生对象时会自动执行。  构造方法应包含的内容:  定义一些初值或内存配置工作;  一个类可以有多个构造方法 ( 重载 ) ,根据参数的不同决 定执行哪一个;  如果程序中没有定义构造方法,则创建实例时使用的是 缺省构造方法,它是一个无内容的空方法。 Object-Oriented Programme 69 .

} } Object-Oriented Programme 70 . 例子 public class Employee{ private String name. } public Employee() { this(“Unknown”). } public Employee(String n){ this(n.0). public Employee(String n. salary = s.int s) { name = n. private int salary.

} } } Object-Oriented Programme 71 . { } return r*r*3. Bank bank=new Bank().r=r. Circle(int r) public static void main() { { this. } public area() bank.someMethod(this). 关键字 this this 指向自己的引用,它的一个主要作用是要将自己这 个对象当作参数,传送给别的对象中的方法。 class Circle class ThisClass { { int r.14.

关键字 super super 指这个对象的父类。 super 可以用来引用父类中的 ( 被覆 盖的 ) 方法、 ( 被隐藏的 ) 属性及构造方法。 public class apple extends fruits { public apple(int price) { super(price). } } 以上程序表示使用父类的构造方法生成实例, super 必须是子类构造方法的第一条语句。 Object-Oriented Programme 72 .method(paraList).var = value. super. super.

Finalize 方法  在对对象进行垃圾收集前, Java 运行时系统会自动调用对象 的 finalize() 方法来释放系统资源。该方法必须按如下方式声 明: protected void finalize() throws throwable {……}  finalize() 方法是在 java.lang. } Object-Oriented Programme 73 .finalize().Object 中实现的,在用户自定义 的类中,它可以被覆盖,  在改方法的最后要调用父类的 finalize() 方法来清除对象所使 用的所有资源。 protected void finalize() throws throwable { …… // 释放本类中使用的资源 super.