第五章对象和类 本模块是Java编程语言中讨论面向对象语句及面向对象特征两部分中的第一部分。 object-Oriented Programming Develo ping Graphical User Interfaces ThaW avFondyice andO Nandang 第一节相关问题 讨论一下面的问题与本模块中出现的材料相关: 到目前为止学习的Java编程语言的元素存在于大部分语言中,不管它们是否是面向对象语言 Java编程语言拥有什么特征使它成为一个面向对象语言? 面向对象”这个术语真正的含义是什么? 第二节目标 学完本模块,你便能: 定义封装、多态性以及继承 使用 private及 public访问修饰符 开发程序段创建并初始化一个对象 对一个特殊对象调用一个方法 描述构造函数及方法重载 描述ths引用的用途 讨论为什么Java应用程序代码是可重复使用的 在一个Java程序中,确认 - package语句 Import语句
85 第五章 对象和类 本模块是 Java 编程语言中讨论面向对象语句及面向对象特征两部分中的第一部分。 第一节 相关问题 讨论—下面的问题与本模块中出现的材料相关: - 到目前为止学习的 Java 编程语言的元素存在于大部分语言中,不管它们是否是面向对象语言。 - Java 编程语言拥有什么特征使它成为一个面向对象语言? - “面向对象”这个术语真正的含义是什么? 第二节 目 标 学完本模块,你便能: - 定义封装、多态性以及继承 - 使用 private 及 public 访问修饰符 - 开发程序段创建并初始化一个对象 - 对一个特殊对象调用一个方法 - 描述构造函数及方法重载 - 描述 this 引用的用途 - 讨论为什么 Java 应用程序代码是可重复使用的 - 在一个 Java 程序中,确认: - package 语句 - import 语句
-类、成员函数以及变量 构造函数 重载方 覆盖方法 父类构造函数 第三节对象基础 面向对象程序(OOP)语句能使现实世界中的概念在计算机程序中变成模块。它包括构造程序的特征以及组织数据 和算法的机制。OOP语言有三个特征:封装、多态性及继承。所有这些特征与类的概念是息息相关的 531抽象数据类型 当数据类型是由数据项组成时,可以定义许多程序段或方法在该类型数据上专门运行。当程序语言定义一个基本类 如整数时,它同时也定义了许多运算方法(如加法、减法、乘法和除法),因而它可以在该类型的实例中运行。 在许多程序语言中,一旦一个集合数据类型已经定义,程序员定义应用函数在该类型的变量上运行,该变量在代 码和集合类型(除非可能在命名规则中)之间无任何联系。 有些程序语言,包括Java,允许在数据类型的声明和操作该类型变量的代码的声明之间有紧密的联系。这种联系通 常被称为抽象数据类型 532类和对象 Java编程语言中的抽象数据类型概念被认为是clas。类给对象的特殊类型提供定义。它规定对象内部的数据,创建 该对象的特性,以及对象在其自己的数据上运行的功能。因此类就是一块模板。 Objects是在其类模块上建立起来的,很 象根据建筑图纸来建楼。同样的图纸可用来建许多楼房,而每栋楼房是它自己的一个对象。 应该注意,类定义了对象是什么,但它本身不是一个对象。在程序中只能有类定义的一个副本,但可以有几个对象 作为该类的实例。在Java编程语言中使用new运算符实例化一个对象。 在类中定义的数据类型用途不大,除非有目的地使用它们。方法定义了可以在对象上进行的操作,换言之,方法定 义类来干什么。因此Java编程语言中的所有方法都属于一类。不象C++程序,Java软件程序不可能在类之外的全局区域 有方法。 看一个类的例子 class EmpInfo i string name String designation String department
86 - 类、成员函数以及变量 - 构造函数 - 重载方法 - 覆盖方法 - 父类构造函数 第三节 对象基础 面向对象程序(OOP)语句能使现实世界中的概念在计算机程序中变成模块。它包括构造程序的特征以及组织数据 和算法的机制。OOP 语言有三个特征:封装、多态性及继承。所有这些特征与类的概念是息息相关的。 5.3.1 抽象数据类型 当数据类型是由数据项组成时,可以定义许多程序段或方法在该类型数据上专门运行。当程序语言定义一个基本类 型如整数时,它同时也定义了许多运算方法(如加法、减法、乘法和除法),因而它可以在该类型的实例中运行。 在许多程序语言中,一旦一个集合数据类型已经定义,程序员定义应用函数在该类型的变量上运行,该变量在代 码和集合类型(除非可能在命名规则中)之间无任何联系。 有些程序语言,包括 Java,允许在数据类型的声明和操作该类型变量的代码的声明之间有紧密的联系。这种联系通 常被称为抽象数据类型。 5.3.2 类和对象 Java 编程语言中的抽象数据类型概念被认为是 class。类给对象的特殊类型提供定义。它规定对象内部的数据,创建 该对象的特性,以及对象在其自己的数据上运行的功能。因此类就是一块模板。Objects 是在其类模块上建立起来的,很 象根据建筑图纸来建楼。同样的图纸可用来建许多楼房,而每栋楼房是它自己的一个对象。 应该注意,类定义了对象是什么,但它本身不是一个对象。在程序中只能有类定义的一个副本,但可以有几个对象 作为该类的实例。在 Java 编程语言中使用 new 运算符实例化一个对象。 在类中定义的数据类型用途不大,除非有目的地使用它们。方法定义了可以在对象上进行的操作,换言之,方法定 义类来干什么。因此 Java 编程语言中的所有方法都属于一类。不象 C++程序,Java 软件程序不可能在类之外的全局区域 有方法。 看一个类的例子: class EmpInfo { String name; String designation; String department;
这些变量name, designation和 department)被称为类 Emplnfo的成员 实例化一个对象,创建它,然后如下所述对其成员赋值 EmpInfo employee new Emp Info();//creates ins tance employee name Robert Javaman // initializes employee des ignation ="Manager "; // the three employee department ="Co ffee shop ";// members Emplnfo类中的 employee对象现在就可以用了。例如: System. out. println(emp loyee name +"is"+ employee designation employee department) 打印结果如下 Robert Javaman is Manager at Coffee Shop 如下所述,现在可以在类中放入方法 printi()来打印数据了。数据和代码可以封装在一个单个实体中,这是面向对象语 言的一个基本特征。定名为prn()的代码段可以被作为一个方法而调用,它是术语“函数”的面向对象的称法 class EmpInfo string designation String depa d print()t System. out. println(name + is " designation t at department)i 旦对象被创建并被实例化,该方法就打印出类成员的数据。按下述步骤实现 EmpInfo employee new Emp Info();// creates instance employeename Robert Javaman "i// initializes employee designation =Manager / the three employee department ="Coffee Shop / membe employee. print()i// prints the details 看看集合数据类型 My Date和对下一个日期赋值的函数 tomorrow()
87 } 这些变量(name, designation 和 department)被称为类 EmpInfo 的成员。 实例化一个对象,创建它,然后如下所述对其成员赋值: EmpInfo employee = new EmpInfo(); //creates instance employee.name = Robert Javaman "; // initializes employee.designation = " Manager " ; // the three employee.department = " Coffee Shop " ; // members EmpInfo 类中的 employee 对象现在就可以用了。例如: System.out.println(employee.name + " is " + employee.designation + " at " + employee.department); 打印结果如下: Robert Javaman is Manager at Coffee Shop 如下所述,现在可以在类中放入方法 print( )来打印数据了。数据和代码可以封装在一个单个实体中,这是面向对象语 言的一个基本特征。定名为 print( )的代码段可以被作为一个方法而调用,它是术语“函数”的面向对象的称法。 class EmpInfo { String name; String designation; String department; void print() { System.out.println(name + " is " + designation + " at " + department); } } 一旦对象被创建并被实例化,该方法就打印出类成员的数据。按下述步骤实现: EmpInfo employee = new EmpInfo(); // creates instance employee.name = " Robert Javaman " ; // initializes employee.designation = " Manager " ; // the three employee.department = " Coffee Shop " ; // members employee.print();// prints the details 看看集合数据类型 MyDate 和对下一个日期赋值的函数 tomorrow( )
按如下所述在 My Date类型和 tomorrow()方法之间创建一种联系 public ncrement day 注一本声明中的“priv 方法不是(作为分离的实体)在数据上运行,而数据(作为对象的一部分)对它本身进行操作。 这个注释表明行为是由对象而不是在对象上完成的。记住,可以用点记号来指向 MyDate类中的字段。 这就意味着“ My Date对象的day字段由变量d调用。于是,前面的例子“ My Date对象的 tomorrow行为由变量d调 用”,换言之,就是d对象对它本身进行 tomorrow()运算 方法是一个对象的属性并且能作为单个单元的一部分与它所在对象的数据发生密切的相互作用,这个是一个关键的 面向对象的概念。(如果与这个概念不同,即,方法是分离的实体,从外部引入,作用在数据上。) message passing(消息 传递)这个术语通常用来表达这样一个概念,即:指示一个对象在它本身数据上做某项工作,一个对象的方法定义了该 对象能在它本身数据上做什么 533定义方法 定义方法 方法声明采取这样的格式 <modifiers> <return type> <name>([<argument list>]) <block> [throws <exception>]i<block>) public void addDays(int day s)t Java编程语言使用一种与其它语言,尤其是C和C++,非常相似的办法来定义方法。其声明采用以下格式: <modifiers> <return type> <name>([<argument list>])<block>[throws <exception>][<block>) <name>可以是任何合法标识符,并带有用己经使用的名称为基础的某些限制条件 return_type>表示方法返回值的类型。如果方法不返回任何值,它必须声明为void(空)。Java技术对返回值是很 严格的,例如,如果声明某方法返回一个int值,那么方法必须从所有可能的返回路径中返回一个nt(只能在等待返回该 int值的上下文中被调用。) < modifiers>段能承载许多不同的修饰符,包括公共的、受保护的,以及私有的。公共访问修饰符表示方法可以从 任何其它代码调用。私有表示方法只可以由该类中的其它方法来调用。受保护将在以后的课程中讨论 < argument1ist>允许将参数值传递到方法中。列举的元素由逗号分开,而每一个元素包含一个类型和一个标识
88 按如下所述在 MyDate 类型和 tomorrow( )方法之间创建一种联系: public class MyDate { private int day, month, year; public void tomorrow() { // code to increment day } } 注—本声明中的“private”一词将在后文描述。 方法不是(作为分离的实体)在数据上运行,而数据(作为对象的一部分)对它本身进行操作。 MyDate d = new MyDate(); d.tomorrow(); 这个注释表明行为是由对象而不是在对象上完成的。记住,可以用点记号来指向 MyDate 类中的字段。 这就意味着“MyDate 对象的 day 字段由变量 d.调用。于是,前面的例子“MyDate 对象的 tomorrow 行为由变量 d.调 用” ,换言之,就是 d 对象对它本身进行 tomorrow()运算。 方法是一个对象的属性并且能作为单个单元的一部分与它所在对象的数据发生密切的相互作用,这个是一个关键的 面向对象的概念。(如果与这个概念不同,即,方法是分离的实体,从外部引入,作用在数据上。)message passing(消息 传递)这个术语通常用来表达这样一个概念,即:指示一个对象在它本身数据上做某项工作,一个对象的方法定义了该 对象能在它本身数据上做什么。 5.3.3 定义方法 定义方法 方法声明采取这样的格式: <modifiers> <return_type> <name> ([<argument_list>]) <block> [throws <exception>] {<block>} public void addDays(int days) { } Java 编程语言使用一种与其它语言,尤其是 C 和 C++,非常相似的办法来定义方法。其声明采用以下格式: <modifiers> <return_type> <name> ([<argument_list>]) <block> [throws <exception>] {<block>} <name>可以是任何合法标识符,并带有用已经使用的名称为基础的某些限制条件。 <return_type>表示方法返回值的类型。如果方法不返回任何值,它必须声明为 void(空)。Java 技术对返回值是很 严格的,例如,如果声明某方法返回一个 int 值,那么方法必须从所有可能的返回路径中返回一个 int(只能在等待返回该 int 值的上下文中被调用。) <modifiers>段能承载许多不同的修饰符,包括公共的、受保护的,以及私有的。公共访问修饰符表示方法可以从 任何其它代码调用。私有表示方法只可以由该类中的其它方法来调用。受保护将在以后的课程中讨论。 <argument_list>允许将参数值传递到方法中。列举的元素由逗号分开,而每一个元素包含一个类型和一个标识
付 throws< exception>子句导致一个运行时错误(异常)被报告到调用的方法中,以便以合适的方式处理它。非正 常的情况在< exception>中有规定。 例如 public void addDa ys (int days)t 告诉方法的本体,用<bock>,来接受表示将天数增加到当前日期中的那个参数。在这种方法中,值是以标识符days 来引用的 534值传递 值传递 ava编程语言只由值传递参数 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用 对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的 Java编程语言只由值传递参数,也就是说,参数不能由被调用的方法来改变。当一个对象实例作为一个参数传递到 方法中时,参数的值就是对象的引用。对象的内容可以在被调用的方法中改变,但对象引用是永远不会改变的 下面的代码例子可以阐明这一点: // Methods to change the current values public void changeInt (int value) t public void changestr (String value) value new string different )i public void changeobjValue (Pas sTest ref)t ref. ptvalue =99Of ublic static void main (String args[])t
89 符。 throws <exception>子句导致一个运行时错误(异常)被报告到调用的方法中,以便以合适的方式处理它。非正 常的情况在<exception>中有规定。 例如: public void addDays(int days) { } 告诉方法的本体,用<block>,来接受表示将天数增加到当前日期中的那个参数。 在这种方法中,值是以标识符 days 来引用的。 5.3.4 值传递 值传递 Java 编程语言只由值传递参数 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。 对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。 Java 编程语言只由值传递参数,也就是说,参数不能由被调用的方法来改变。当一个对象实例作为一个参数传递到 方法中时,参数的值就是对象的引用。对象的内容可以在被调用的方法中改变,但对象引用是永远不会改变的。 下面的代码例子可以阐明这一点: 1 public class PassTest { 2 3 float ptValue; 4 5 // Methods to change the current values 6 public void changeInt (int value) { 7 value = 55; 8 } 9 10 public void changeStr (String value) { 11 value = new String ( " different " ); 12 } 13 14 public void changeObjValue (PassTest ref) { 15 ref.ptValue = 99.0f; 16 } 17 18 public static void main (String args[]) {