第 4 章 抽象、封装与类

58
前前 前4前 前前 前前前前 4.1 4.1 抽抽 抽抽抽抽 抽抽 抽抽抽抽 4.2 4.2 Java 抽抽 抽抽 4.3 4.3 抽抽抽抽抽 抽抽抽抽抽 4.4 4.4 4.5 抽抽 抽抽 4.6 4.6 抽抽抽抽抽 抽抽抽抽抽 4.7 抽抽 抽抽

Upload: kathy

Post on 13-Jan-2016

135 views

Category:

Documents


0 download

DESCRIPTION

第 4 章 抽象、封装与类. 4.1 抽象、封装与类 4.2 Java 的类 4.3 类的修饰符 4.4 域 4.5 方法 4.6 访问控制符 4.7 小结. 4.1 抽象、封装与类. 4.1.1 抽象 1 概念 抽象是对具体对象(问题)进行概括。 ( 先注意问题的本质及描述,其次是实现过程或细节 ) 2 抽象分类 (1) 过程抽象 描述某类对象的共有的行为特征或具有的功能。 (2) 数据抽象 描述某类对象的属性或状态 ( 对象相互区别的物理量 ) 抽象的实现 —— 通过类的声明。. 举 例 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 4 章  抽象、封装与类

前一页

前一页 休息

第 4 章 抽象、封装与类4.14.1 抽象、封装与类抽象、封装与类4.24.2 Java 的类的类4.3 4.3 类的修饰符类的修饰符4.44.4 域域4.5 方法方法4.6 4.6 访问控制符访问控制符4.7 小结小结

Page 2: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.1 抽象、封装与类4.1.1 抽象

1 概念 抽象是对具体对象(问题)进行概括。

( 先注意问题的本质及描述,其次是实现过程或细节 )

2 抽象分类 (1) 过程抽象 描述某类对象的共有的行为特征或具有的功能。 (2) 数据抽象 描述某类对象的属性或状态 ( 对象相互区别的物理量 )

抽象的实现——通过类的声明。

Page 3: 第 4 章  抽象、封装与类

前一页

前一页 休息

举 例银行对核心任务的操作—存取还款的金额、帐号、日期……抽象后属于:数据类型。存款、取款、还款过程……抽象后属于:方法。

数据抽象 : int HowMach, int N, int D

过程抽象: Setsave () , Setget () ,

Setsent ()

Page 4: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.1 抽象、封装与类4.1.2 封装

1 概念 将抽象出的数据成员、过程方法有机结

合为一个整体。2 优点 提高类或模块的可重用性、隐藏性。

这是面向对象程序设计的主要优点之一。

Page 5: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.2 Java 的类 Java 的程序设计就是定义类的过程。4.2.1 系统定义的类

系统定义好的类就是 Java 类库中的类。 根据实现功能不同,划分不同的集合,每个

集合是一个包,合称为类库。 又称为: API---application program interface

SUN 公司提供的类库称为基础类库 JFC 。

Page 6: 第 4 章  抽象、封装与类

前一页

前一页 休息

1 有关包的解释

包:若干个扩展名为 class 的文件集合在一起就形成了包。

Java 主包: Java 的一层包,名为 java ;

Java 主子包: Java 的二层包,名为 lang ;

Java 标准的扩展包:名为 javax ,最多只有三层。

包是可以有任意多层子包。包和子包 的名字之间用点号隔开。 例: javax. swing.tree

Page 7: 第 4 章  抽象、封装与类

前一页

前一页 休息

自学所有类库的查找方法

参考资料:参考资料:Java2 APIJava2 API 大全 电子工业出版社大全 电子工业出版社

列出 Java 中所有软件包页面

软件包(总说明、包内容说明)页面 :接口 Interfaces/ 类 classes/ 异常 Exceptions/ 错误 Errors类和接口页面 :

最顶级的类为 Object/ 直接继承的类是 Panel/ ...

