Java 语言与面向对象程序设计基础

luoyewuhen

贡献于2011-11-04

字数:23939 关键词: Java开发 HTML Java C/C++ Go

Page 1 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java语言与面向对象程序设计基础 Š 任课教师: 朱涛 Dept. 清华大学经管学院管理科学与工程系 Office 伟伦楼中307 Tel 62788152 E-mail zhut@em.tsinghua.edu.cn Mailbox 5信箱18号 Page 2 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 内容 Š 第一讲 Java及OOP简介 Š 第二讲 Java的基本OOP Š 第三讲 Java的高级OOP Page 3 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 第一讲 Java及OOP简介 Š Java 简介 Š 面向对象程序设计 (OOP)简介 OOP: Object Oriented Programming Page 4 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java简史 Š Sun Microsystems 于1990’s开发  http://www.sun.com Š 设计师: James A. Gosling  http://javasoft.com/people/jag/index.html Š 最初作为消费性电子产品(Consumer Electronics)的编程语言  C, C++, Oak Š Internet的发展导致了Java的流行 Š Why “Java” ?  The development team hung out at a coffee shop Page 5 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java版本 Š Java版本演变 Java1.0 (1995) Java1.1 (1997) Java1.2 (December 1998) Java1.3 (Spring of 2000) Š Java版本划分 J2SE (Java 2 Platform, Standard Edition) J2ME (Java 2 Platform, Micro Edition) J2EE (Java 2 Platform, Enterprise Edition) Java 2 Page 6 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java是什么 The Java Language: A White Paper, 1995 简单的(Simple) 面向对象的(Object Oriented) 分布式的(Distributed)、解释的(Interpreted) 健壮的(Robust)、安 全 的(Secure) 结构中立的(Architecture Neutral) 可移植的(Portable) 高效能的(High Performance) 多线程的(Multithreaded)、动态的(Dynamic) Page 7 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java的主要特点 (1) Š 解释执行 Š 平台无关性 Š 网络编程 Š 面向对象 Page 8 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Java的解释执行 源代码 (*.java) Java编译 器 (Javac.exe) 字节码 (*.class) 字节码(Bytecode)由Java虚拟机(Java Virtual Machine)解释执行 JVM负责字节码和操作系统(Operating System)之间的通讯 Java Bytecode Unix JVM Hardware Unix OS Windows JVM Hardware Windows OS MAC JVM Hardware MAC OS Page 9 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University Š 平台无关性 源代码一次编译,可以在多个平台上执行 Š 网络编程 Applet、Servlet、Java Server Pages Š 面向对象 几乎100%的面向对象语言 Java的主要特点 (2) Page 10 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University J2SE (Java 2 Standard Edition) Š J2SE 1.3 http://java.sun.com/j2se/1.3/ Š JDK (Java Development Kit) J2SDK1_3_0-WIN.EXE Š JavaDoc (Java Documentation) J2SDK1_3_0-DOC.ZIP Š Java开发工具 JDK + UltraEdit 可视化工具: VisualAge for Java (IBM), JBuilder (Inprise) Page 11 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 安装J2SE 1.3 Š 运行J2SDK1_3_0-WIN.EXE,安装在目 录C:\jdk1.3 Š 设置路径 (Path): C:\jdk1.3\bin Š 修改注册表 (regedit.exe)  HKEY_LOCAL_MACHINE/software/javas oft/java 运行时环境 重命名为:  HKEY_LOCAL_MACHINE/software/javas oft/java Runtime Environment Š 解压缩J2SDK1_3_0-DOC.ZIP Page 12 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计 (1) Š程序设计的演变 机器语言 汇编语言 面向过程的语言和结构化程序设计 程序=算法+数据结构 面向对象程序设计 程序 = 对象 + 消息传递 Page 13 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计 (2) Š对象 (Object) 一组数据及其对这些数据的操作过程 对象中的数据称为域 (Field),例:plane1.weight 对象中的操作过程称为方法 (Method),例: plane1.move() Š类 (Class) 定义一类对象的模板,相当于类型 (Type),例:类 Plane 对象称为类的实例 (Instance),例:对象plane1是 类Plane的一个实例 Page 14 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计 (3) Š消息 (Message) 对象通过消息相互交流 消息传递:发送消息的对象,接受消息的对象,传 递的参数,调用的方法 消息传递 (Send Message)是方法调用 (Call Method):car1.accelerate() Driver Car accelerate() Message Page 15 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计 (4) Š程序 = 对 象 + 消息传递 Page 16 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计的特点 Š封装 (Encapsulation)  对象的数据和方法联在一起形成整体 对象是是 封装的基 本单位 Š继承 (Inheritance) 一个对象 继 承 另 一 对 象的数 据 和方法 为同一类型,”is” 关系: A plane is a vehicle. Š多态 (Polymorphism) 多种表现形式 ,具体来说 ,可以用“ 一个对 外接口 , 多个内在 实现方法” 表示 Page 17 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计的特点 (2) Vehicle Car Plane BoatTrain AirplaneHelicopter Š继承 (Inheritance) 基于已有类创建新类。新类继承已有类的数据和方法 例: 数据weight, 方法Move() 被继承的类称为父类,继承所得的类称为子类 Page 18 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 面向对象程序设计的特点 (3) Vehicle Car Plane BoatTrain AirplaneHelicopter Š多态 (Polymorphism) 有继承,才有多态 多种表现形式 ,一个接口 ,多个实现方法 Page 19 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 小结 ŠJava简史 C, C++, Oak, Java Java版本 ŠJava特点 解释执行、平台无关、网络编程、面向对象 ŠJ2SE的安装 Š面向对象程序设计 封装、继承、多态 Page 1 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 第二讲 Java的基本OOP Š Java中的记号 (Token) Š Java中的基本数据类型 (Primitive) Š Java中的控制程序流 (Controlling Program Flow) Š Java中的对象和类 (Object & Class) Š Java中的数组 (Array) Š 第一个Java程序 (Your First Java Program) Š Java中的包 (Package)和Java应用程序接口 (Application Program Interface) Š Java的注释 (Comment)和代码规范 (Code Specification) Page 2 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的记号 (1) Š 源代码:为文本文件,后缀为.java Š 记号是Java源代码 (*.java) 中对编译器 (javac.exe) 有意 义的最小代码元素  标识符 (Identifier)  关键字 (Keyword)  直接量 (Literal)  操作符 (Operator)  分隔符 (Separator) 注释和空 白( 空格、Tab、 回车符) 不是 记号,被 编译 器忽略 Page 3 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的记号 (2) Š 标识符 (Identifier):代表名称的记号  例: int age =27  区分大小写  以字母、下划线 (_) 或美元符号 ($) 开头,后续字符可包含数字0 到9,中间无空格 Š 关键字 (Keyword):特殊意义的标识符,由Java保留  例: int age = 27  标识符不能与关键字同名 Š 直接量 (Literal):程序中不变的部分,如数字和字符串  例1: int age = 27  例2: String name = “Zhu Tao” Page 4 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的记号 (3) Š 操作符 (Operator) :用于赋值或者计算的记号  例1: int age = 27  赋值运算 符、 数学运算 符、 关系运算 符、 逻辑运算 符、 位运算符 Š 分隔符 (Separator):对代码进行分组的记号  {、 }  ; Page 5 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的基本数据类型 Š Java的两种数据类型:基本数据类型和对象数 据类型 Š Java中的基本数据类型不随计算机类型而变化  boolean: true, false  byte: 8位 带符号整 数,-128 ∼ 127  short: 16位 带符号整 数,-215 ∼ 215-1  char: 16位 无符号整 数,0 ∼ 216-1  int: 32位 带符号整 数,-231 ∼ 231-1  long: 64位 带符号整 数,-263 ∼ 263-1  float: 32位 单精度浮 点数 ,约-1039 ∼ 1033  double: 64位 双精度浮 点数 ,-10317 ∼ 10317 Page 6 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的控制程序流 Š Java中的控制程序流与C、C++类似  条件控制 :If - else  循环控制: for, while, do - while  分支控制: switch  退出控制 :return  跳转控制 : 用于循环 体中 continue/break (label) Page 7 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的对象和类 Š 除基本数据类型之外,所有的类型都是对象数据类 型,也就是类 (Class) Š 对象是类的实例 (Instance) Š Java的单根设计:所有的类均以Object类为子类 Š 对象参考:对象变量只是对象的参考,而非对象本身  例1: Object object1;  例2: String s1; Object Class B Class C Class DClass A Class C2Class C1 Page 8 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 类的创建 Š Java中可以方便地创建新类 class MyClass{ int i; void increase(){ i ++; } } Š Java中类的数据也称为域 (Field) Š 域和方法的引用方式:对象变量 “.” 域/方法 MyClass sc1 = new MyClass(); int i2 = sc1.i; sc1.increase(); Page 9 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 方法、参数表、返回类型 (1) Š 消息传递就是方法调用,也就是说:对象的方法 决定了对象所能接受的消息 Š 基本形式 返回类型 方 法名称(参数 表){ 方法 体 } class Person{ int weight; void increase(int i){ weight = weight + i; } void decrease(int i){ weight = weight – i;} int getWeight( ){ return weight;} int getWeight(Person x){return x.weight;} } Page 10 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 方法、参数表、返回类型 (2) Š 返回类型 (Return Type)  返回的基 本变 量或对象 的类 型  无返回类 型, 使用关键 字void定义 Š 参数表 (Argument List)  无参数,( )也 要保留  基本数据 类型 和字符串 作为 参数,为 值传 递  对象类型 作为 参数,为 引用 传递 Page 11 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 方法重载 Š 方法重载 (Method Overloading):同名称的方法, 而参数表不同 Š 参数表不同:参数类型、数量、顺序不同 void overloadingMethod(int i) void overloadingMethod(int i, float f) void overloadingMethod(int i, String s ) void overloadingMethod(String s, int i ) Š 返回类型不能作为方法重载的依据 void overloadingMethod(int i) int overloadingMethod(int i) Page 12 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 静态域和静态方法 Š 使用 static 关键字来声明静态域和静态方法 class MyClass2{ static int i; static void increase(){ i ++; } } Š 静态域和静态方法为类中所有对象所共有,可以 不创建对象,直接引用。也称为类域和类方法。 引用方式:类名 “.” 静态域/方法 MyClass2.i; MyClass2.increase(); Page 13 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 对象的创建和清除 Š 使用关键字new,调用构造器 (Constructor)创建 对象  例1: Object object1 = new Object();  例2: String s1 = new String(“a string created”);  例3: String s2 = “a string created”; Š 不需要手工处理不用的对象,系统自动清除  内存泄漏 (Memory Leak)  垃圾收集 器(Garbage Collector) Page 14 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 构造器 Š 构造器:为对象分配内存,执行域的初始化。系 统提供缺省构造器  构造器调 用:new 类名 称() Š 自定义构造器,构造器名称同类名称 class MyClass3{ int i; MyClass3(int i2){ i = i2; } void increase(){ i + + ; } } Š 可以有多个构造器,通过构造器重载实现 Page 15 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 域的初始化 Š 缺省构造器中域的初始化  所有基本 数据 类型赋为 缺省 值  所有对象 数据 类型赋为null (关键 字) 0.00.00000nullfalse 缺 省 值 doublefloatlongintshortbytecharboolean类 型 Page 16 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的数组 (1) Š 数组是对象数据类型,创建数组的三个步骤 1. 声明数组  int myIntArray[ ];  int[ ] myIntArray;  Object[ ] myObjectArray; 2. 为数组分配内存: new  myIntArray = new int[5]  myObjectArray = new Object[5] 3. 为数组分配数组元素  myIntArray[0] = 15;  myObjectArray[0] = new Object(); Page 17 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的数组 (2) Š 一次声明和为数组分配内存  int myIntArray[ ] = new int[5];  Object myObjectArray[ ] = new Object[5]; Š 一次创建数组  int[ ] myIntArray = {0,1,2,3,4,5};  Object[ ] myObjectArray = {new Object(); new Object(); new Object()} Š 数组中有一个隐含变量 length  表明数组 可以 容纳的元 素的 个数: 数组 名.length Š 数组索引从0开始,到 length -1 Page 18 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 第一个Java程序 // HelloWorld.java public class HelloWorld{ public static void main(String[ ] args){ System.out.println(“Hello, world!”); } }  编译:javac HelloWorld.java,得到类 文 件HelloWorld.class  解释执行 :java HelloWorld  从main方 法 入口开始 运行 :main(String[ ] args)  System.out.println( )方法  注意大小 写敏 感 Page 19 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的包 (1) Š 包的概念  包是类的 组织 方式,提 供名 字空间和 访问 控制服务  类似于文 件系 统的组织 Š 引入包:使用关键字import  Java缺 省的引 入包为java.lang  引入包中 的类 :import 包名 称.类名 称;  引入整个 包:import 包名称.*; Š 声明包中的类:使用关键字package  语法: package 包名 称;  该句要求 是源 代码文件 的第 一个语句 Page 20 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的包 (2) // HelloWorld2.java import java.util.Date; public class HelloWorld2{ public static void main(String[ ] args){ System.out.println(“Hello, world!”); System.out.println(new Date()); } }  不引入包 而使 用类,则 需要 使用全称 :包 名.类名  例: System.out.println(new java.util.Date()); Page 21 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的包 (3) Š 包的文件组织和类路径 (ClassPath)  在类路径 中定 义包的位 置  . 代表当 前目 录,为默 认值  类文件存 放的 位置:类 路径 中的目录\包 名称目录 ClassPath = D:\; . //Cake.java package mypackage; public class Cake{ } 要求 编译后 的Cake.class在D:\mypackage目 录或者 当前目 录的 子目录mypackage中 Page 22 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java中的包 (4) Š 缺省包 (Default Package)  源代码文 件中 没有package语句声明  且类文件 处于ClassPath定 义的目录 中  满足以上 两个 条件的所 有的 类认为处 在同 一 个包中, 且称 该包为缺 省包 Page 23 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java的应用程序接口 Š Java API是Sun公司为Java语言开发的类的集合。是 Java程序开发的百宝箱。 Š Java API由多个包组成,每个包中含有许多功能强大 的类  java.lang包含 基本的Java语 言类,如 数据 类型,自 动引 入  java.io,包含 输入输出 类, 如数据流  java.util,包含实用工 具类 ,如日期 和数 据结构  java.applet, 包含开发Applet所用的 类  java.sql,包 含JDBC访 问 数据库的 类  javax.swing,包含图 形界 面GUI所 用的类 Š 在Java API中查找类:Tree,利用浏览器查找功能 Page 24 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java的注释 Š C语言所用的注释:/* …… */,中间的多行均为注释 /* This is a comment that continues across lines. */ Š C++语言所用的注释://, 该行为注释 // This is only a one-line comment. Š 文档工具javadoc所使用的注释:可以嵌入HTML和 注释文本使用标签 (Doc Tags)。使用该注释可以直 接生成类似java API的文档 Page 25 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University Java的代码规范 Š 类名称:首字母大写,多个词连写,其中每个词的首字母 也大写 Š 域名称和方法名称:同类名称,但首字母小写(构造器特 殊) Š { }对齐,合理的缩进、空格及空行 Š 要有注释!! class DogCanCatchMouse{ String anStringRepresentAction //… void changeAction{ //…. } } Page 26 2002-9-1 Zhu Tao School of Economics & Management, Tsinghua University 小结 Š Java中的记号、基本数据类型 和控制程序流 Š Java中的对象和类: 对象的创建、使用 Š Java中的数组 Š 第一个Java程序 Š Java中的包和Java应用程序接口 Š Java的注释和代码规范 Page 1 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 第三讲 Java的高级OOP Š 访问控制 (Access Control) Š 代码重用 (Code Reuse) Š 多态 (Polymorphism) Š 抽象类 (Abstract) 和接口 (Interface) Page 2 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 访问控制 (1) Š 类的访问控制说明符 (Access Specifier)  公共的 (public):对所 有的 类均可见  语法: public class 类名 称{ }  友好的 (“friendly”, 无 关键字): 只对同 一包中的 类可 见  在一个源 代码 文件(*.java)中只能有 一个 公共类, 且该 公共类的 名 称必须要 与源 代码文件 名称 精确匹配 。 // TheSameName.java public class TheSameName{ } Page 3 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 访问控制 (2) 可见private 可见可见“friendly” 可见可见可见protected 可见可见可见可见public 不同包的 非子类 不同包的 子类 同一包中 的类 同一类类 访问 Page 4 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 访问控制 (3) // Cake.java package mypackage; public class Cake{ void bite() { System.out.println(“Delicious!”); } } //Dinner.java import mypackage.*; public class Dinner{ public static void main(String[ ] args){ Cake x = new Cake(); x.bite(); //Can’t access } } Page 5 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 访问控制 (4) Š bite()方法加上public Š 使用缺省包机制  假定ClassPath = D:\,.  将Cake.java中的package声明去掉  将Cake.java文件移动D:\下或者当 前目 录下 Page 6 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 代码重用 Š 方便的代码重用是Java的一大优点 Š 组合 (Composition)  新类中包含已有类的对象  所包含的类对象要初始化 Š 继承 (Inheritance)  新类继承子类的域和方法 Page 7 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 组合 (1) // Car.java class Door{ } class Wheel{ } class Lamp{ boolean isLight = false; void turnOn(){ isLight = true; System.out.println(“Lamp is on!”); } void turnOff(){ isLight = false; System.out.println(“Lamp is Off!”); } } Page 8 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 组合 (2) // Car.java public class Car{ Door leftDoor; Door rightDoor; Wheel [ ] wheels; Lamp frontLamp; Lamp rearLamp; public static void main(String[ ] args){ Car myCar = new Car(); myCar.frontLamp.turnOn(); myCar.rearLamp.turnOff(); } } Page 9 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 组合 (3) public class Car{ …… //域 的定义 Car(){ // 自定 义 构造器, 初始 化成员对 象 leftDoor = new Door(); rightDoor = new Door(); wheels = new Wheel[ ]{new Wheel(), new Wheel(), new Wheel(), new Wheel() }; frontLamp = new Lamp(); rearLamp = new Lamp(); } public static main(String[ ] args){…….} } Page 10 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 继承 (1) Š 使用extends关键字从父类创建子类, 子类和父类的“is”关系(单向) Š 子类继承父类的数据和方法 Š 子类可以新增数据和方法 Vehicle Car Plane BoatTrain AirplaneHelicopter Page 11 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 继承 (2)// Airplane.java class Vehicle{ int level = 0; //类层 次 void introduce(){ System.out.println(“Hi, I am a vehicle!”); } } class Plane extends Vehicle{ void fly(){ System.out.println(“Fly.”);} //新 增方法 } public class Airplane extends Plane{ public static void main(String[ ] args){ Airplane myAirplane = new Airplane(); System.out.println(“The level is: ” + myAirplane.level); myAirplane.introduce(); myAirplane. fly(); } } Page 12 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 继承 (3) Š 继承中的对象初始化  自顶向下,依 次调用构 造器 // Cartoon.java class Art { Art(){ System.out.println(“Art constructor.”); } } class Drawing extends Art { Drawing(){ System.out.println(“Drawing constructor.”); } } class Cartoon extends Drawing{ Cartoon(){ System.out.println(“Cartoon constructor.”); } public static void main(String[ ] args){ Cartoon x = new Cartoon(); } } Art Cartoon Drawing Page 13 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 继承 (4)  含参数的 父类 构造器调 用: super关键 字 // Chess.java class Game{ Game(int i){ System.out.println(“Game constructor ” + i); } } class BoardGame extends Game { BoardGame(int i){ super(i); // 首句 调用父类 构造 器 System.out.println(“Drawing constructor.”); } } public class Chess extends BoardGame{ Chess(){ super(11); // 首句 调用父 类构造器 System.out.println(“Cartoon constructor.”); } public static void main(String[ ] args){ Chess x = new Chess(); } } Game Chess BoardGame Page 14 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 继承 (5) Š 上溯 (Upcasting):子类可以看成是父类的类型 // WindInstrument.java class Instrument { public void play(){ System.out.println(“This instrument is playing.”) ; } static void tune(Instrument i){ i.play();} } class WindInstrument extends Instrument{ public static void main(String[ ] args){ WindInstrument x = new WindInstrument(); Instrument.tune(x); //上溯 } } Instrument WindInstrument Page 15 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (1) Š 面向对象程序设计的三大特征:封装、继 承、多态 Š 多种表现 形式 ,“ 一个对外 接口 , 多个内在 实现方法”,有效分离what 和how Š 继承可以实现操纵父类对象的方法可以操 纵其子类的方法(上溯:子类可以看成是 父类类型)。而多态可以使得该方法因不 同的对象而产生不同的行为。 Page 16 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (2) //Instruments.java class Instrument{ public void play(){System.out.println("This instrument is playing."); } } class WindInstrument extends Instrument{ public void play(){System.out.println("This windInstrument is playing.");} } class BrassInstrument extends Instrument{ public void play(){System.out.println("This BrassInstrument is playing.");} } Page 17 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (3) // Music.java public class Music{ // public static void tune(Instrument i){ i.play();} public static void tune(WindInstrument i){ i.play();} public static void tune(BrassInstrument i){ i.play();} public static void main(String[ ] args){ WindInstrument x = new WindInstrument(); tune(x); BrassInstrument y = new BrassInstrument(); tune(y); } } Š 先编译Instruments.java,再编译Music.java Page 18 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (4) Š 方法重载 (Method Overloading)  方法名称 相同 ,参数不 同, 可以在同 一类 中 Š 方法覆盖 (Method Overriding)  子类与父 类方 法名称相 同, 参数也相 同, 子类方法 覆盖 父类方法 Š 联编 (Binding):连接方法调用和方法体  早期联编 (Early Binding): 联编在程 序运 行之前发 生, 不再变 化,也称 为静 态联编(Static Binding)  滞后联编 (Late Binding): 联 编在程序 运行 时根据对 象的 类型确 定,随对 象不 同而变化 ,也 称为动态 联编(Dynamic Binding)或 运行时联 编(Run-time Binding)  Java语 言中的 联编为动 态联 编,除了final方法 外 Page 19 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (5) Š 最终方法 (Final Method )  最终方法 为静 态联编  私有方法 固有 为最终方 法, 因为私有 方法 不能被子 类覆 盖  例: final void f(){ System.out.println(“final f()”); } Š 最终域 (Final Field)  一旦初始 化, 不能变化  例: final int i = 9 ; final Object x = new Object(); Š 最终类 (Final Class)  最终类不 能被 继承,即 没有 子类  最终类中 的方 法固有为 最终 方法,但 域无 限制 Page 20 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 多态 (6) Š 理解多态:一个接口,多个实现 Š 多态使得代码具有良好的可扩展性 (Extensibility) // Music2.java public class Music2{ public static void tune(Instrument i){ i.play();} public static void main(String[ ] args){ WindInstrument x = new WindInstrument(); tune(x); //上溯 BrassInstrument y = new BrassInstrument(); tune(y); //上溯 } } Page 21 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 抽象方法和抽象类 Š 抽象方法 (Abstract Method):abstract关键字说明,只 有方法定义,没有方法体 Š 抽象类 (Abstract Class):含有抽象方法的类 //Instruments2.java abstract class Instrument{ abstract void play(); } class WindInstrument extends Instrument{ public void play(){System.out.println("This windInstrument is playing.");} } class BrassInstrument extends Instrument{ public void play() System.out.println("This BrassInstrument is playing.");} } Page 22 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 接口(1) Š 接口(Interface):Interface关键字,接口可以看成纯抽 象类,只有抽象方法,且固有为public。接口也可以包 含域,但接口中的域固有为static和final Š 实现接口:implements关键字 //Instruments3.java interface Instrument{ abstract void play(); } class WindInstrument implements Instrument{ public void play(){System.out.println("This windInstrument is playing.");} } class BrassInstrument implements Instrument{ public void play(){System.out.println("This BrassInstrument is playing.");} } Page 23 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 接口(2) Š 接口实现多继承 (Multiple Inheritance):一个子类不能 继承多个父类,但可以实现多个接口 //Knight.java interface InsideKungfu{ void inside(); } interface OutsideKungfu{ void outside(); } Page 24 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 接口(3) public class Knight implements InsideKungfu, OutsideKungfu{ public void inside(){ System.out.println("Show good inside Kungfu."); } public void outside(){ System.out.println("Show good outside Kungfu."); } public static void main(String[ ] args){ Knight x = new Knight(); x.inside(); x.outside(); System.out.println("\n Hi, I have showed my chinese Kungfu. \n" + “Vote for me!") ; } } Page 25 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 小结 Š 访问控制 Š 代码重用:组合和继承 Š 多态 :方法重载与方法覆盖,动态联编 Š 抽象类 和接口 Page 26 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 软件和文档资料 Š Java指南 (Java Tutorial) Š Java编程思想 (第二版) (Thinking In Java (2nd_Edition)) Š Java 文档 (Java Documentation) Š Java开发工具包 (Java Development Kit) Š 文本编辑器UltraEdit Š ftp://166.111.98.105:121 , anonymous (Read Only) Page 27 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 作业 (1) abstract Shape abstract void draw(); String what(){ } Circle void draw(); String what(){ } Square void draw(); String what(){ } 1. 扩充HelloWorld.java,要求 能从控制 台输 入一行字 符串,并 输出 该字符串 。没 有输入, 则仍 然输 出”Hello, world!”。 ( 文件名HelloWorld3.java) 2. 创建下图 所示 的类Shape, Circle, Square, 并创 建新 类Shapes,创建Circle,Square的对 象, 并调用其 方 法,要求 体现 多态行为 。( 所有代码 均在 一个文件 中,文件 名Shapes.java) Page 28 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 作业 (2) 3. 创建一个 程序 ,要求使 用自 定义构造 器、 访问控 制、接口 、标 准输入输 出、 以及使用 数组 和条件控 制、循环 控制 语句。 ( 程序具 有一定的 意义 ,代码清 楚、 直观,注 释详 细。所有 代码 在一个程 序中 ,总长度 在300行以内 ) 注: Š 第1、2题每人 自己作 Š 第3题为 小组 作(3-5人一 个小组) Š 2002/09/08 5:00pm 前 交作业 Š ftp://166.111.98.105:21, user & password: homework (Write Only) Š $学号/HelloWorld3.java, Shapes.java $组名/文件 名.java,必 须的注释 文档 (包括成 员名 单,程序 的解 释等) Page 29 2002-9-2 Zhu Tao School of Economics & Management, Tsinghua University 谢谢大家!!

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档