1、Java语言与面向对象程序设计,刁宏志,第3章,计算机科学与工程学科,3.1 Java的类和对象 一、系统定义的类Java语言的设计就是类定义的过程。Java语言是由语法和类库组成的。类库是Java重要组成部分,它提供了Java程序与Java虚拟机之间的接口,是一组由他人开发的Java程序模块,通常对应一组特定的功能,是Java的API程序。 1.java.lang包核心类库,包括基本数据类型等。(默认) 2.java.io包标准输入/输出类库,包括实现Java与操作系统、用户界面和用于数据交换使用的类。,3.java.util包包括低级的实用工具,如处理时间的Date类等。 4.java.a
2、wt包用来构建图形用户界面(GUI)的类库,有许多界面元素和资源,主要有:低级绘图操作,如Graphis等;图形界面组件和布局管理,如Checkbox等,及界面用户交互控制和事件响应,如Event等。 5.java.awt.image包处理和操纵来自网上图片的工具类。 6.java.awt.peer包使相同的Java程序在不同的平台上运行时具有相同的用户界面。,7.java.applet包用来实现运行于Internet浏览器中的Java Applet的工具类。 包用来实现网络功能的类库。主要有:底层网络通讯、CGI网关、邮件服务等。 9.java.corba包和java.corba.org包将
3、CORRA嵌入到Java环境中,使Java能够处理CORRA对象,并其与并行工作。 10.java.reflect包提供了用于反射对象的工具,反射允许监视一个运行对象,并获得其构造函数、方法和属性。,11.java.rmi包、java.rmi.registry包和java.rmiservser包用来实现RMI(远程调用)功能。 12.java.security包、java.security.acl包和java.security.interfaces包提供了更完善的Java程序安全控制和管理,通过加密或认证,确定其权限。 13.java.util.zip包实现文件压缩功能。 14.java.aw
4、t.datatransfer包提供了数据处理传输工具类。,15.java.awt.event包它使程序以不同方式处理不同类型的事件,并使图形界面元素具有这种能力。 16.java.sql包实现JDBC的类库,使Java具有访问不同数据库的能力。如:Oracle、DB2、Sybase和SQLSever。 使用系统类库的三种方式: (1)继承系统类。在用户程序中创造子类。 (2)创建系统类的对象。 (3)直接使用系统类。,无论何种使用方式前提是在用户程序中为可见类。 采用import语句引入。如: import java.awt.*;优点:避免代码重复和可能的错误。二、类 的 定 义: 1、定义格
5、式: 修饰符 class 类名 extends 父类名 implements 接口名 类成员变量声明;类方法声明; ,2、属性说明的格式,修饰符 变量的数据类型 变量名=初始值; /类属性为简单变量时修饰符类名 对象名=new 类名参数列表; /类属性为对象或复杂变量时类属性修饰符有访问控制符static、final等 。每次定义变量(对象)的同时便加以初始化:Motor motorcar=new Motor();/假设的构造函数,3、方法 方法是类的动态属性,标志类所有的功能和操作,用来把类和对象的数据封装在一起。类似于函数和过程。格式如下:修饰符 返回值类型 方法名(形式参数列表)thro
6、w 异常情况 方法体各语句; ,形式参数列表格式:形式参数类型1 形式参数1,形式参数类型2 形式参数2,形式参数在调用时使用实际参数代替,返回需要的值。方法的调用:方法调用有两种基本形式: 返回类型为void: 以独立的表达式语句调用。 返回类型不是void:表达式中作为一项因子出现。,import java.awt.Graphics; class Box double width,height,depth;double volume( ) return width*height*depth; void BoxMessage(Graphics g,int x,int y) g.drawStr
7、ing(“宽度”+width,x,y);g.drawString(“高度”+height,x,y+15); g.drawString(“深度”+depth,x,y+30); ,public class BoxClass extends Applet public void paint( Graphics g) Box myBox = new Box( );double myBoxVolume, Volume;myBox.width = 10.5;myBox.height = 20.6;myBox.depth = 15.7; myBoxVolume = myBox.volume( );g.dra
8、wString(“体积是 : ” + myBoxVolume, 25, 20);myBox.BoxMessage( g, 160, 20 ); ,三、创建对象与定义构造函数 1、对象的声明:类名 对象名;Box myBox; 注意:类属于复合数据类型,因此,在声明对象时,系统并没有为对象分配空间,用户需要应用new完成分配空间的任务。2、类的实例化: 创建对象的过程. 格式:对象名=new 构造方法(形参说明);myBox=new Box( ); 我们可以直接创建对象:Box myBox=new Box( );,使用对象包括引用类对象的成员变量和成员方法。格式为: 类对象名.成员名 类对象名.
9、方法名(参数表) 2。构造函数创建对象与定义对象的不同之处在于,创建对象的同时将调用这个对象的构造函数完成对象的初始化。必须使用若干赋值语句组成一个方法在创建对象时同时执行。即它是类的一个特殊方法: (1)构造函数的方法名与类名相同 (2)构造函数没有返回类型。,(3)构造函数主要工作完成对类对象的初始化。 (4)构造函数不能由编程人员显式调用。 (5)系统会自动该类的构造函数为新对象初始化。 import java.io.*; public class sample1 public static void main(String args )sample mysample=new sampl
10、e(“Hello“);System.out.println(mysample.toString(); ,class sample String ch1;sample(String ch)ch1=ch;public String toString() return(ch1+ “ Java World!“); ,3.2 修饰符 1、抽象abstract凡是用abstract修饰的类称为抽象类,它没有具体对象的概念类,只是代表该类共同属性。开发Java程序时,首先定义定义抽象类,对于具体的子类,只要修改其相应的方法即可。修饰符abstract修饰的方法仅有一个方法头,而无具体的方法体和操作实现,只有
11、在子类中才能定义其真正的操作 (1) abstract方法依附于abstract类,无对象。 (2)除了定义概念和参数表相同外,无相同处。 (3)其本质是公共接口。,abstract class A abstract void show( );abstract void show(int i); class B extends A int x;void show( ) System.out.println(“x=“+x); void show(int i) x=i; System.out.println(“x=“+x); ,class AbstractUse static public voi
12、d main(String arg )B b = new B( );b.show( );b.show(7);,abstract class Figure protected double x=10.0,y=5.0;abstract void showarea( ); class Triangle extends Figure Triangle(double a,double b) x=a;y=b; void showarea( ) System.out.println(“triangle: “+(0.5*x*y); class Rectangle extends Figure Rectangl
13、e(double a,double b) x=a;y=b; void showarea( ) System.out.println(“rectangle:“+(x*y); ,2、最终final用final修饰符修饰和限定的类,说明它不可能拥有子类,一般是叶子。被定义为final的类通常是一些固定作用、用来完成标准功能的类,如InetAddress等。利用final可以将一个类或对象的内容固定下来。用修饰符final修饰的方法是使用其他语言(如C+等)功能和内部的语句不可更改的(不可重载),该方法是固定操作。注意:private为缺省final.,final class A final doub
14、le PI=3.1416;final double area(double r) return (PI*r*r); class FinalTest static public void main(String arg)A a = new A( );System.out.println(“area= “+a.area(5.0); ,3、静态static用static修饰符修饰的域是仅属于类的静态域。其本质特点为:它们是类的域,不属于任何一个类的对象,保存再类的公共存储区,即任何对象对它的操作是在同一单元完成的。用修饰符static修饰的方法是属于整个类的,其他情况为具体对象或实例拥有。有三个特点
15、: (1) 调用该方法时,使用类作为前缀,它不属于任何对象。 (2) 使用非static 方法属于某对象,保存在内存的对象代码段; static 方法属于类,随的定义而运行。 (3)它不能操纵某对象的域,只能处理类的域。,class A int x;static int y = 3;void showx( ) System.out.println(“x = “ + x); static void show( ) System.out.print(“static : “); static void showy( ) System.out.println(“y = “ + y); static v
16、oid show1( ) A.show( ); A.showy( ); class StaticTest static public void main(String arg ) A.y += 1; A.show1();A a1 = new A( ); a1.showx( ); A.showy( ); a1.showy( );A a2 = new A();a2.x = 6; a2.y = 7; a2.showx( );a2.show1( ); a1.show1( ); A.show1( );,4.易失volatile如果 一个域被volatile修饰,说明这个域同时被几个线程所控制和修改,是接
17、收外部输入的域。 5.本地方法用修饰符native修饰的方法是调用其他语言编写的方法。作为类方法。目的:提高效率避免错误。另外,Java一般执行速度为C语言的1/201/15。 注意:可能破坏Java的跨平台特性。 6.同步方法用synchronized修饰的方法 为类的方法。调用时枷锁类,为对象方法时,加锁对象。用于多线程的协调与同步。,2。静态初始化器静态初始化器是用static修饰符引导的一对大括号括起的语句组。它的作用与构造函数相似,都是完成初始化,但有三点不同: (1)静态初始化器是对类自身进行初始化。 (2)静态初始化器在类加载时由系统调用执行。 (3)静态初始化器不是方法,无方法
18、名、返回值和参数表。,class Employee private int m_EmpNo;String m_EmpName;char m_EmpGender;private double m_EmpSalary;static double m_MinSalary;static int m_NextEmpNo; static /静态初始化器m_MinSalary=250;m_NextEmpNo=3001; Employee(String name,char sex,double sal) /构造函数 ,3.5访问控制符 1.公共访问控制符public (1) public类是整体可见的。即可被
19、其他类继承,或用于构建对象。Java包是类的松散集合,同包可互访,不同包只有声明为public可访问。 (2) public方法是该类对外的接口部分。体现数据封装思想。 (3) public域是公共域,如果使用公共类,可被所有类引,可能影响封装性和安全性。 2.缺省访问控制符只有该类只可以被同包的类访问。(包访问性),3.私有访问控制符private 只能由自身访问和修改,不可被其他类(包括该类的子类)获取和引用。提高保护级别。其他类获取和引用私有成员时,需借助类的方法实现如:可定义getPassword()来获取密码;用 setPassword()来修改密码。 4.保护访问控制符protected可进行三种引用:自身引用、同包其他类、在其他包该类的子类。 5.私有保护访问控制符private protected被private protected修饰的成员变量可进行两种引用:自身引用、在其他包该类的子类。,