说明有哪些软件包、类、方法等用了该类的任何一部分内容的页面。软件包、类和接口的层次图页面。

(比 class 页面详细)

所有不推荐使用类的功能页面提示。按字母顺序列出 Java 中的所有类、接口、构造方法、方法和域。

Java.sun.com/j2se/1.4.1/docs/api/index.html

Page 8: 第 4 章  抽象、封装与类

前一页

前一页 休息

2 常用的包简介1) java.lang2) java.lang.reflect3) java.io4) java.util5) java.util.zip6) java.awt7) java.awt.image8) java.awt.datatransfer9) java.awt.event

1. 核心类库:含数据类型、基本数学函数、字符串 、 处理、线程、异常处理类等

2. 核心类库:是反射对象工具,监视正在运行的对象并获得它的构造函数、方法和属性。

3. 标准 I/O 类库: 基本 I/O流、 文件 I/O流、 过滤 I/O流、 管道 I/O流、 随机 I/O流等。

4低级实用工具类库:处理时间 Date 类变长数组 Vector 类栈 Stack 类杂凑表 HashTable 类

5低级实用工具类库

实现文件压缩类

6. 构建图形用户:低级汇图操作图形界面组件、布局管理界面用户交互、事件响应等

7. 构建图形用户处理、操作网上图片的工具

8. 构建图形用户处理剪贴板、字符串发送器等

9. 构建图形用户Event 类的扩充处理不同类型的事件

Page 9: 第 4 章  抽象、封装与类

前一页

前一页 休息

2 常用的包简介10) java.applet11) java.net12) java.corba13) java.corba.orb14) java.rmi15) java.rmi.reistry16) java.rmi.server17) java.security18) java.security.acl19) java.security.interfaces20) 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 等

Page 10: 第 4 章  抽象、封装与类

前一页

前一页 休息

常用 java 子包汇总包 接口和类的用途 包 接口和类的用途

java.applet applet java.rmi 远程方法调用java.awt 图形和图形用户接口 java.rmi.dgc 支持 java.rmijava.awt.datatranster 剪切和粘贴功能 java.rmi.registry 同上java.awt.event 事件处理 java.rmi.server 同上java.awt.image 图像处理 java.security 安全java.awt.peer 平台无关图形 java.security.acl 支持 java.securityjava.beans 软件组件 java.security.interfaces 同上java.io 输入输出 java.sql 数据库java.lang 语言的核心功能 java.text 国际化java.lang.reflect 映射(“自省”) java.util 各种工具java.math 任意精度算术运算 java.util.zip 压缩和解压缩java.net 连网

Page 11: 第 4 章  抽象、封装与类

前一页

前一页 休息

常用 javax 子包汇总包 包中接口和类的用途javax.accessibility 判定技术javax.swing “轻便”的图形和图形用户javax.swing.border 专用边界javax.swing.colorchooser 颜色选择javax.swing.event 扩展 java.awt.event 的事件处理javax.swing.filechooser 文件选择javax.swing.plaf 可插入的外观和效果javax.swing.plaf.basic 基本的外观和效果javax.swing.plaf.metal 金属的外观和效果javax.swing.plaf.multi 复合体的外观和效果javax.swing.table 数据的表单表示javax.swing.text 文本的表示和处理javax.swing.text.html HTML 文本javax.swing.text.rtf RTF ( Rich Text Format )文本javax.swing.tree 数据的树型表示javax.swing.undo 文本编辑中的撤消功能

Page 12: 第 4 章  抽象、封装与类

前一页

前一页 休息

使用系统定义类的三种方式1 继承系统类

例:每个 Java Applet 的主类都是 Java.applet 包中 Applet 类的子类。

2 直接使用系统类例:字符界面系统标准输出的方法引用

System.out.println( )

3 创建系统类的对象例:图形界面接受输入时创建系统类的对象

TextField input

