Java程序设计第2版第七章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012-9-8
22
7.3.4 从一个构造方法调用另一个构造方法
从某一构造方法内调用另一构造方法,是通过 关键字this来调用的。见教材例【例7.6】 。
2012-9-8
23
7.3.5 公共构造方法与私有构造方法
构造方法一般都是公有(public)的,而不可以
声明为私有的,这是因为它们在创建对象时,是在
//app7_1.java 定义私有成员,使之无法在类外被访问 class Cylinder //定义Cylinder类 { private double radius; //将数据成员radius声明为私有的 private int height; //将数据成员height声明为私有的 private double pi=3.14; //将数据成员pi声明为私有的,并赋初值 double area() { return pi* radius* radius; //在Cylinder类内部,故可访问私有成员 } double volume() { return area()*height; //在类内可以访问私有成员height } }
类的外部被系统自动调用的。如果构造方法被声明 为private,则无法在该构造方法所在的类以外的地 方被调用,但在该类的内部还是可以被调用的。
见教材例7.7
2012-9-8
24
7.4 静态成员
static称为静态修饰符,它可以修饰类中的成 员。被static修饰的成员被称为静态成员,也称为 类成员,否则不用static修饰的成员称为实例成员。
2012-9-8
16
【例7.4】利用构造方法来初始化圆柱体类 Cylinder的成员变量 。
//app7_4.java 构造方法的使用 class Cylinder //定义类Cylinder { private double radius; private int height; private double pi=3.14; public Cylinder(double r, int h) //定义构造方法 { radius=r; height=h; } double area() { return pi* radius* radius; }
2012-9-8
12
7.2 方法的重载
方法的重载是实现“多态”的一种方法。在 面向对象的程序设计语言中,有一些方法的含义相
同,但带有不同的参数,这些方法使用相同的名字,
这就叫方法的重载(Overloading)。也就是说,重载 是指相同的方法名称,如果参数个数不同,或者是 参数个数相同,但类型不同,则方法就具有不同的 功能。
子中的Cylinder类没有定义构造方法,则系统会产
生默认的构造方法如下:
Cylinder() { }
2012-9-8
21
7.3.3 构造方法的重载
一般情况下,类都有一个至多个构造方法。但 由于构造方法与类同名,所以当一个类有多个构造 方法时,则这多个构造方法可以重载。
构造方法重载的应用见教材【例7.5】 。
2012-9-8
10
【例7.2】续
程序运行结果如下: 您的数据有错误!! 圆柱底面积=0.0 圆柱体体积=0.0
2012-9-8
11
7.1.3 友元
若在类成员的前面加上访问控制符friendly, 说明该成员是友元。友元访问控制符可以省略。也 就是说在类内声明类成员时,不加任何访问控制修 饰符,则该成员是一个友元。一个成员被声明为友 元,表示这个成员只能被同一个包中的类所访问, 但其他包中的类不能访问该成员。 同理,对于类来说,如果一个类没有访问控制 符,说明它具有缺省访问控制特性。这种缺省的访 问控制权规定只能被同一个包中的类访问和引用, 而不可以被其他包中的类所使用。
量,而不是属于任何一个类的具体对象。 换句话说就是,静态变量不需要实例化就可 以使用。当然也可以通过实例对象来访问静态变量。 使用格式是: 类名.静态变量名 对象名.静态变量名
2012-9-8
27
【例7.8】将Cylinder类里的变量pi和num声明为静态变量。
//app7_8.java 静态变量的使用 class Cylinder //定义类Cylinder { private static int num=0; //声明num为静态变量 private static double pi=3.14; //声明pi为静态变量,并赋初值 private double radius; private int height; public Cylinder(double r, int h) //定义有2个参数的构造方法 { radius=r; height=h; num++; //当构造方法Cylinder()被调用时,num便加1 } public void count() // count()方法用来显示目前创建对象的个数 { System.out.print(“创建了"+num+”个对象:”); }
2012-9-8
9
double area() 【例7.2】续 { return pi* radius* radius; //在类内可以访问私有成员radius和pi } double volume() { return area()*height; //在类内可以访问私有成员height }
} public class app7_2 //定义公共主类 { public static void main(String args[ ]) { Cylinder volu=new Cylinder(); volu.SetCylinder(2.5, -5); //通过公共方法SetCylinder()访问私有数据 System.out.println("圆柱底面积="+volu.area()); System.out.println("圆柱体体积="+volu.volume()); } }
2012-9-8
13
注意:方法的重载中参数的类型是关 键,仅仅是参数的变量名不同是不行的。 也就是说参数的列表必须不同,即:或 者参数个数不同,或者参数类型不同, 或者参数的顺序不同。
方法的重载的应用见教材【例7.3】
2012-9-8
14
7.3 构造方法
前面所介绍的由Cylinder类所创建的对象, 其成员变量都是在对象建立之后,再由相应的方
法来赋值。如果一个对象在被创建时就完成了所
有的初始化工作,将会很简洁。因此Java在类里 提供了一个特殊的成员方法――构造方法。
2012-9-8
15
7.3.1 构造方法的作用与定义
构造方法(constructor)是一种特殊的方法,它 是在对象被创建时初始化对象的成员的方法。构造
方法的名称必须与它所在的类名完全相同。
2012-9-8
18
【例7.4】续
程序运行结果如下: 圆柱底积=38.465 圆柱体体积=307.72
2012-9-8
19
构造方法的特殊性主要体现在如下几个方面:
1.构造方法的方法名与类名相同;
2.构造方法没有返回值,也不能写void; 3.构造方法的主要作用是完成对类对象的初始化 工作; 4.构造方法一般不能由编程人员显式地直接调用,
//app7_2.java 定义公共方法来访问私有成员 class Cylinder { private double radius; //声明私有数据成员 private int height; private double pi=3.14; public void SetCylinder(double r, int h) //声明具有2个参数的公共方法 { //用于对私有数据进行访问 if (r>0&& h>0) { radius=r; height=h; } else System.out.println(“您的数据有错误!!”); }
2012-9-8
6
【例7.1】续
public class app7_1 //定义公共主类 { public static void main(String args[ ]) { Cylinder volu; volu=new Cylinder(); volu.radius=2.8; //错误!在类的外部,不能直接访问私有成员。 volu.height=-5; //错误!在类的外部,不能直接访问私有成员。 System.out.println("底圆半径="+volu.radius); System.out.println("圆柱的高="+volu.height); System.out.print("圆柱"); System.out.println(“底面积=”+volu.area()); //正确! System.out.println("圆柱体体积="+volu.volume()); //正确! } }
2012-9-8
17
【例7.4】续
double volume() { return area()*height; } } public class app7_4 //定义主类 { public static void main(String args[ ]) { Cylinder volu=new Cylinder(3.5, 8); //创建对象并调用构造方法 System.out.println("圆柱底积="+ volu.area()); System.out.println("圆柱体体积="+volu.volume()); } }
这虽然方便了程序员灵活的使用,但也存在弊端。
2012-9-8
4
7.1.1 私有成员
如果没有一个机制来限制对类中成员的访问, 则很可能会造成错误的输入。为了防止这种情况
的发生,Java提供了私有成员访问控制修饰符
private。 下面来举例说明。
2012-9-8
5
【例7.1】在圆柱体类Cylinder中,创建类的 私有成员,使之在该类的外部无法访问该成员。
第7章 Java类的特性
通过本章的学习,主要掌握以下知识点:
类的私有成员与公共成员
方法的重载
构造方法
实例成员与静态成员
2012-9-8
2
本章的重点: 方法的重载
构造方法
本章的难点:
静态成员
2012-9-8
3
7.1 类的私有成员与公共成员
在第6章的例子中,可以看到类的成员变量pi、
radius和height可以在类Cylinder的外部任意修改。
2012-9-8
25
7.4.1 实例成员
在类定义中如果成员变量或成员方法没有用
static来修饰,则该成员就是实例成员。对实例成
员,我们并不陌生,因为在此之前编写的程序中, 用到的都是实例成员。
2012-9-8
26
7.4.2 静态变量
用static修饰的成员变量称为“静态变量”,
静态变量也称为类变量。静态变量是隶属于类的变
而是用new来调用;
5.在创建一个类的对象的同时,系统会自动调用
Байду номын сангаас
该类的构造方法为新对象初始化。
2012-9-8
20
7.3.2 默认的构造方法
细心的读者可能会发现,在例7.4以前的例子中
均没有定义构造方法,依然可以创建新的对象,并
能正确的执行程序,这是因为如果省略构造方法, Java会自动调用默认的构造方法(default constructor)。默认的构造方法没有参数,在其方法 体中也没有任何代码,即什么也不做。如果上面例
2012-9-8
28
double area() { return pi* radius* radius; } double volume() { return area()*height; } } public class app7_8 //主类 { public static void main(String args[ ]) { Cylinder volu1=new Cylinder(2.5,5); volu1.count(); System.out.println("圆柱1的体积="+volu1.volume()); Cylinder volu2=new Cylinder(1.0,2); volu2.count(); System.out.println("圆柱2的体积="+volu2.volume()); } 2012-9-8 }
2012-9-8
7
7.1.2 公共成员
如果在类的成员声明的前面加上修饰符public,
则表示该成员可以被所有其他的类所访问。由于
public修饰符会造成安全性和数据封装性的下降,所
以一般应减少公共成员的使用。下面举例说明如何
利用公共方法来访问私有成员变量。
2012-9-8
8
【例7.2】创建圆柱体类Cylinder的公共成员 方法,来访问类内的私有成员变量 。