530 likes | 655 Views
JAVA Applet 小应用程序示例. 小应用程序的例子。输出“ Hello World !” 。源程序代码如下: // 程序文件名称为 HelloApplet.java import java.awt.Graphics; import java.applet.Applet; public class HelloApplet extends Applet { public void paint (Graphics g ) { g.drawString ("Hello World!",50,25); } }.
E N D
小应用程序的例子。输出“Hello World!” 。源程序代码如下: • //程序文件名称为HelloApplet.java • import java.awt.Graphics; • import java.applet.Applet; • public class HelloApplet extends Applet • { • public void paint (Graphics g ) • { • g.drawString ("Hello World!",50,25); • } • }
小应用程序代码书写和编译完成后,无法独立运行,需要一个载体或者容器。下面的HTML网页代码就是小应用程序载入的容器。小应用程序代码书写和编译完成后,无法独立运行,需要一个载体或者容器。下面的HTML网页代码就是小应用程序载入的容器。 <!-- 程序文件名称为HelloApplet.html --> <HTML> <HEAD> <TITLE> HTML Test Page </TITLE> </HEAD>
<BODY> HelloApplet will appear below in a Java enabled browser.<BR> <APPLET CODEBASE = "." CODE = "HelloApplet.class" NAME = "TestApplet" WIDTH = 400 HEIGHT = 300 HSPACE = 0 VSPACE = 0 ALIGN = middle > </APPLET> </BODY> </HTML>
命令:Appletviewer HelloApplet.html 命令行演示 Eclipse演示
Java源程序分为两大部分:程序头包的引用和类的定义。Java源程序分为两大部分:程序头包的引用和类的定义。 1. 程序头包的引用 主要是引用JDK软件包自带的包,也可以是自己定义的类。引用之后程序体中就可以自由应用包中的类的方法和属性。
2. 类的定义 Java源程序中可以有多个类的定义,但必须有一个主类,这个主类是Java程序运行的入口点 在应用程序中,主类为包含main方法的类 在Java源程序中,主类的名字同文件名一致 类的定义又包括类头声明和类体定义 类体中包括属性声明和方法描述
属 性 //程序文件名称为WelcomeApplet.java 注释语句 init方法 引入包 public class WelcomeApplet extends Applet implements ActionListener 主类类头 {
actionPerformed 方法 main主方法
Java源程序物理上由三部分构成,分别为语句、块和空白。Java源程序物理上由三部分构成,分别为语句、块和空白。 (1) 语句指一行以分号“;”结束的语句 (2) 块指用括号对{}界定的语句序列,块可以嵌套使用。 (3) 空白指语句之间、块内部或者块之间的空白行。 空白不影响Java源程序的编译和运行,适当地运用空白, 可以形成良好的代码风格。
在前面的例子中 • Label lblName; • TextField txtName; • TextField txtDisp; • 都是语句,而 • { • lblName = new Label("请输入您的名字:"); • txtName = new TextField(8); • txtDisp = new TextField(20); • add(lblName); • add(txtName); • add(txtDisp); • txtName.addActionListener(this); • } • 是块,语句之间、块之间或块内部的空行都为空白。
第四章 Java面向对象特性 对象与类 对象生命周期 类的创建 重载 子类
对象的基本概念 面向对象程序语言三个关键特点: 封装 ( Encapsulation ) 继承 ( Inheritance ) 多态 ( Polymorphism )
类和对象 类是特定类型对象的定义,包括:对象包含的 数据,对象的创建及对象对自身数据操作的方法 类是一个模板 对象是在其类模型基础上构造出的,是具体的 实例
类和对象举例 类定义: Class EmpInfo{ String name; String designation; String department; void print( ){ System.out.println(name+“is”+ designation+“at”+department);} } 对象的生成与使用: EmpInfo employee = new EmpInfo( ); employee.name = “ Robert Javaman”; employee.designation = “Manager”; employee.department = “Coffee shop”; employee.print( ); ...
类声明的基本格式: 访问说明符 class类名 extends超类名 implements接口名 其中: (1)访问说明符为public或者缺省 public用来声明该类为公有类,可以被别的对象访问 声明为public的类存储的文件名为类名 如果类声明中没有public,只有与该类定义在同一包中的 类才可以访问该类
类声明的基本格式: 访问说明符 class类名 extends超类名 implements接口名 其中: (1) 访问说明符 … (2) 类名:用户自定义的标识符,用来标志这个类的引用 (3) 超类名:是指已经存在的类,可以是用户已经定义的,也可以是系统类 (4) 接口名:后面会讲到
例如:public class HelloApplet extends Applet{ … … } 访问说明符为public,类名HelloApplet,扩展类为JDK包自带的java.applet.Applet类。由于public的存在,所以文件名必须存为HelloApplet.java,同类名保持一致。
类体:(包括成员变量和方法) (1) 成员变量:指类的一些属性定义,标志类的静态特征, 格式如下: 访问说明符 数据类型变量名 其中: ●访问说明符有public、private和protected三种: public(省略时默认为public):可以由外部对象进行访问 private:私有类型,只允许在同一类的成员方法中使用,其他类的方法禁止访问,从而实现了类的数据隐藏。 Protected:受保护类型,自身、子类及同一个包中类可以访问 ● 数据类型包括基本类型以及用户自定义的扩展类型。
(2) 方法:是类的操作定义,标志类的动态特征,它的基本格式如下: 访问说明符 数据类型 方法名(数据类型1 变量名1, 数据类型2 变量名2) 其中: ●访问说明符为public、private和protected,其使用方法与成员变量访问说明符的使用方法一致。 ●数据类型:包括基本数据类型和用户自定义的扩展类型。 ●数据类型为参数。
类的构造方法(构造函数) • 构造方法定义: • public 类名(参数){ … } • 注意: • 方法名必须与类名相同 • 不能带返回类型
缺省构造函数 如果在类定义中无构造函数,Java在编译时 可缺省加入构造方法。如 public Employee( ){ }; 一旦在类中有一个自己声明的构造函数,则缺省 的构造函数将不被加到源程序中。 Employee示例
对象生命周期 创建对象 使用对象 清除不用的对象
创建对象 创建对象的三个步骤: 声明 (Declaration ) 实例化(Instantiation) 初始化(Initialization) Class EmpInfo{ String name; String designation; String department; void print( ){ System.out.println(name+“is”+ designation+“at”+department);} } 例: EmpInfo Employee_one; Employee_one = new EmpInfo( ); EmpInfo Employee_one.name =“Bob”; EmpInfo Employee_one.designation=“Manager”; EmpInfo Employee_one.department =“CoffeShop”; Employee示例
对象的回收 垃圾收集机制(garbage collection):Java运行环境当确定 某个对象不再被使用时,将其删除 一个对象在没有引用指向它时,可作为垃圾收集 垃圾搜集器:Java运行环境中的垃圾搜集器周期性地释放 不用对象占用的空间。
a b c b c (指针悬空) a b c b c 垃圾收集机制 C++:A *a=new A( ); A *b=a; A *c=a; //a 使用完,将其删除 delete a; Java :A a=new A( ); A b=a; A c=a; //a 使用完,将其删除 a= null ;
数据封装与隐藏 • 封装:将基本数据和对数据进行的操作方法相结合 • 优点: • 隐藏类中具体实现的细节 • 强迫程序员使用统一的接口访问数据 • 提高了代码可维护性 • 数据隐藏:使用private定义的成员变量,只能 • 在成员方法中使用,其它方法中禁止使用 • 优点: 保证对象中数据的一致性
数据隐藏与封装举例 Class Date{ private int day, month, year; void setDate( int a, int b, int c){ day = a; month = b; year = c ; } } … Date d1; d1.new Date( ); d1.setDate(30,9,2001); ... Date程序示例 d1.day = 30;(错误!)
“this “引用 关键字this 用来指向当前对象本身。 例:class Date { private int day, month,year; public Date getTommorrow( ){ this.day++; … } 请课后自己运行理解
重载(Overloading) • 含义:在同一个类中一个方法名被用来定义多个 • 方法。 • classScreen { • public void print( int i){ … } • public void print( float i){ … } • public void print( String str ){ … } • } • 重载必须遵守原则: • 参数表必须不同,以此区分不同方法体。 • 返回类型、修饰符可相同或不相同。
激活重载的构造方法 在一个构造方法中可以利用另一个构造方法。 class Employee{ private String name; private int salary; public Employee(String n, int s){ name = n ; salary = s; } public Employee( String n){ this(n,0); } public Employee( ){ this(“Unknown”); } }
子类 子类表示类之间一种“属于”( is a )关系。 例:public class Employee { String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; … } public class Manager { String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; String department ; Employee [ ] subordinates; … }
Extends 关键字 Java中用 extends 关键字定义子类。 public class Employee { String name ; Date hireDate ; Date dateofBirth ; String jobTitle ; int grade ; … } public class Manager extends Employee{ String department ; Employee [ ] subordinates; } 子类是从已有的类创建新类的一种方法。
子类 子类继承父类的属性、功能(方法),子类中只 需声明特有的东西(父类中所没有的)。 带private 修饰符的属性、方法是不能被继承的。 构造函数不能被继承。 在方法中调用构造方法用this()。 调用父类的构造方法用super()。 -- super 指向该关键字所在类的父类。
构造不同类型数据的集合 Java中允许构造如下类型的数组: Employee [ ] staff = new Employee[1024]; staff[0] = new Manager( ); staff[1] = new Worker(); staff[2] = new Employee(); … ---- staff 是由多种类型的对象组成的。 Java中任何一个子类的实例都可作为父类的实例 使用,可以调用父类具有的方法。
单继承 • Java是单继承的,即只能从一个类继承, • extends后类名只能有一个。 • 单继承的优点: • 代码更可靠 • 可以用接口弥补 • 用一个类实现多个接口,达到多继承效果。 • (在介绍接口的时候讲)
重写(Overriding methods) 子类可以改变从父类继承的行为。 被重写方法的返回值、方法名、参数列表要 与父类中的方法完全一样。
方法重写的规则 必须返回与原来方法完全相同的返回值。 方法的访问权限不能缩小。 不能抛出新的例外。
多 态 • Java允许父类对象的变量作为子类对象的变量 使用。 • 如:Employee e = new Manager( ); • 但通过该变量(如e)只能访问父类的方法,子类特有的部分被隐藏。 • 运行时确定使用父类还是子类的方法。
Super关键字 Super指向该关键字所在类的父类。 Public class Empolyee { private String name ; private int salary; public String getDetails( ){ return “Name: ”+name+“\nSalary:”+salary; } } public class Manager extends Empolyee { private String department ; public String getDetails( ){ return super.getDetailes( )+‘\nDepartment: “+ department; } } 课后运行例子
“instanceof”及类型强制转换 Instanceof 测试对象类型 Empolyee a = new Manager(); 则a instanceof Manager 为true; 类型转换 父类弱、子类强,指向父类的引用不能直接按子类引用, 必须要强制类型转换后才能作为子类的引用使用。 例:public void method( Employee e){ if (e instanceof Manager){ Manager m = (Manager) e ; m.department = “…”; … } }
子类对象的初始化 • 初始化对象是很结构化的。 • 在对对象初始化时,分三步: • 分配空间,并初始化为“0”值。 • 按继承关系从顶向下显式初始化。 • 按继承关系从顶向下调用构造函数。
调用父类构造方法 缺省是不带参数的构造方法。 如果需要调用特殊的父类构造方法,则需在 子类构造方法中第一行通过super( … )调用。 class Employee{ ... public Employee( String n){ name=n; } } class Manager entends Emplyee{ public Manager( String s,String d){ super(s); ... } }
Object 及其子类 Object定义了所有对象都需要的状态和行为。如对象之间的比较、将对象转换为字符串、等待某个条件变量、当某条件变量改变时通知相关对象以及返回对象的类。
Object 及其子类 在Object子类中可以重写的方法: • clone • equals • finalize • toString:返回对象的字符串表示,表达的内容因具体的对象而异 在Object子类中不能重写的方法: • getClass • notify • notifyAll • wait
Object的clone方法 aCloneableObject.clone(); //从已有的对象创建新的对象 注意: • aCloneableObject必须实现了Cloneable接口 • Object.clone()是shallow copy 而不是 deep copy
Object的clone方法 public class Stack implements Cloneable { private Vector items; // code for Stack's methods and constructor not shown protected Object clone() { try { Stack s = (Stack)super.clone(); // clone the stack s.items = (Vector)items.clone(); // clone the vector return s; // return the clone } catch (CloneNotSupportedException e) { } } }