重点

Page 13: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.2.1 系统定义类小结

类库包中的程序都是字节码形式的程序,类库包中的程序都是字节码形式的程序,利用利用 importimport 语句将一个包引入到程序里来,语句将一个包引入到程序里来,就相当于在编译过程中将该包中所有系统类就相当于在编译过程中将该包中所有系统类的字节码加入到用户的的字节码加入到用户的 JavaJava 程序中,这样程序中,这样用户用户 JavaJava 程序就可以使用这些系统及其类程序就可以使用这些系统及其类中的各种功能。中的各种功能。

使用系统类的前提条件:使用系统类的前提条件: * * 必须用必须用 importimport 语句引入所用到的系统类语句引入所用到的系统类等。等。

Page 14: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.2 Java 的类4.2.2 用户程序自己定义类 * 类有三中类型的成员:域、方法和构造器。域、方法和构造器。 * 类的定义格式:

modifiers modifiers classclass class-name class-name {{

bodybody }} modifiers:modifiers: public 公有 , abstract 抽象 , final 最终

body: body: 是一系列的域声明、构造方法等。

Page 15: 第 4 章  抽象、封装与类

前一页

前一页 休息

简单应用举例 -------- 例例 4-14-1class PhoneCardclass PhoneCard{ long cardNumber; // 域声明 private int password; double balance; String connectNumber; boolean connected;

boolean performConnection(long cn, int pw) { if(cn==cardNumber && pw==password) { connected=true; return true; } else { connected=flase; return flase; } ① }

double getBalance( ) { if(connected)

return balance; else return –1; } ②

void performDial( ) { if(connected) balance -=0.5; } ③}

(五个域,三个方法)

Page 16: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.2.3 创建对象与定义构造方法1 创建对象

( 1 )用类名定义所引用的对象 格式:类名 对象名; ( 类变量的引用 ) 举例: Textfield input ;

( 2 )创建并初始化对象 格式: new 构造方法(实参表); 举例: new Textfield(10) ;

( 3 )把 new运算的返回值赋给引用的对象 格式:引用对象名 =new 构造方法(实参表) 举例: input=new Textfield(10);

对象创建时的简化格式—上述三步汇总 类名 对象名类名 对象名 =new =new 构造方法(构造方法( [[ 实参表实参表 ]] );); 举例: Textfield input=new Textfield(10);

Page 17: 第 4 章  抽象、封装与类

前一页

前一页 休息

创建对象举例例 4-1 分析: 创建 PhoneCard 对象— myCard:

PhoneCard myCard=new PhoneCard( ); myCard.cardNumber

myCard.password myCard.balance myCard.connectNumber myCard.connected

myCard.performConnection myCard.getBalance myCard.performDial

myCard 对象的域

myCard 对象的方法

Page 18: 第 4 章  抽象、封装与类

前一页

前一页 休息

定义构造方法说明 2 构造方法—— constructorconstructor

( 1 )为什么使用构造方法 目的:对声明的对象进行初始化。

( 2 )构造方法的特性 * 构造方法的方法名与类名相同; * 构造方法没有返回类型; * 构造方法的主要作用是完成对类对象的初始化; * 构造方法一般不能由被显式地直接调用; * 在创建一个类的新对象的同时,系统会自动 调用该类的构造方法为新对象初始化。

Page 19: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例——例——例 4-24-2 (( UsePhoneCard.java ))

public class UsePhoneCard{ public static void main(String args[]) { PhoneCard myCard=new PhoneCard(12345678,1234,50.0, “300”);

System.out.println(myCard.toString( )); }} // 主方法定义①class PhoneCardclass PhoneCard{ long cardNumber; private int passwor double balance; String connectNumber; boolean connected;

PhoneCard(long cn, int pw,double b, String s){ cardNumber=cn; password=pw; if(b>0) balance=b; else System.exit(1); connectNumber=s;

connected=false;} // 构造方法③

