7.1实验目的
(1) 了解类的成员设计
(2) 掌握类与对象的关系
7.2 知识要点
7.2.1 类
作为java程序的基本要素,类由成员变量(也称属性)和成员方法组成。属性包括常量和变量,方法则包括构造方法和一般方法,在定义类时,它们习惯上按如下次序排列: class Order
{
// final 属性
// 属性
// 构造方法
// 方法
}
类的属性一般定义为私有的,而将类的方法定义为public。
7.2.2 对象创建与构造方法
类是创建对象的模板,而对象是类的实例。对象是一组属性和方法的封装体。创建对象用到保留字new。
有关构造方法有以下几点说明:
(1)创建对象时将用到构造方法;系统自动调用参数匹配的构造方法为对象初始化。
(2)构造方法的名称必须与类名同名,构造方法没有返回类型;
(3)一个类可提供多个构造方法,这些方法的参数不同。
(4)如果程序中未提供构造方法,系统自动提供空的无参构造方法。
7.2.3 对象引用变量与对象关系
对象创建后,将对象的引用赋值给某个引用变量,就可以通过该变量访问对象的成员属性和方法。
成员的调用通过“.”运算符实现,格式为:
对象名.属性
对象名.方法(参数)
以下结合实例介绍对象引用变量与对象的关系。
class Point {
int x,y; //属性变量
public Point(int x1,int y1) { //构造方法
夏泽良 x=x1; //将参数值赋值给对象的属性变量
y=y1;
}
public static void main(String args[]) {
Point p1=new Point(2,3); //创建点(2,3)用p1引用
Point p2=new Point(3,5); //创建点(3,5)用p2引用
Point p3=p1; //p3和p1代表同一对象
p1.x=18; //修改p1的x属性值
System.out.println(p3.x); //输出 p3的x属性值
p1=p2; //p1“叛变”,改为和p2指向同一点国民党王牌军覆灭记
System.out.println(p1.x);
}
}
【运行结果】
18
3
【有关说明】
(1)main方法中首先创建两个对象,用带阴影的方框表示,分别用p1和p2两个引用变量存储其引用地址。
(2)语句Point p3=p1;的作用是定义一个Point类型的引用变量p3和p1值向同一对象;如图1所示。
(苏-39攻击机3)语句p1.x=8;的作用是修改p1所引用对象的x1值,由于p1和p3是“代表”同一对象,因此,输出p3.x和p1.x是一样的,也就是18.
(4) 语句p1=p2将p1改为指向和p2所指的对象,这样,再输出 p1.x则结果为3。
【重要提示】 对象和对象引用变量是两个不同的概念,对象引用变量中存放的是对象的地址。通常访问对象需要借助对象引用变量,将对象的地址赋值给对象引用变量,则该引用变量就“代表”这个对象,但是引用变量与对象并不是固定的关系,通过更改引用变量的值,
可让其“代表”另一对象,也可以通过引用变量之间的赋值让多个引用变量指向同一对象。如果一个对象没有任何引用变量指向它,则要访问该对象就再也不可能,Java垃圾回收器将自动回收该对象占用的内存。
7.2.4 静态空间与实例空间
带有static修饰的属性称为静态属性或称类变量;带有static修饰的方法称为静态方法,在静态方法内可以直接访问静态属性或调用其他静态方法,静态属性在分配空间时与对象无关,静态空间的引用是与类关联,一个类的静态属性成员只有一份,访问静态成员可以通过类名(在自己类中也可以直接访问),也可以通过对象,静态属性是共享的,该类的任何对象均可访问它。
【思考】静态属性外层包裹的是类,因此必须指明是访问哪个类的静态成员,如果是在自己类中则可以省略,由于对象是由类创建,自然对象能标识其所属类,因此也允许用对象做前缀访问静态属性。非静态属性也称实例变量,也就是说,要通过实际的对象才能访问,其外层包裹的是对象,不同对象其实例变量的值通常是不同的。
例如,以下类中y是属于类的属性变量,而x是属于对象的实例变量,y是依托类的,在类装载时将给其分配空间并赋值,整个类只有一个y;而x只有创建了具体对象才存在,不同对象有各自的x属性,如图7-2所示。
家庭百科
class demo {
int x;
Static int y=12;
}
【重要提示】对象方法中可以访问静态空间的方法或属性;反之,在静态方法中绝对不允许在没有指定对象的情况下访问属于对象的成员属性或方法。
7.3 样例程序
样例1: 创建5个学生对象给一个学生数组赋值,每个学生属性有:学号、姓名、年龄
(1)将学生按学号排序输出;
(2)给所有学生年龄加1;
(3)统计大于20岁的学生人数。
【参考程序】
public class Student{
int num;
int age;
String name;
public String toString( ) {
String s = "学号:" + num + ",";
s += "姓名:" + name + ",";
s += "年龄:" + age;
return s;
}
public Student(int Num,int Age,String Name) {
涡流管 num = Num;
age = Age;
name = Name;
}
public static void main(String args[]) {
Student s1 = new Student(3,18,"张三");
Student s2 = new Student(1,21,"小路");
外婆的厨房 Student s3 = new Student(33,20,"John");
Student s4 = new Student(13,20,"Lucy");
Student s5 = new Student(8,17,"Jack");
Student s[] = {s1,s2,s3,s4,s5};
System.out.println("班级学生名单如下:");
output(s); //第1次调用output方法输出数组
/* 将学生按学号排序 */
for (int i=0;i<s.length-1;i++)
for (int j=i+1;j<s.length;j++)
if (s[i].num>s[j].num) {
Student tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
System.out.println("按学号由小到大排序...");
output(s); //第2次调用output方法输出数组
for (int i=0;i<s.length;i++) //将所有学生年龄加1
s[i].age++;
System.out.println("所有学生年龄加1后...");
output(s); //第3次调用output方法输出数组
/* 以下统计大于20岁的学生个数 */
int count=0;