Java程序设计 案例教程 第03章—2 北京大学出版社
第03章 Java语言与面向对象 教学目标 面向对象的基本概念 Java语言类与对象 面向对象的程序开发技术 Java语言系统定义类的使用
3.2 Java语言系统定义类的使用 系统定义好的类即Java类库中的类。根据实现功能不同,划分不同的集合,每个集合是一个包,称为类库,又称为API(Application Program Interface)。Sun公司提供的类库称为基础类库JFC。
3.2.1 使用系统类的前提条件 使用系统类的前提条件是: 必须用import语句引入所用到的系统类 3.2.1 使用系统类的前提条件 使用系统类的前提条件是: 必须用import语句引入所用到的系统类 类库包中的程序都是字节码形式的程序,利用import语句将一个包引入到程序中,就相当于在编译过程中将该包中所有系统类的字节码加入到用户程序中,这样就可以使用这些系统及其类中的各种功能。
3.2.2 常用系统定义的基础包 Object类 Object类是所有Java类的顶层类,即类继承树的根。 3.2.2 常用系统定义的基础包 Object类 Object类是所有Java类的顶层类,即类继承树的根。 如果一个类没有使用extends关键字扩展任何类,则编译器自动将创建的类视为Object类的子类。 Object类的所有方法都被每个类继承。
3.2.2 常用系统定义的基础包 Math类 java.lang.Math类是final类,因此不能被其他类继承; 3.2.2 常用系统定义的基础包 Math类 java.lang.Math类是final类,因此不能被其他类继承; 该类的构造方法是私有的,即声明为private,不能实例化一个java.lang.Math类; 该类定义的所有常量和方法均是public和static的,因此可以直接通过类名调用。
3.2.2 常用系统定义的基础包 Math类中定义的主要方法: 3.2.2 常用系统定义的基础包 Math类中定义的主要方法: public static double abs(double a) //获得一个双精度型值对应的绝对值 public static float abs(float a) //获得一个单精度型值对应的绝对值 public static int abs(int a ) //获得一个整型值对应的绝对值 public static long abs(double a) //获得一个长整型值对应的绝对值 public static double sin(double a) //获得一个正弦值 public static double cos(double a) //获得一个余弦值 public static double tan(double a) //获得一个正切值 public static double asin(double a) //获得一个反正弦值 public static double acos(double a) //获得一个反余弦值 public static double atan(double a) //获得一个反正切值 public static double ceil(double a) //取最接近但并不小于a的一双精度整数 public static double floor(double a)//取最近接但并不大于a的一双精度整数
3.2.2 常用系统定义的基础包 Math类中定义的主要方法: 3.2.2 常用系统定义的基础包 Math类中定义的主要方法: public static long round(double a) //获得一个四舍五入的长整数型值 public static int round(double a) //获得一个四舍五入的整数型值 public static double max(double a, double b) //取两双精度数之中的较大数 public static float max(float a, float b) //取两个单精度型数之中的较大数 public static long max(long a, long b) //取两个长整数型数之中的较大数 public static int max(int a, int b) //取两个整数型数之中的较大数 public static double min(double a, double b) //取两双精度数之中的较小数 public static float min(float a, float b) //取两个单精度型数之中的较小数 public static long min(long a, long b) //取两个长整数型数之中的较小数 public static int min(int a, int b) //取两个整数型数之中的较小数 public static double double random() //取一取值范围为[0.0~1.0]的随机数 public static double sqrt(doublee a) //获得一个平方根值
3.2.2 常用系统定义的基础包 封装类 Java语言中每个基本数据类型都有一对应的封装类。 基本数据类型 封装类 3.2.2 常用系统定义的基础包 封装类 Java语言中每个基本数据类型都有一对应的封装类。 基本数据类型 封装类 boolean Boolean byte Byte char Character short Short int Integer long Long float Float double Double
3.2.2 常用系统定义的基础包 String类和StringBuffer类 String类是final类,不可以被继承,它是不可变类。 3.2.2 常用系统定义的基础包 String类和StringBuffer类 String类是final类,不可以被继承,它是不可变类。 可以通过一个字符数组构造一个String类实例。 例如:char data[]={'a','b','c'}; String str=new String(data); 指向同一个字符串对象: String str1= "abcde“; String str2= "abcde"; 采用new方式创建两个字符串变量,即使字符串内容相同,指向的也不是同一个字符串对象: String str1=new String("abcde"); String str2=new String("abcde");
3.2.2 常用系统定义的基础包 1) java.lang 2) java.lang.reflect 3) java.io 3.2.2 常用系统定义的基础包 1. 核心类库: 含数据类型、 基本数学函数、 字符串 、 处理、 线程、 异常处理类等 1) java.lang 2) java.lang.reflect 3) java.io 4) java.util 5) java.util.zip 6) java.awt 7) java.awt.image 8) java.awt.datatransfer 9) java.awt.event 2.核心类库: 是反射对象工具, 监视正在运行的对象并获得它的构造函数、方法和属性。 3.标准I/O类库: 基本I/O流、 文件I/O流、 过滤I/O流、 管道I/O流、 随机I/O流等。 4低级实用工具类库: 处理时间Date类 变长数组Vector类 栈Stack类 杂凑表HashTable类 6.构建图形用户: 低级汇图操作 图形界面组件、 布局管理 界面用户交互、 事件响应等 5低级实用工具类库 实现文件压缩类 7.构建图形用户 处理、操作网上图片的工具 8.构建图形用户 处理剪贴板、字符串发送器等 9.构建图形用户 Event类的扩充 处理不同类型的事件
3.2.2 常用系统定义的基础包 10) java.applet 11) java.net 12) java.corba 3.2.2 常用系统定义的基础包 10) java.applet 11) java.net 12) java.corba 13) java.corba.orb 14) java.rmi 15) java.rmi.reistry 16) java.rmi.server 17) java.security 18) java.security.acl 19) java.security.interfaces 20) java.sql 10. 实现运行于 Internet浏览器中的Java Applet的工具 类库。 11.网络功能类库低层网络通信编写FTP,Telnet等网上通信类访问网上资源进行CGI网关调用的类等。 12,13.其他面向对象语言开发的 部件。(可方便、动态地利用已经存在的软件) 14~16.远程方法调用用户程序可以在远程计算机(服务器)上创建对象,在本地计算机上使用该对象。 17~19.安全控制管理对程序加密把Java Applet 进行标记,使之具有与完整的Java程序有相同的安全性。 20. 访问各种数据库包JDBC。 可访问: Oracle, Sybase, DB2, SQLServer等
Java.sun.com/j2se/1.4.1/docs/api/index.html 列出Java中所有软件包页面 参考资料: 自学所有类库的查找方法 列出Java中所有软件包页面 软件包(总说明、包内容说明)页面: 接口Interfaces/类classes/异常Exceptions/错误Errors 所有不推荐使用类的功能页面提示。 说明有哪些软件包、类、方法等用了该类的任何一部分内容的页面。 类和接口页面: 最顶级的类为Object/直接继承的类是Panel/... 按字母顺序列出Java中的所有类、接口、构造方法、方法和域。 软件包、类和接口的层次图页面。 (比class页面详细) 参考资料: Java2 API大全 电子工业出版社
使用系统定义类的三种方式 1 继承系统类 例:每个Java Applet的主类都是Java.applet 包中 Applet类的子类。 2 直接使用系统类 例:字符界面系统标准输出的方法引用 System.out.println( ) 3 创建系统类的对象 例:图形界面接受输入时创建系统类的对象 TextField input
3.2.3 节小结 系统类使用前提; 常用系统定义类的记忆; 类库的查找方法; 系统定义类的使用。
3.2.4 节重点与难点 节重点 使用系统定义类的前提 类库的查找方法 使用系统定义类的三种方法 节难点 常用系统类的记忆
3.3 Java语言用户定义类的设计 Java程序设计主要内容 Java程序设计源代码文件包含3个要素: 包的设计 类的引入 类与接口的定义
3.3.1 Java程序设计主要内容 package包的设计 声明包的格式 package <包名>; 注意:声明语句要写在源程序文件的第一行。 设置包的路径 创建一个和包同名的文件夹。 例如:d:\javayyy\Firstpackage,将包含包的源程序文件编译后产生的.class字节码文件放到此文件夹中。 设置环境变量CLASSPATH: Set classpath=.;d:jasdk1.4.2;d:\javayyy
3.3.1 Java程序设计主要内容 包的引用 使用包名、类名前缀 加载整个包 使用import语句加载其它包中的一个类或引入整个包。 在要使用的属性或方法名前加上类名作为前缀(同类)。 在要使用的其它包中的类需在类名前再加上包名作为前缀。 加载整个包 使用import语句加载其它包中的一个类或引入整个包。
3.3.1 Java程序设计主要内容 例如: 例如: import CardClasses.*; import java.awt.*; CardClasses.D200 my200=new CardClasses.D200(12345,12); System.out.println(my200.toString( )); 例如: import CardClasses.*; import java.awt.*; import 程序包名.类名; import 程序包名.*; 包是可以有任意多层子包。包和子包 的名字之间用点号隔开。
3.3.1 Java程序设计主要内容 有关包加载的补充说明 包:若干个扩展名为class的文件集合在一起就形成了包。 Java主包:Java 的一层包,名为java; Java主子包:Java的二层包,名为lang; Java标准的扩展包:名为javax,最多只有三层。 例如:javax. swing.tree
类与接口的设计 接口设计将在后续章节中学习 package <包名>; import <引入包.类名1>; … 修饰符 class <类名> [extend<父类>][implements <接口列表>]{ //类设计 修饰符 类型 类变量1; //数据成员 修饰符 类型 类变量1; 修饰符 类型 实例变量1; 修饰符 类型 实例变量2; 修饰符 类型<方法名1>(参数列表){ //方法成员 局部变量; 方法体; } 修饰符 类型<方法名2>(参数列表){ //方法成员 } 3.3.1 Java程序设计主要内容 接口设计将在后续章节中学习
3.3.2 类成员访问控制及类访问控制 类成员访问控制 数据成员的作用域 public公用变量修饰符,被它所修饰的变量可以被所有类访问。 3.3.2 类成员访问控制及类访问控制 类成员访问控制 数据成员的作用域 public公用变量修饰符,被它所修饰的变量可以被所有类访问。 protected保护变量修饰符,除提供包内的访问权限外,protected修饰的变量允许继承此类的子类访问 private私有变量修饰符,阻止其他类对private修饰的变量访问,仅提供给当前类内部访问的变量,private变量不能被继承。private修饰符可以隐藏类的实现细节。 上述3种访问修饰在访问级别上是依次降低的。
3.3.2 类成员访问控制及类访问控制 类成员访问控制 数据成员的作用域 Java中除了上前述3种修饰符外,还存在第4种修饰符 3.3.2 类成员访问控制及类访问控制 类成员访问控制 数据成员的作用域 Java中除了上前述3种修饰符外,还存在第4种修饰符 不加任何访问关键字的默认访问模式。它只允许同包内进行访问,不同包之间不允许相互访问。 final常量修饰符,将变量声明为final可保证所修饰的变量在使用中不被改变。被声明为final的变量必须在声明时给初值,而且在以后的引用中只能读取,不可修改。 前述5种访问修饰的变量均为类的实例变量。 static类变量修饰符,成员变量前面加上static修饰符,表示该成员变量为类变量。不需要创建对象,就可以利用“类的引用”来访问static成员。
3.3.2 类成员访问控制及类访问控制 类成员访问控制 方法成员的作用域 3.3.2 类成员访问控制及类访问控制 类成员访问控制 方法成员的作用域 方法成员也是通过添加修饰符来限定其作用域的,即限定其他类或本类成员对它的访问权限。 访问权限修饰符指出满足什么条件时该方法成员可以被访问——例如:public, private, protected等 非访问权限修饰符指明数据成员的使用方式——例如:static, final, native, abstract, synchronized等非访问权限修饰符。
类成员访问控制 final方法是指最终方法。它能被子类继承和使用,但不能在子类中修改或重新定义。它的主要目的是利用本地资源扩展Java功能,而与Java本身的机制无关。 native方法是指本地方法。当在方法中调用一些不是由Java语言编写的代码或者在方法中用Java语言直接操作计算机硬件时要声明为native方法。可以通System.load Library()方法装入。如果本地方法没有装载成功,则会有异常被抛出。 abstract方法是抽象方法。是指还没有实现的方法,即没有方法体,所以abstract方法不能出现在非抽象类中。 synchronized方法用于多线程编程。多线程在运行时可能会同时出现存取一个数据,为避免数据的不一致性,应将方法声明为synchronized方法,对数据进行加锁,以保证线程的安全。 3.3.2 类成员访问控制及类访问控制
3.3.2 类成员访问控制及类访问控制 类的访问控制 类的修饰符 3.3.2 类成员访问控制及类访问控制 类的访问控制 类的修饰符 无修饰符的情况。如果一个类的前面无修饰符,则这个类只能被同一个包里的类使用。 public修饰符。由public修饰的类为公共类,它可以被其他包中类使用。 final修饰符。由final修饰的类为最终类,它不能被任何其他类所继承,即它不能派生子类。 abstract修饰符。由abstract修饰的类为抽象类,其作用在于将许多有关的类组织在一起,提供一个公共的基类,为派生类奠定基础。
3.3.2 类成员访问控制及类访问控制 类的访问控制 修饰符不能在以下情况下同时使用 abstract方法中不能处理非static的属性。 3.3.2 类成员访问控制及类访问控制 类的访问控制 修饰符不能在以下情况下同时使用 abstract不能与final并列修饰同一个类。 abstract不能与private,static,final或native并列修饰同一个方法。 abstract类中不能有private的成员(包括属性和方法)。 abstract方法中不能处理非static的属性。
3.3.3 类的封装 封装的概念 封装就是对属性和方法的载体类,只能通过其提供的接口(方法)来访问,而把实现细节隐藏起来。也就是说,具体实现对程序员来说是透明的。 封装的好处在于对类内部的改变,不会影响到其他代码。在一个完整封装的类中,一般定义方式是将其所有成员变量定义为private,而将访问这些变量的方法定义为非private类型,这样可以在类的外部间接地通过指定的接口来访问这些变量,而不直接获取成员变量。
3.3.3 类的封装 例3-6 封装的概念。 class Encapsulation { private String name; public int age; public Encapsulation(){ name="private"; age=25; } public void display(){ System.out.println(temp); //不能解析符号,temp作用域在inc()方法内 System.out.println(name); System.out.println(inc()); private int inc(){ int temp; temp=age+1; return temp;
3.3.3 类的封装 例3-6 封装的概念。 public class En_Test { public static void main(String[] args) { Encapsulation e1=new Encapsulation(); e1.display(); e1.age++; //age公有属性可以访问 e1.inc(); //inc()私有方法不能访问 System.out.println(e1.name); //name私有属性不能访问 }
3.3.4 节小结 Java程序设计主要内容; 类成员访问控制; 类的访问控制; 类的封装。
3.3.5 节重点与难点 节重点 节难点 Java程序设计主要内容; 类成员和类的访问控制; 封装的概念。 3.3.5 节重点与难点 节重点 Java程序设计主要内容; 类成员和类的访问控制; 封装的概念。 节难点 Java程序设计主要内容中包引用时包路径的设置; 类成员和类访问控制中数据访问默认方式的掌握; 封装类的设计。
3.4 章小结 面向对象的基本概念 Java语言类与对象 面向对象的程序开发技术 Java语言系统定义类的使用 Java语言用户定义类的设计
3.4 章小结 章重点 章难点 面向对象的概念,对类的定义、对象(定义、实例化、引用)、构造方法设计及调用、类的数据成员和方法成员操作 等。 3.4 章小结 章重点 面向对象的概念,对类的定义、对象(定义、实例化、引用)、构造方法设计及调用、类的数据成员和方法成员操作 等。 使用系统类的前提条件、常用系统定义的基础包。 Java语言用户定义类的初步设计、类成员的访问权限、类的访问权限。 章难点 对象的声明和实例化; 成员变量/成员方法的引用; 类成员访问和类访问控制; 类应用程序设计。
3.5 章习题 简单程序设计 1.下载并安装SDK软件包,设置环境变量。 3.5 章习题 简单程序设计 1.下载并安装SDK软件包,设置环境变量。 2.写一个Java Application应用程序,利用JDK软件包中的工具编译并运行这个程序,在屏幕上输出“Welcome to China!”。
3.6 章综合实验项目 实验项目: 实验要求: 设计一个简单的教师类。 该类包含教师的姓名、薪水和参加工作的日期,以及这些属性的设定和获取方法。再用另外一个类测试该类的正确性。