Page 20: 第 4 章  抽象、封装与类

前一页

前一页 休息

boolean perormConnection(long cn, int pw) { if(cn==cardNumber && pw==password) { connected=true; return true; } else { connected=flase; return flase; } } ④ double getBalance( ) { if(connected)

return balance; else return –1; }

void performDial( ) { if(connected) balance -=0.5; } ⑥ public String toString( ) { String s=“ 电话卡接入号:” connectNumber + “\n 电话卡卡号:” +cardNumber

+ “\n 电话卡密码:” +password +“\n 剩余金额:” +balance ; if(connected)

return(s + “\n 电话已接通。”); else

return(s + “\n 电话未接通。”); }} ⑦

Page 21: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.3 类的修饰符— modifiersmodifiers

类的修饰符类的修饰符——有三种分两类: 访问控制修饰符— public 公有类 它可以被任何程序包中的所有类所访问和使用; 非访问控制修饰符— abstract 抽象类 , final 最终类。

4.3.1 抽象类 概念:抽象类是指没有具体对象概念的类。 举例: ( 1 )人类 ( 2 )车类

( 3 )几何图形类 ( 4 )电话卡类

4.3.2 最终类 概念:最终类是指其类不能再有子类的类。

Page 22: 第 4 章  抽象、封装与类

前一页

前一页 休息

举例:电话卡及其子类的层次关系树

有卡号类无卡号类

电话卡类

IC卡 磁卡 200 卡

校园 201卡IP卡

说明:说明:抽象类的 abstract 和最终类的 final修饰符不能同 时修饰一个类;抽象类和最终类可以各自与其他的修饰符合用。

Page 23: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.4 域概念:域是类和对象的静态属性。域的表现形式: 基本数据类型变量、其他类的对象等。

1 简单域声明格式: modifiers type-name modifiers type-name variable-namevariable-name ;; modifiersmodifiers :: static, final, transient, volatile,static, final, transient, volatile,

public, protected, private—public, protected, private— 共共 77 个。个。 type-nametype-name :: boolean, byte, char, short, int, boolean, byte, char, short, int,

long, float, doublelong, float, double

Page 24: 第 4 章  抽象、封装与类

前一页

前一页 休息

静态初始化器 它是用关键字 static引导的一对大括号括起的语句组。 说明:它不是方法,它只对自身进行初始化,类加载时

由系统调用执行。

2 域的修饰说明 1

静态域用 static修饰符修饰的域是仅属于类的静态域。特点:静态域是类的域,不属于任何一个类的具体对象。

例题 4-3

例题 4-4

继续

Page 25: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例——例——例 4-3 4-3 ((TestStaticField.javaTestStaticField.java))

public class TestStaticFieldTestStaticField // 第一个类主类的定义{ public static void main(String args[ ]) {

PhoneCard200 my200_1=new PhoneCard200( ); //创建对象并初始化PhoneCard200 my200_2=new PhoneCard200( ); //创建对象并初始化my200_1.additoryFee=0.1; //访问类的静态域并赋值System.out.println(“ 第二张 200 卡的附加费:” +my200_2.additoryFee);System.out.println(“200 卡的附加费:” +PhoneCard200.additoryFee);

}}

Page 26: 第 4 章  抽象、封装与类

前一页

前一页 休息

class PhoneCard200PhoneCard200 // 第二个类定义

{ static String connectNumber= “200”;

static double additoryFee;

long cardNmuber;int password;Boolean connected;Double balance;

}

返回

Page 27: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例——例——例 4-4 4-4 ((TestStatic.javaTestStatic.java))

public class TestStaticTestStatic

{

public static voic main(String args[ ])

{ PhoneCard200 my200_1=new PhoneCard200( );

PhoneCard200 my200_2=new PhoneCard200( );

System.out.println(“ 第一张卡的卡号:” +my200_1.cardNumber);

System.out.println(“ 第二张卡的卡号:” + my200_2.cardNumber);

}

}

Page 28: 第 4 章  抽象、封装与类

前一页

前一页 休息

class PhoneCard200PhoneCard200{ static long nextCardNumber; // 声明 static String connectNumber; static double additoryFee; long cardNumber; int password; boolean connected; double balance; static // 初始化 { nextCardNumber=200180001; } PhoneCard200( ) { cardNumber=nextCardNumber++; // 调用 } }

返回

Page 29: 第 4 章  抽象、封装与类

前一页

前一页 休息

2 域的修饰说明 2

最终域概念:被修饰为 final 的常量标识符,在整个程序执

行过程中都不变。注意:

1 )需要说明常量的数据类型;2 )需要同时指出常量的具体取值;

3 )因类对象的常量成员,其数值都固定一致, 为节省空间通常声明为 static

易失域概念:被修饰为 volatile 的域可同时被几个线程所控 制和修改。因此,它多用以修饰接受外部输

入的域。

Page 30: 第 4 章  抽象、封装与类

前一页

前一页 休息

补练习: StaticAndInstance.javaStaticAndInstance.java

静态成员变量和实例成员变量的区别:public class StaticAndInstance // 类定义{ static int xStatic=5; //声明静态成员变量 int xInstance; //声明实例成员变量 static int yStatic; //声明静态成员变量 static //静态初始化器 { System.out.println("Inside Static:\n xStatic=" + xStatic + "\t yStatic="+ yStatic); xStatic++; yStatic=9; } StaticAndInstance() { } //无参数的构造函数,方法体为空 StaticAndInstance(int k) //带参数的构造函数 { xInstance=k; }

Page 31: 第 4 章  抽象、封装与类

前一页

前一页 休息

public static void main(String args[ ]) // 主函数 { int i=1; // 定义一个自动变量,记录输出显示序号“类名 .静态成员变量名” System.out.println("("+i+++")Via the class name to reference xStatic "

+ StaticAndInstance.xStatic); // 第 1 次调用输出“类名 .静态成员变量名”

StaticAndInstance obj0=new StaticAndInstance( );

StaticAndInstance obj1=new StaticAndInstance(4);

StaticAndInstance obj2=new StaticAndInstance(6);

System.out.println("("+i++ +")Via the class access xStatic="

+obj1.xStatic+"\n yStatic="+obj1.yStatic); //2 次调用“对象名 .变量名” System.out.println("("+i++ +")Via the other class access xStatic="

+obj2.xStatic+"\n yStatic="+obj2.yStatic); //3 次调用“对象名 .变量名” System.out.println("("+i++ +") xInstance of obj0="+obj0.xInstance

+"\t xInstance of obj1="+obj1.xInstance

+"\t xInstance of obj2="+obj2.xInstance);

} // 第 4 次调用:“对象名 . 实例变量名”

}

// 用 new创建三个对象

Page 32: 第 4 章  抽象、封装与类

前一页

前一页 休息

运行结果:

Page 33: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.5 方法简单方法定义格式: modifiers return-type modifiers return-type method-namemethod-name(parameter-list)(parameter-list) {{

bodayboday }}

<< 访问控制符访问控制符 ><>< 修饰符修饰符 ><>< 返回类型返回类型 >> 方法名方法名(参数表)(参数表) {{

方法体方法体 }}

Page 34: 第 4 章  抽象、封装与类

前一页

前一页 休息

例题引入:完全数判断(例 3-10 PerfectNum.javaPerfectNum.java )

public class PerfectNum { public static void main(String args[ ]) {int count=1; for(int i=1; i<1000; i++) { int y=0; for(int i=1; i<x; i++) if(x%i==0)

y+=j; if(y= =i) {System.out.print(i+String.valueOf('\t')); count++; if(count%3==0) System.out.println(); } } } }

Page 35: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例—例 3-10 替换 4-5 public class PerfectNum{public static void main(String args[]){ int count=1; for(int i=1; i<1000; i++) { if(isPerfect(i)) {System.out.print(i+String.valueOf('\t')); count++; if(count%3==0) System.out.println(); } } }

static boolean isPerfect(int x){ int y=0; for(int i=1; i<x; i++) if(x%i==0) y+=i; if(y==x) return true; else return false;}

Page 36: 第 4 章  抽象、封装与类

前一页

前一页 休息

1 抽象方法 概念: 由修饰符 abstract修饰且仅有方法头。 即是一种没有方法体的类定义。 优点: 可以隐藏具体的细节信息,使调用该方法

的程序不必过分关注类及其类内部的具体情况。

Page 37: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例—例例 4-64-6 TestAbstract.javaTestAbstract.java

程序分析: 程序定义了四个类:主类、抽象类、子类 1 和子类 2 ; 执行第 15 行—— double TimeLeft() 方法; 执行方法中循环的 21 行 performDial() 方法时, 调用子类 1 中其方法第 47 行, 然后再执行: Times++

balance=balance-0.6 直到 balance<=0时截止,返回: Times-1值。 执行第 15 行—— double TimeLeft() 方法; 执行方法中循环—— 21 行 performDial() 方法, 调用子类 1 中其方法第 58 行, 然后再执行: Times++

balance=balance-0.9 直到 balance<=0时截止,返回: Times-1值。

第一次输

第二次输

主类

抽象类

子类 子类

Page 38: 第 4 章  抽象、封装与类

前一页

前一页 休息

Public class TestAbstract{ public static void main(String args[]) { PhoneCard200 my200=new PhoneCard200(50.00);

ICCard myIC=new ICCard(50.0); System.out.println(“200 卡可以拨打” +my200.TimeLeft()+ “ 次电话” ) ; System.out.println(“IC 卡可以拨打” +myIC.TimeLeft()+ “ 次电话” ) ;

}}abstract class PhoneCard{ double balance; abstract void performDial();15 double TimeLeft()16 { double current=balance;

times=0; do

{ performDial(); times++; }while(balance>=0); balance=current; return times-1; }

}

测试电话卡中余额

Page 39: 第 4 章  抽象、封装与类

前一页

前一页 休息

28 class PhoneCard200 extends PhoneCard // PhoneCard 的子类30 { static long nextCardNumber; static final String connectNumber="200"; static double additoryFee; long cardNumber; int password; boolean connected;37 static //静态初始化器,设置附加费初值 { nextCardNumber=20018001; additoryFee=0.1; }41 PhoneCard200(double ib) // 构造方法:指定新电话卡金额 { cardNumber=nextCardNumber++; balance=ib; }47 void performDial() // 方法:重新定义父类中的抽象方法, { balance-=0.5+additoryFee; } //扣除通话费用并加上附加费 , 每次 -0.6 }52 class IC_Card extends PhoneCard // PhoneCard 的子类 { IC_Card(double ib) // 构造方法:指定新电话卡金额 { balance=ib; }58 void performDial() // 方法:重新定义父类中的抽象方法, { balance-=0.9; } //扣除通话费用,每次 -.9 }

Page 40: 第 4 章  抽象、封装与类

前一页

前一页 休息

2 静态方法 用 static修饰符修饰的方法,是属于整个类的类方法是属于整个类的类方法; 未用 static修饰符修饰的方法,是某个具体类对象或实例

的方法。 static 方法的三重含义: (1) 调用这个方法时,应用类名做前缀,而不是某一 个具体对象名; (2) static 方法不被任何一个对象专有。 (3) 因 static 方法属于整个类,所以它不能针对某个 对象的成员进行操作和处理;只能对整个类的成 员变量进行操作。

Page 41: 第 4 章  抽象、封装与类

前一页

前一页 休息

静态方法简单举例:

在 PhoneCard200 中若需要修改附加费时定义的静态方法:

static void setAdditory(double newAdd)

{

if(newAdd>0)

additoryFee=newAdd;

}

Page 42: 第 4 章  抽象、封装与类

前一页

前一页 休息

3 最终方法

用 final修饰符所修饰的类的方法, 即功能和内部语句不能更改的方法。 注意:被 private修饰的方法和在 final 类中 的方法都被认为是最终方法。 重载:类对自身已有的同名方法的重新定义。

Page 43: 第 4 章  抽象、封装与类

前一页

前一页 休息

4 本地方法 用 native修饰符所声明的类的方法,

该方法由其他编程语言实现。

5 同步方法 synchronized 修饰的方法是一个类的方法。

对系统类中的对应的对象进行加锁。

(多线程中学习 )

Page 44: 第 4 章  抽象、封装与类

前一页

前一页 休息

4.6 访问控制符类的访问控制: 1 public ; 2 缺省域的访问控制: 1 缺省 __被同一包中其他类引用,又为包访问性。 2 public :( 1 )类自身的引用; ( 2 )同一个包内的该类的子类。 3 protected :( 1 )类自身的引用; ( 2 )同包其他类的引用;

( 3 )其他包该类的子类引用。 4 private protected :( 1 )类自身的引用 ( 2 )任意包中该类的子类。

Page 45: 第 4 章  抽象、封装与类

前一页

前一页 休息

程序中的访问控制区域

B :包中的类 C :所有

子类

A :所有类

D:本类 E :包中子类

类 公有 友元

属性与方法 public 缺省

public A B

protected B+C B

缺省 B B

private protected C+D E+D

private D D

Page 46: 第 4 章  抽象、封装与类

前一页

前一页 休息

补充例题:分析例题访问的描述情况分析例题访问的描述情况

(例题 1 )class Report{ void qenerateReport( )

{ doHeader( ); doBody( ); doFooter( ); } private void doHeader( ){ } private void doBody( ){ } private void doFooter( ){ } }

// 可由包中其他各类引用

// 可由本类中的对象成员引用 即:对象 . 方法所引用

Page 47: 第 4 章  抽象、封装与类

前一页

前一页 休息

补充例题:分析例题访问的描述情况分析例题访问的描述情况

(例题 2 )public class MathTools{ public double cube(double n) {

return n*n*n; } public double square(double n) { return n*n; } }

// 所有包、包中所有类和本类可引用

Page 48: 第 4 章  抽象、封装与类

前一页

前一页 休息

补充例题:分析例题访问的描述情况分析例题访问的描述情况

(例题 3 )class Employee{ private double hoursWorked; private double hourlyRate;

  protected double computeSalary( ) { return hoursWorked * hourlyRate; }}

//Employee 包中所有类和它任意保重所有的子类均可引用

Page 49: 第 4 章  抽象、封装与类

前一页

前一页 休息

应用举例—例题例题 4-7 4-7 AccessControl.javaAccessControl.java import java.applet.Applet; import java.awt.*; public class AccessControl extends Applet { ClassBeAccessed c=new ClassBeAccessed(); subClass sc=new subClass(); PackageClass ic=new PackageClass(); public void paint(Graphics g) { g.drawString("Self Accessible:",10,20); g.drawString(c.toString(),20,35); g.drawString("Sub Accessible:",10,55); g.drawString(sc.AccessDirectly(),20,70); g.drawString("Package Accessible:",10,90); g.drawString(ic.AccessDirectly(),20,105); g.drawString("Access using public method:",10,125); g.drawString(sc.AccessCls(),20,140); g.drawString(ic.AccessCls(),20,155); } }

Page 50: 第 4 章  抽象、封装与类

前一页

前一页 休息

class ClassBeAccessed{ public String m_PublicProperty; String m_FriendlyProperty; protected String m_ProtectedProperty; private String m_PrivateProperty;ClassBeAccessed(){ m_PublicProperty=new String("Public"); m_FriendlyProperty=new String("Friendly"); m_ProtectedProperty=new String("Protected"); m_PrivateProperty=new String("Private");}public String toString(){ return(m_PublicProperty+";"+m_FriendlyProperty+";"+m_ProtectedProperty+";"+m_PrivateProperty+";"); }}

Page 51: 第 4 章  抽象、封装与类

前一页

前一页 休息

class subClass extends ClassBeAccessed{ ClassBeAccessed c=new ClassBeAccessed(); String AccessDirectly() { return(c.m_PublicProperty+";" + c.m_FriendlyProperty+

";" + c.m_ProtectedProperty+";"); } String AccessCls() { return(c.toString()); }}class PackageClass{ClassBeAccessed c=new ClassBeAccessed(); String AccessDirectly() { return(c.m_PublicProperty+";" + c.m_FriendlyProperty+

";" + c.m_ProtectedProperty+";"); } String AccessCls() { return(c.toString()); }}

Page 52: 第 4 章  抽象、封装与类

前一页

前一页 休息

Page 53: 第 4 章  抽象、封装与类

前一页

前一页 休息

使用修饰符应注意的问题:

( 1 ) abstract 不能与 final并列修饰同一个类; ( 2 ) abstract 不能与 private,static,final 或 native并列修饰同一个方法; ( 3 ) abstract 类中不能有 private 的成员(包 括属性和方法); ( 4 ) abstract 方法必须在 abstract 类中; ( 5 ) static 方法中不能处理非 static 的属性。

Page 54: 第 4 章  抽象、封装与类

前一页

前一页 休息

补充:方法的参数和返回值 ( 1 ) 方法的返回值可以是各种基本数据类型 和 class 类型的对象引用,用 return语句获 取返回值,其格式为: return return 表达式;表达式; 当一个方法无返回值时,用方法声明把返 回值指定为 void型。( 2 )方法形参是自动变量,其作用域是一对大 括号所包围的方法体,因此,各方法间的 形参名是互相独立的,。

Page 55: 第 4 章  抽象、封装与类

前一页

前一页 休息

第四章 课后练习题1 什么是一个类的状态?

一个类状态是指当前此类的各个域的值的集合。2 域与局部变量的区别是什么? 域是一个变量,它是类的数据成员;局部变量是一个

在方法中声明的变量。3 构造器和方法的区别是什么?

构造器是类的一个成员函数,它负责创建这个类的对象。它的名称与类名相同,它没有返回值并且由 new操作符调用。方法是类的一个普通成员函数,它有自己的名字、有一个返回值类型,通过点操作符调用它。

Page 56: 第 4 章  抽象、封装与类

前一页

前一页 休息

第四章 课后练习题4 类方法和实例方法有什么区别?

一个类方法被声明为静态的,并且它通过类名来调用;一个实例不能由静态修饰符来定义,并且通过它所绑定的对象名字来调用。

5 对象相等和指向它们的引用相等,两者有什么区别?如果两个对象具有相同的数据值,那么它们相等。如果两个引用指向同一个对象,那么它们相等。

6 一个类可以有多少个构造器?一个类的构造器的数量不受限制。

7 一个类可以有多少个缺省构造器?一个类只能有一个缺省构造器。

Page 57: 第 4 章  抽象、封装与类

前一页

前一页 休息

第四章 小结:1 概念: 抽象与封装、类与对象、域与方法、 构造函数与析构函数、抽象类与最终类等,2 要点: 系统类的三种使用情况; 用户自定义类时的创建对象;

用户自定义类的抽象方法与静态方法的使用; 用户自定义类的修饰符和访问控制。上机作业: P86_9,11思考作业: P85_1~6,P86_12~22

Page 58: 第 4 章  抽象、封装与类

前一页

前一页 休息