Java最新实用教程第三章 类和对象
Java最新实用教程
2009年 7月 27日星期一 2
学习目的:
了解 面向对象基本概念
掌握 类的创建和使用
掌握 对象的创建与使用
了解参数的传递
了解 匿名对象
学习重点:
掌握 类的创建和使用
掌握 对象的创建与使用
Java最新实用教程
2009年 7月 27日星期一 3
第 三 章 类和对象本章提要:
面向对象基本概念
类的创建和使用
对象的创建与使用
参数的传递
匿名对象
Java最新实用教程
2009年 7月 27日星期一 4
3.1 面向对象的程序设计方法概述
3.1.1 抽象抽象是人们解决问题的主要手段,也是面向对象程序设计解决实际问题法宝之一 。 所谓抽象就是指从众多的事物面向对象程序设计标志着程序设计思想发展到一个新的高度,它用一种更符合人们认识客观世界的思维方式进行程序设计:相对于面向过程的程序设计以研究问题的解决过程为主体,面向对象编程是以对象为主体,使编程富于创造性,提高了程序的可重用性,简化了编程过程,同时也使程序更易于维护 。
Java最新实用教程
2009年 7月 27日星期一 5
中舍弃个别的、非本质的属性,抽出共同的、本质的属性的过程。是面向对象程序设计的核心概念。
用面向对象编程解决现实世界的问题时,首先是利用抽象技术将现实世界中的各种实体,归纳总结出共性的东西形成一类实体的基本特征。这些特征包括属性和行为
,这些本质属性和方法的有机组合,就是面向对象方法中的类。
3.1.2 封装封装性是面向对象编程的基本特性之一,它通过封装隐蔽了对象的内部实现细节 。 对象的封装有两个方面:
Java最新实用教程
2009年 7月 27日星期一 6
一方面表示对象的属性和方法是不可分割的整体 。 对象的属性和方法封装为一体具有重要的意义,因为它反映了对象同时具有了客观事物的静态特征和动态行为相统一的客观规律,使软件对客观事物的描述更接近人类表述;而过去的面向过程的编程语言都是将功 能和数据相分离,使软件对客观事物的描述存在偏差,很难自然地用语言表达客观事物的对应关系 。
另一方面,封装还表示对象内部细节的隐蔽性 。 对内部细节的隐蔽性反映了事物客观的相对独立性,这样既可以防止外界的干扰,又可以降低复杂性 。 在 java语言中
,对象,类和包逐层封装,为管理大量的对象和类提供了方便,也增强了语言的安全性 。 隐藏了内部细节也使得 java的使用者和设计者分离,使用者只需用接口去满足软件重用的策略,可以降低软件开发成本,缩短开发周期,是软件的开发和维护得到根本性的改善 。
Java最新实用教程
2009年 7月 27日星期一 7
访问对象,而不必知道对象的内部细节。
从软件工程的角度讲,封装也符合模块化设计原则,满足软件重用的策略,可以降低软件开发成本,缩短开发周期
,是软件的开发和维护得到根本性的改善。
3.1.3 继承面向对象程序设计的另一重要特点是类的继承性 。 继承是让一个类成为另一个类的子类,子类继承父类的所有特性
,并可以扩充自己的特性 。 这种关系为共享数据和操作提供了一种良好的机制 。 继承提高了软件的重用性,可用性和界面的一致性 。
根据继承的特性,可以将继承分为如下两种主要形式:
Java最新实用教程
2009年 7月 27日星期一 8
( 1)直接继承和间接继承。如果类 c的定义直接继承于类
b,则称 c直接继承于 b,且 b是 c的直接父类;如果又有 b类又直接继承于 a类,则可称 c类间接继承于 a类。间接继承体现了继承关系的可传递性。
( 2)单继承和多继承。如果一个类只有一个直接父类,
则称该关系为单继承;如果一个类有多于一个以上的父类
,则称该继承关系为多继承。 Java语言只支持单继承,而不支持多继承。
3.1.4 多态多态性也是面向对象编程的一个特性,它反映了现实世界中谋类事物中的每个实体,都具有一些不同于其它实体的某些方面,也是针对于类中有相似功能的
Java最新实用教程
2009年 7月 27日星期一 9
不同方法以同一方法名来定义。这样,可以用相同的方式调用不同的同名方法。 Java中通过方法的重写和方法重载类实现多态。
3.2 类类是组成 java程序的基本要素,也是 java程序设计的重要思想表现 。 作为程序的基本要素,类封装了某个对象范畴的状态和方法,可以看作定义对象的模板 。
3.2.1 类声明类声明的最一般格式为:
[ 类 修 饰 符 ] class 类名 [ extends 父 类 名 ]
[implements [,接口名 ]
Java最新实用教程
2009年 7月 27日星期一 10
{
… //类体
}
其中,[ ]中的元素表示可选项 。 大括号对,{}” 及之间的内容为类体 。 类修饰符表示类的性质,主要是对于访问权限的限定 。 类的修饰符主要有:
Public 公共类修饰符 。 表示可以被相同包中的类继承或访问,而不同包中的类也可以通过 import引用后再继承或访问 。
Final 终结类修饰符 。 这将在第五章介绍 。
Abstract 抽象类修饰符 。 它没有方法的实现,也没有构造方法 。 不能用 new运算符实例化 。 不能被继承 。
也将在第五章进行详细介绍 。
Java最新实用教程
2009年 7月 27日星期一 11
class表示类声明的开始,class为关键字,用来定义类。
,class 类名,部分用来声明类。类名必须符合 java对标识符的命名标准,如果类名使用拉丁字母,习惯上首字母使用大写;类名为容易识别的关系可用多个单词复合而成
,此时习惯每个单词首字母大写。
关键字 extends表示类继承了某个父类,父类名必须是
java标准类名或程序本身已定义过的类名。
关键字 implements表示继承某个接口,若有多个接口则接口间用逗号隔开。
3.2.2 类体类是创建对象的模板,因此它应该能够描述一类事物共有的属性和功能,这个描述过程由类体实现。类声明之后的一对大括号,{”,,}” 以及它们之间的内容称
Java最新实用教程
2009年 7月 27日星期一 12
做类体,大括号之间的内容称做类体的内容。
类体的内容由两部分构成:一部分是变量的定义,用来刻画事物的属性;另一部分是方法的定义,用来描述事物的功能。
例子 3.1:定义一个 People类,类体内容的变量定义部分定义了 1个 double类型变量,身高,,1个布尔类型变量,性别,,两个个字符串类型变量,姓名,
和,职业,,和一个方法,人物简介,。
class People
{
double 身高; //定义变量部分
booblean 性别 =true; //定义变量时可以同时进行赋值
String 姓名,职业;
public void 人物间介 () //方法定义
{
System.out.println(,个人基本资料:,+姓名 +性别 +身高 +职业);
}}
Java最新实用教程
2009年 7月 27日星期一 13
当然,上述类的定义还可以有别的属性,如,婚否,
等,也可以有别的方法,如,业余爱好,等 。 特别注意的是:在变量定义部分可以将变量定义部分可以和变量的赋值同时进行,但不可以如下这样做:
class People
{
double 身高; //定义变量部分
booblean 性别; //定义变量和赋值分开进行性别 =true;
…
因为,加下画线的语句属于对变量操作语句,而不是定义语句 。 所有变量的操作语句只能放在方法种进行
。
Java最新实用教程
2009年 7月 27日星期一 14
3.2.4类的变量上一节提到类体分为变量定义和方法两部分 。 变量除了在类体变量定义部分进行定义外,还可以在方法内部定义;另外
,成员变量又可以分为静态变量和实例变量 。
1) 成员变量的定义格式
[修饰符 ] 变量类型 变量名 = 初值 ;
其中,变量名应为合法的标识符,尽量做到见名知意;变量类型通常指变量的基本数据类型 。 其中变量类型和变量名两项不可以省略 。
有时候某些类的实例也会作为类的成员变量,对象成员的定义格式如下:
类名 对象名 = new 类名 ( [参数表 ]) ;
大家可以类比一下普通变量和对象定义的关系 。
Java最新实用教程
2009年 7月 27日星期一 15
1) 变量的修饰符变量的修饰符有进行访问控制的修饰符和非访问控制的修饰符两种,主要的访问控制修饰符有 public,protected等,这些修饰符主要在继承等访问时进行访问权限的控制,将在第五章进行详细介绍;非访问控制符主要有 static,final等,将在后面单独介绍 。
2) 成员变量和局部变量变量按照定义的位置,可以分为成员变量和局部变量 。 变量定义部分定义的变量称为类的成员变量,成员变量在整个方法内有效,且和它在类体中书写的顺序无关;在方法内部定义的变量或方法的参数称为局部变量,局部变量只在定义它的方法内有效 。
例 3.2:在例 3.1的基础上增加一些变量及方法 。
Java最新实用教程
2009年 7月 27日星期一 16
class People
{
double 身高; //全局变量
booblean 性别 = true;
String 姓名,职业;
public void 人物间介 () //方法定义
{
age=30; //合法,因为 age为全局变量,切合定义位置无关
String 爱好 =,围棋,; //局部变量
System.out.println(,个人基本资料:,+姓名 +年龄 +性别 +身高 +职业 +爱好
) ;
}
int age;
public void speak(String s)
{
System.out.println(,我的娱乐是,+爱好 ) ; //非法,变量爱好是局部变量
}
}
在变量定义过程中,有时会出现成员变量和局部变量同名的情况,此时,在出现局部变量的方法中,同名的成员变量会被隐藏,即这个成员变量会在这个方法内暂时失效 。
Java最新实用教程
2009年 7月 27日星期一 17
如:
class Test
{
int a=30;
public static void mian( args[])
{
int a=60;
System.out.println(“a=”+a);
}
}
程序输出结果为 a=60,因为全局变量 a对于 main方法来说,已经失效 。
但有的时候还需要在出现上述情况的方法中还使用全局变量,
就必须使用关键字 this。 特别是希望某些方法得到的参数作为全局变量来用时,如下例所示 。
例 3.3:编写一个类,能够根据一个方法的参数来修改全局变量
a。
class Test
{
Java最新实用教程
2009年 7月 27日星期一 18
static String a=“全局变量”;
public String 修改字符串( String a)
{
String a;
this.a=a; //方法中的参数和全局变量同一化
System.out.println(“a=”+a);
}
}
1) 静态成员变量 ( 类成员变量或类变量 ) 与实例成员变量
( 实例变量 )
如果成员变量的类型关键字前面有关键字 static,这样的成员变量称作类变量或静态成员变量 。
如:
class dog{
float x; //实例成员变量
static int y; //类变量
…
}
Java最新实用教程
2009年 7月 27日星期一 19
如果一个类中的某个成员变量是类变量,那么所有类的实例对象的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变量,其他类的这个类变量也会随之改变。也就是说
,类变量被所有对象共享。
3.2.3构造方法根据类创建对象时,总是使用一个特殊的方法来初始化对象,这个方法称为构造方法。构造方法的名字要求与类同名(包括大小写),且无返回值。在创建对象时,java语言都会自动调用构造方法为新对象进行初始化。一个类可以创建多个构造方法,但必须具有不同的参数,也就是说
,构造方法可以重载。利用不同参数调用不同的构造方法
,可以实现对象的不同初始化。
例 3.4:还是 people类的定义:
Java最新实用教程
2009年 7月 27日星期一 20
class People
{
String name,career;
boolean sex; //true代表女,false代表男
int age;
double height;
//从姓名,年龄角度分析 people类时使用
public People(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(“姓名:,+name+“\n”+“年龄:,+age);
}
//从性别,职业角度分析 people类时使用
public People(String career,boolean sex)
{
this.career=career;
this.sex=sex;
System.out.println(“性别:,+sex+“\n”+“年龄:,+age);
}
public People() //如果有前面定义的构造方法,最好也定义此构造方法:
{
}
}
Java最新实用教程
2009年 7月 27日星期一 21
使用构造方法进行初始化的好处是避免了在生成对象后每次都调用对象的初始化方法,构造方法内部成员遵循前面局部变量的使用规则。总结构造方法有以下特点:
构造方法名与类名必须大小写及拼写完全一致。
构造方法用于对象初始化,不需返回值,但是不必用 void说明。
构造方法不能被程序调用,只能通过 new运算符调用
。
构造方法可由编程人员在类中定义,当用户没有定义时,java语言会自动生成一个为空的构造方法,当用 new
调用默认的构造方法时,对象被初始化为内部各数据相应数据类型的默认值;但是当用户定义有构造方法时,默认的构造方法会失效,如果还要用的话,最好把默认的构造方法显式地定义出来。
Java最新实用教程
2009年 7月 27日星期一 22
构造方法对于创建对象非常关键。虽然在大多数情况下,类的对象都是调用有参数的构造方法,方便对象变量的初始化。
同时,类定义时如果没有声明任何构造方法,系统会赋给此来一个默认(无参)的构造方法。但是,一旦用户在类中声明了构造方法(有参),系统将不会再赋给这个类默认的构造方法了。
所以,好的习惯是:要么不声明构造方法,要么声明两个以上构造方法,两个中包括一个无参数的构造方法。
3.2.5 终结函数终结方法,finalize(),该方法包含在 java,Long,Object类中。
java语言自动管理内存,可以自动进行垃圾收集,在收集前自动调用对象的 finalize()方法来释放系统资源。 finalize方法
Java最新实用教程
2009年 7月 27日星期一 23
很相似 c++ 中的析构函数。但由于 java有垃圾回收机制,并且
java垃圾回收器的使用不由程序员控制,也无规律可循,有可能在程序终止时都没有启动的机会。因此,这样的资源回收并不是可靠的方法。
这种垃圾回收器的不确定性,有时会给程序运行带来麻烦,
比如说在某段时间系统产生了大量的待释放资源却无法有效释放。为了解决这种麻烦,java里提供了 System.gc() 方法,使用这个方法,可以强制启动垃圾回收器,进而自动执行 finalize() 方法。
例 3.5:一个 finalize的一个典型应用示例。
class Person
{
public void finalize()
{
System.out.println("the object is gone!");
}
Java最新实用教程
2009年 7月 27日星期一 24
public static void main(String [] args)
{
new Person();
new Person();
new Person();
System.gc();
System.out.println("the program is ending!");
}
}
运行结果如图 3-1。
图 3-1对象的释放
3.2.6类方法和实例方法
Java最新实用教程
2009年 7月 27日星期一 25
正如成员变量分为类变量和实例变量一样,类的方法也分为类方法和实例方法。
如:
class dog{
float x( ) //实例方法
{…
return …
}
static int y( ) ; //类方法
{…
return…
}
}
若一个方法被声明为类方法,则它只能对类变量进行操作,
且象类变量一样,类的所有实例对象共享同一个类方法 。 如
:
Java最新实用教程
2009年 7月 27日星期一 26
class test
{ int a=3; static int b;
float f( int x,int y)
{
a=x; b=y; //变量引用合法,因为 f为实例方法
return x*y;
}
static float g( int x,int y)
{
a=x; b=2*a; //变量 a引用不合法,因为 g为类方法,而 a为实例变量
return x*y;
}
}
3.3 对象的创建和使用知道类是创建对象的模板。当用一个类创建了一个对象时,
意味着一类事物中具体的某个客观实体被程序表述了。在面相对对象的程序中,对象是由属性和方法封装而成,属性是实体的一些特征值或构件,方法是实体的功能和行为。
Java最新实用教程
2009年 7月 27日星期一 27
对象可以被看作复杂的数据结构。
一个对象的生命周期分为三个阶段:生成、使用和清除。
3.3.1创建对象创建一个对象包括两个步骤:声明对象和为对象分配内存。
1)对象的声明一般格式为:类名 对象名如:
People 张三这里 people是前面定义的一个类的名字,张三是声明对象的名字。
但此时对象“张三”的内存中没有任何数据,即“张三”还是一个空对象,不能使用。要是用这个对象还必须为这个对象分配内存,也叫做为对象分配实体。
Java最新实用教程
2009年 7月 27日星期一 28
1)为对象分配内存为对象分配内存,即使用 new运算符和类的构造方法实例化某个对象。如果类中没有构造方法,系统会自动调用默认的构造方法(没有参数,名字遵循普通构造方法的要求:和类名相同
),格式为对象名 =new构造方法名( [参数 1][,参数 2]… );
也可以把以上两个步骤合在一起,格式为:
类名 对象名 = new 构造方法名( [参数 1][,参数 2]… );
例 3.6:创建 people类的对象。
class People
{
String name,career;
boolean sex=true;//true代表女,false代表男
int age;
double height;
//从姓名,年龄角度分析 people类时使用
public People(String name,int age)
Java最新实用教程
2009年 7月 27日星期一 29
{
this.name=name;
this.age=age;
System.out.println("姓名,"+name+" 年龄,"+age+"\n");
}
//从性别、职业角度分析 people类时使用:
public People(String career,boolean sex)
{
this.career=career;
this.sex=sex;
System.out.println("职业,"+career+" 性别,"+sex+"\n");
}
public People() //如果有前面定义的构造方法,最好也定义此构造方法
{
System.out.println(sex);
}
}
class A
{
public static void main(String args[])
{
Java最新实用教程
2009年 7月 27日星期一 30
//声明对象并分配内存
People 张三 = new People("张华 ",20); //从姓名、年龄创建对象
People 李四 = new People("自由职业者 ",true);//从职业、性别创建对象
People 无名 = new People();//用显式定义的默认构造方法创建对象
}
}
编译并运行结果如图 3-2。
图 3-2 创建对象上述类 A的 main方法中的三条语句,创建了三个对象:张三
、李四和无名,并且为这三个对象分配了内存。执行完后的内存状态如图 3-3所示。
其中张三、李四和无名分别代表系统分配给三个对象的应用句柄。
Java最新实用教程
2009年 7月 27日星期一 31
图 3-3 对象的内存模型
Java最新实用教程
2009年 7月 27日星期一 32
对象创建的一个主要任务是对象变量的赋值,即对象变量的初始化。初始化常用如下三种方式:
定义类时在类体中用赋值语句进行初始化。如例
3.7中对象“张华”和“无名”的性别属性,对象创建时没有对 sex赋值,若按照默认的赋值应为 fale,但类定义时已经赋值为 true。
使用构造方法进行初始化。如例 3.7中对象“张华
”的属性,name和 age,对象“李四”的属性,career和 sex
。
采用默认的初始化。主要是用类默认的构造方法进行初始化时,默认的构造方法没有参数,并且成员变量在定义类时也没有赋初值,这些变量便被初始化为变量类型默认的初始值:整型变量默认值是 0,浮点型默认为 0.0f,
双精度型默认为 0.0d,布尔型默认为 false; 对于引用型或复合类型数据,如字符串等数据,默认初值均为 null。
Java最新实用教程
2009年 7月 27日星期一 33
3.3.2对象的使用对象创建以后,就拥有了一套创建该对象的类中的变量和方法
。对象就不仅可以操作自己的变量以改变自己的状态,同时还可以操作自己的方法,通过调用某些方法产生一定的行为。
在程序中,对象的使用由几种情况:访问对象的成员变量和调用成员方法;对象作为类的成员;对象作为方法参数和返回值
。
Java中总是通过使用运算符,.”调用自己的变量或方法。
例 3.7:访问对象示例 。
class Point//定义类 Point
{
int x,y; //定义成员变量
Point()//定义无参数构造方法
{
x=0;
y=0;
}
Java最新实用教程
2009年 7月 27日星期一 34
Point(int x,int y)//定义带参数构造方法
{
this.x=x;
this.y=y;
}
void move(int x1,int y1)//定义 move方法
{
x=x1;
y=y1;
}
}
public class Obj{
public static void main(String args[])
{
Point p1=new Point(0,0); //生成对象
p1.move(5,5); //调用成员方法 move
System.out.println("x="+p1.x+" y="+p1.y);//访问成员变量
}}
此程序中 Point类有三个方法。主类中的 main方法中,调用了
Point类对象的 move方法。程序的运行结果:
x=5 y=5
Java最新实用教程
2009年 7月 27日星期一 35
另外,因为对象也是一种变量,因此它可作为数组元素、类的成员、也可以出现在成员方法的参数表和方法体中。
3.3.3 在类定义内调用方法类中的方法之间能互相调用。方法可以对变量进行处理,也可以把其他方法的处理结果作为参数进行处理,以完成更复杂的工作。
1)方法调用规则
实例方法可以调用该类中的其他任何方法。
类方法只能调用该类中的其他类方法,不能调用实例方法。
下面是一个实例方法和类方法之间互相调用以及方法处理变量的的综合例子:
Java最新实用教程
2009年 7月 27日星期一 36
class test
{ int a=3; static int b;
float f( int x,int y)
{
a=x; b=y; //变量引用合法,因为 f为实例方法
return x*y;
}
static float g( int x,int y)
{
a=x; b=2*a; //变量 a引用不合法,因为 g为类方法,而 a为实例变量
return x*y;
}
public void static main( String args[]) ; //特殊的类方法
{
System.out.println(a); //不合法
System.out.println(f(1,2)); //不合法,f实例方法
System.out.println(g(1,2)); //可以引用方法 g,但方法 g本身不合法
}
}
2)方法调用的形式
Java最新实用教程
2009年 7月 27日星期一 37
在创建方法时,给出了这个方法行为的定义。为了使用方法
,必须请求或者调用,基于一个方法是否有返回值有两种方法来调用:
如果方法有返回值,对它的调用通常作为一个数值来处理。例如:
int larger = max(3,4);
调用 max(3,4)并将这个方法的结果赋值给变量 larger。 同时也可以用作某些方法的参数,如:
System.out.println(max(3,4));
它将方法作为参数并输出显示方法的返回值。
如果方法没有返回值,即 void类型,则对这个方法的调用必定是一条语句。比如上边的
,System.out.println(max(3,4));”,println方法没有方回值,重点是完成一定的功能。
Java最新实用教程
2009年 7月 27日星期一 38
3.4 参数的传递方法的功能是它与参数一起工作的能力。如可以使用 println来打印任何信息,使用数学方法对任何数据进行特定操作。
3.4.1 以变量为参数调用方法以变量为参数调用方法,也就是基本数据类型的参数的传递
。
在调用方法时,需要传递参数,以实参代替形参 。 进行参数传递时最基本的要求是实参必须与方法的形参用相同的顺序给出,这称为参数顺序结合 。 如:
public void nprintln(String s,int n)
{
for (int I=0; I<n; I++)
System.out.println(s);
}
上述方法的调用语句可以是 nprintln(“hello”,3),而不能写成
Java最新实用教程
2009年 7月 27日星期一 39
nprintln(3,“hello”)。
注意:不但要求参数顺序相同,实参还必须在个数和兼容类型方面与在方法定义中的形参匹配。兼容类型意思是可以在没有显式强制的情况下给方法传递一个实参 。
3.4.2以数组作为参数或返回值的方法调用向一个方法传递数组参数时,数组的名字不用带方括号。例如数组 num的声明语句为,int num[] = new int[24]”。 若要把数组 num作为参数传递给某个方法时,只需要将数组名 num作为实参,因为前面 2.4节中已经介绍过,java的数组大小是数组的
length属性,不需要单独给出。
尽管整个数组是用引用来传递的(即数组名代表数组的引用
),但基本类型的每个数组元素仍用值传递,这与简单数据类型变量完全相同。这些简单的单个数据个体被称为标量或标量数。为了向一个方法传递一个数组元素,可以在方法
Java最新实用教程
2009年 7月 27日星期一 40
调用中使用该数组元素带下标的名字作为参数。
当然,对于通过方法调用来接收数组的方法而言,该方法的形参表中必须指明要接受的数组。如方法 modifyNum(int a[]),其中的参数,int a[]”表示方法将接受一个整数数组。由于数组是通过引用传递,当被调用的方法使用数组名 a时,它指的是一个名为 a的数组实际参数。
例 3.8:有数组 num,编程首在浏览器中显示数组 num中的前 5
个元素。接着 num被传递到方法 modifyNum中,在这个方法中
,num的每个元素被乘以 3,然后显示。
import java.applet.*;
import java.awt.*;
public class PassArray_test extends Applet
{
int num[] = { 1,2,3,4,5 };
public int[] modifyNum( int a[] ) //以数组为参数的方法
{for ( int i = 0; i < a.length; i++ )
a[ i ] *= 2;
Java最新实用教程
2009年 7月 27日星期一 41
return a; //返回一个数组
}
public void paint(Graphics g)
{
String temp="";
for ( int i = 0; i < num.length; i++ )
temp=temp+num[i]+" ";
g.drawString("数组元素的初值为,"+temp,30,30);
temp="";
num = modifyNum( num ); // 传递数组参数调用方法
for ( int i = 0; i < num.length; i++ )
temp=temp+num [i]+" ";
g.drawString("数组被方法调用后的值为,"+temp,30,60);
}
}
运行结果如图 3-4。
图 3-4 向方法传递数组
Java最新实用教程
2009年 7月 27日星期一 42
利用数组作为参数,可以方便实现对数组的各种操作如数组排序等。
3.5 匿名对象创建完对象,也可以不定义该对象的句柄,而直接调用这个对象的方法,这样的对象叫做匿名对象。如前面例 3.7中的类
A可改写为如下:
class A
{
public static void main(String args[])
{
//声明对象并分配内存
new People(“张华,,20); //这样的改动对程序的执行没有任何影响
new People("自由职业者 ",true);
new People();
}
}
因为其中的三个对象均被调用一次,从这个例子中可以体会
Java最新实用教程
2009年 7月 27日星期一 43
到构造方法特点:只要被调用,就会自动执行,有没有名字都可以用 new运算符创建实例。
使用匿名对象主要由以下两种情况:
如果一个对象只进行一次方法调用。
将匿名对象作为实参传递给一个函数调用。
第二种情况的应用也比较多,比如有一个方法需要以一个
People类的实例作为参数,那么可以这样写:,public void
getAPeople(new People());”。
Java最新实用教程
2009年 7月 27日星期一 44
3.6 本章小结类是创建对象的抽象模板。本章主要介绍了 java面向对象程序设计基本概念和思想,类与对象的基本概念和基本语法,包括类的声明及建立、类中变量及访问控制修饰符的介绍、对象的创建、使用、回收等。
类是对一类对象的共同属性和行为的抽象。由数据成员、方法成员组成。类成员都有一些访问控制符,成员之间可以进行访问。
对象是类的实例,通过类的构造方法创建并初始化。
本章最后简单介绍了方法调用的基本方式、方法的参数传递和匿名对象。
Java最新实用教程
2009年 7月 27日星期一 2
学习目的:
了解 面向对象基本概念
掌握 类的创建和使用
掌握 对象的创建与使用
了解参数的传递
了解 匿名对象
学习重点:
掌握 类的创建和使用
掌握 对象的创建与使用
Java最新实用教程
2009年 7月 27日星期一 3
第 三 章 类和对象本章提要:
面向对象基本概念
类的创建和使用
对象的创建与使用
参数的传递
匿名对象
Java最新实用教程
2009年 7月 27日星期一 4
3.1 面向对象的程序设计方法概述
3.1.1 抽象抽象是人们解决问题的主要手段,也是面向对象程序设计解决实际问题法宝之一 。 所谓抽象就是指从众多的事物面向对象程序设计标志着程序设计思想发展到一个新的高度,它用一种更符合人们认识客观世界的思维方式进行程序设计:相对于面向过程的程序设计以研究问题的解决过程为主体,面向对象编程是以对象为主体,使编程富于创造性,提高了程序的可重用性,简化了编程过程,同时也使程序更易于维护 。
Java最新实用教程
2009年 7月 27日星期一 5
中舍弃个别的、非本质的属性,抽出共同的、本质的属性的过程。是面向对象程序设计的核心概念。
用面向对象编程解决现实世界的问题时,首先是利用抽象技术将现实世界中的各种实体,归纳总结出共性的东西形成一类实体的基本特征。这些特征包括属性和行为
,这些本质属性和方法的有机组合,就是面向对象方法中的类。
3.1.2 封装封装性是面向对象编程的基本特性之一,它通过封装隐蔽了对象的内部实现细节 。 对象的封装有两个方面:
Java最新实用教程
2009年 7月 27日星期一 6
一方面表示对象的属性和方法是不可分割的整体 。 对象的属性和方法封装为一体具有重要的意义,因为它反映了对象同时具有了客观事物的静态特征和动态行为相统一的客观规律,使软件对客观事物的描述更接近人类表述;而过去的面向过程的编程语言都是将功 能和数据相分离,使软件对客观事物的描述存在偏差,很难自然地用语言表达客观事物的对应关系 。
另一方面,封装还表示对象内部细节的隐蔽性 。 对内部细节的隐蔽性反映了事物客观的相对独立性,这样既可以防止外界的干扰,又可以降低复杂性 。 在 java语言中
,对象,类和包逐层封装,为管理大量的对象和类提供了方便,也增强了语言的安全性 。 隐藏了内部细节也使得 java的使用者和设计者分离,使用者只需用接口去满足软件重用的策略,可以降低软件开发成本,缩短开发周期,是软件的开发和维护得到根本性的改善 。
Java最新实用教程
2009年 7月 27日星期一 7
访问对象,而不必知道对象的内部细节。
从软件工程的角度讲,封装也符合模块化设计原则,满足软件重用的策略,可以降低软件开发成本,缩短开发周期
,是软件的开发和维护得到根本性的改善。
3.1.3 继承面向对象程序设计的另一重要特点是类的继承性 。 继承是让一个类成为另一个类的子类,子类继承父类的所有特性
,并可以扩充自己的特性 。 这种关系为共享数据和操作提供了一种良好的机制 。 继承提高了软件的重用性,可用性和界面的一致性 。
根据继承的特性,可以将继承分为如下两种主要形式:
Java最新实用教程
2009年 7月 27日星期一 8
( 1)直接继承和间接继承。如果类 c的定义直接继承于类
b,则称 c直接继承于 b,且 b是 c的直接父类;如果又有 b类又直接继承于 a类,则可称 c类间接继承于 a类。间接继承体现了继承关系的可传递性。
( 2)单继承和多继承。如果一个类只有一个直接父类,
则称该关系为单继承;如果一个类有多于一个以上的父类
,则称该继承关系为多继承。 Java语言只支持单继承,而不支持多继承。
3.1.4 多态多态性也是面向对象编程的一个特性,它反映了现实世界中谋类事物中的每个实体,都具有一些不同于其它实体的某些方面,也是针对于类中有相似功能的
Java最新实用教程
2009年 7月 27日星期一 9
不同方法以同一方法名来定义。这样,可以用相同的方式调用不同的同名方法。 Java中通过方法的重写和方法重载类实现多态。
3.2 类类是组成 java程序的基本要素,也是 java程序设计的重要思想表现 。 作为程序的基本要素,类封装了某个对象范畴的状态和方法,可以看作定义对象的模板 。
3.2.1 类声明类声明的最一般格式为:
[ 类 修 饰 符 ] class 类名 [ extends 父 类 名 ]
[implements [,接口名 ]
Java最新实用教程
2009年 7月 27日星期一 10
{
… //类体
}
其中,[ ]中的元素表示可选项 。 大括号对,{}” 及之间的内容为类体 。 类修饰符表示类的性质,主要是对于访问权限的限定 。 类的修饰符主要有:
Public 公共类修饰符 。 表示可以被相同包中的类继承或访问,而不同包中的类也可以通过 import引用后再继承或访问 。
Final 终结类修饰符 。 这将在第五章介绍 。
Abstract 抽象类修饰符 。 它没有方法的实现,也没有构造方法 。 不能用 new运算符实例化 。 不能被继承 。
也将在第五章进行详细介绍 。
Java最新实用教程
2009年 7月 27日星期一 11
class表示类声明的开始,class为关键字,用来定义类。
,class 类名,部分用来声明类。类名必须符合 java对标识符的命名标准,如果类名使用拉丁字母,习惯上首字母使用大写;类名为容易识别的关系可用多个单词复合而成
,此时习惯每个单词首字母大写。
关键字 extends表示类继承了某个父类,父类名必须是
java标准类名或程序本身已定义过的类名。
关键字 implements表示继承某个接口,若有多个接口则接口间用逗号隔开。
3.2.2 类体类是创建对象的模板,因此它应该能够描述一类事物共有的属性和功能,这个描述过程由类体实现。类声明之后的一对大括号,{”,,}” 以及它们之间的内容称
Java最新实用教程
2009年 7月 27日星期一 12
做类体,大括号之间的内容称做类体的内容。
类体的内容由两部分构成:一部分是变量的定义,用来刻画事物的属性;另一部分是方法的定义,用来描述事物的功能。
例子 3.1:定义一个 People类,类体内容的变量定义部分定义了 1个 double类型变量,身高,,1个布尔类型变量,性别,,两个个字符串类型变量,姓名,
和,职业,,和一个方法,人物简介,。
class People
{
double 身高; //定义变量部分
booblean 性别 =true; //定义变量时可以同时进行赋值
String 姓名,职业;
public void 人物间介 () //方法定义
{
System.out.println(,个人基本资料:,+姓名 +性别 +身高 +职业);
}}
Java最新实用教程
2009年 7月 27日星期一 13
当然,上述类的定义还可以有别的属性,如,婚否,
等,也可以有别的方法,如,业余爱好,等 。 特别注意的是:在变量定义部分可以将变量定义部分可以和变量的赋值同时进行,但不可以如下这样做:
class People
{
double 身高; //定义变量部分
booblean 性别; //定义变量和赋值分开进行性别 =true;
…
因为,加下画线的语句属于对变量操作语句,而不是定义语句 。 所有变量的操作语句只能放在方法种进行
。
Java最新实用教程
2009年 7月 27日星期一 14
3.2.4类的变量上一节提到类体分为变量定义和方法两部分 。 变量除了在类体变量定义部分进行定义外,还可以在方法内部定义;另外
,成员变量又可以分为静态变量和实例变量 。
1) 成员变量的定义格式
[修饰符 ] 变量类型 变量名 = 初值 ;
其中,变量名应为合法的标识符,尽量做到见名知意;变量类型通常指变量的基本数据类型 。 其中变量类型和变量名两项不可以省略 。
有时候某些类的实例也会作为类的成员变量,对象成员的定义格式如下:
类名 对象名 = new 类名 ( [参数表 ]) ;
大家可以类比一下普通变量和对象定义的关系 。
Java最新实用教程
2009年 7月 27日星期一 15
1) 变量的修饰符变量的修饰符有进行访问控制的修饰符和非访问控制的修饰符两种,主要的访问控制修饰符有 public,protected等,这些修饰符主要在继承等访问时进行访问权限的控制,将在第五章进行详细介绍;非访问控制符主要有 static,final等,将在后面单独介绍 。
2) 成员变量和局部变量变量按照定义的位置,可以分为成员变量和局部变量 。 变量定义部分定义的变量称为类的成员变量,成员变量在整个方法内有效,且和它在类体中书写的顺序无关;在方法内部定义的变量或方法的参数称为局部变量,局部变量只在定义它的方法内有效 。
例 3.2:在例 3.1的基础上增加一些变量及方法 。
Java最新实用教程
2009年 7月 27日星期一 16
class People
{
double 身高; //全局变量
booblean 性别 = true;
String 姓名,职业;
public void 人物间介 () //方法定义
{
age=30; //合法,因为 age为全局变量,切合定义位置无关
String 爱好 =,围棋,; //局部变量
System.out.println(,个人基本资料:,+姓名 +年龄 +性别 +身高 +职业 +爱好
) ;
}
int age;
public void speak(String s)
{
System.out.println(,我的娱乐是,+爱好 ) ; //非法,变量爱好是局部变量
}
}
在变量定义过程中,有时会出现成员变量和局部变量同名的情况,此时,在出现局部变量的方法中,同名的成员变量会被隐藏,即这个成员变量会在这个方法内暂时失效 。
Java最新实用教程
2009年 7月 27日星期一 17
如:
class Test
{
int a=30;
public static void mian( args[])
{
int a=60;
System.out.println(“a=”+a);
}
}
程序输出结果为 a=60,因为全局变量 a对于 main方法来说,已经失效 。
但有的时候还需要在出现上述情况的方法中还使用全局变量,
就必须使用关键字 this。 特别是希望某些方法得到的参数作为全局变量来用时,如下例所示 。
例 3.3:编写一个类,能够根据一个方法的参数来修改全局变量
a。
class Test
{
Java最新实用教程
2009年 7月 27日星期一 18
static String a=“全局变量”;
public String 修改字符串( String a)
{
String a;
this.a=a; //方法中的参数和全局变量同一化
System.out.println(“a=”+a);
}
}
1) 静态成员变量 ( 类成员变量或类变量 ) 与实例成员变量
( 实例变量 )
如果成员变量的类型关键字前面有关键字 static,这样的成员变量称作类变量或静态成员变量 。
如:
class dog{
float x; //实例成员变量
static int y; //类变量
…
}
Java最新实用教程
2009年 7月 27日星期一 19
如果一个类中的某个成员变量是类变量,那么所有类的实例对象的这个类变量都分配给同一处的内存,修改了其中一个对象的这个类变量,其他类的这个类变量也会随之改变。也就是说
,类变量被所有对象共享。
3.2.3构造方法根据类创建对象时,总是使用一个特殊的方法来初始化对象,这个方法称为构造方法。构造方法的名字要求与类同名(包括大小写),且无返回值。在创建对象时,java语言都会自动调用构造方法为新对象进行初始化。一个类可以创建多个构造方法,但必须具有不同的参数,也就是说
,构造方法可以重载。利用不同参数调用不同的构造方法
,可以实现对象的不同初始化。
例 3.4:还是 people类的定义:
Java最新实用教程
2009年 7月 27日星期一 20
class People
{
String name,career;
boolean sex; //true代表女,false代表男
int age;
double height;
//从姓名,年龄角度分析 people类时使用
public People(String name,int age)
{
this.name=name;
this.age=age;
System.out.println(“姓名:,+name+“\n”+“年龄:,+age);
}
//从性别,职业角度分析 people类时使用
public People(String career,boolean sex)
{
this.career=career;
this.sex=sex;
System.out.println(“性别:,+sex+“\n”+“年龄:,+age);
}
public People() //如果有前面定义的构造方法,最好也定义此构造方法:
{
}
}
Java最新实用教程
2009年 7月 27日星期一 21
使用构造方法进行初始化的好处是避免了在生成对象后每次都调用对象的初始化方法,构造方法内部成员遵循前面局部变量的使用规则。总结构造方法有以下特点:
构造方法名与类名必须大小写及拼写完全一致。
构造方法用于对象初始化,不需返回值,但是不必用 void说明。
构造方法不能被程序调用,只能通过 new运算符调用
。
构造方法可由编程人员在类中定义,当用户没有定义时,java语言会自动生成一个为空的构造方法,当用 new
调用默认的构造方法时,对象被初始化为内部各数据相应数据类型的默认值;但是当用户定义有构造方法时,默认的构造方法会失效,如果还要用的话,最好把默认的构造方法显式地定义出来。
Java最新实用教程
2009年 7月 27日星期一 22
构造方法对于创建对象非常关键。虽然在大多数情况下,类的对象都是调用有参数的构造方法,方便对象变量的初始化。
同时,类定义时如果没有声明任何构造方法,系统会赋给此来一个默认(无参)的构造方法。但是,一旦用户在类中声明了构造方法(有参),系统将不会再赋给这个类默认的构造方法了。
所以,好的习惯是:要么不声明构造方法,要么声明两个以上构造方法,两个中包括一个无参数的构造方法。
3.2.5 终结函数终结方法,finalize(),该方法包含在 java,Long,Object类中。
java语言自动管理内存,可以自动进行垃圾收集,在收集前自动调用对象的 finalize()方法来释放系统资源。 finalize方法
Java最新实用教程
2009年 7月 27日星期一 23
很相似 c++ 中的析构函数。但由于 java有垃圾回收机制,并且
java垃圾回收器的使用不由程序员控制,也无规律可循,有可能在程序终止时都没有启动的机会。因此,这样的资源回收并不是可靠的方法。
这种垃圾回收器的不确定性,有时会给程序运行带来麻烦,
比如说在某段时间系统产生了大量的待释放资源却无法有效释放。为了解决这种麻烦,java里提供了 System.gc() 方法,使用这个方法,可以强制启动垃圾回收器,进而自动执行 finalize() 方法。
例 3.5:一个 finalize的一个典型应用示例。
class Person
{
public void finalize()
{
System.out.println("the object is gone!");
}
Java最新实用教程
2009年 7月 27日星期一 24
public static void main(String [] args)
{
new Person();
new Person();
new Person();
System.gc();
System.out.println("the program is ending!");
}
}
运行结果如图 3-1。
图 3-1对象的释放
3.2.6类方法和实例方法
Java最新实用教程
2009年 7月 27日星期一 25
正如成员变量分为类变量和实例变量一样,类的方法也分为类方法和实例方法。
如:
class dog{
float x( ) //实例方法
{…
return …
}
static int y( ) ; //类方法
{…
return…
}
}
若一个方法被声明为类方法,则它只能对类变量进行操作,
且象类变量一样,类的所有实例对象共享同一个类方法 。 如
:
Java最新实用教程
2009年 7月 27日星期一 26
class test
{ int a=3; static int b;
float f( int x,int y)
{
a=x; b=y; //变量引用合法,因为 f为实例方法
return x*y;
}
static float g( int x,int y)
{
a=x; b=2*a; //变量 a引用不合法,因为 g为类方法,而 a为实例变量
return x*y;
}
}
3.3 对象的创建和使用知道类是创建对象的模板。当用一个类创建了一个对象时,
意味着一类事物中具体的某个客观实体被程序表述了。在面相对对象的程序中,对象是由属性和方法封装而成,属性是实体的一些特征值或构件,方法是实体的功能和行为。
Java最新实用教程
2009年 7月 27日星期一 27
对象可以被看作复杂的数据结构。
一个对象的生命周期分为三个阶段:生成、使用和清除。
3.3.1创建对象创建一个对象包括两个步骤:声明对象和为对象分配内存。
1)对象的声明一般格式为:类名 对象名如:
People 张三这里 people是前面定义的一个类的名字,张三是声明对象的名字。
但此时对象“张三”的内存中没有任何数据,即“张三”还是一个空对象,不能使用。要是用这个对象还必须为这个对象分配内存,也叫做为对象分配实体。
Java最新实用教程
2009年 7月 27日星期一 28
1)为对象分配内存为对象分配内存,即使用 new运算符和类的构造方法实例化某个对象。如果类中没有构造方法,系统会自动调用默认的构造方法(没有参数,名字遵循普通构造方法的要求:和类名相同
),格式为对象名 =new构造方法名( [参数 1][,参数 2]… );
也可以把以上两个步骤合在一起,格式为:
类名 对象名 = new 构造方法名( [参数 1][,参数 2]… );
例 3.6:创建 people类的对象。
class People
{
String name,career;
boolean sex=true;//true代表女,false代表男
int age;
double height;
//从姓名,年龄角度分析 people类时使用
public People(String name,int age)
Java最新实用教程
2009年 7月 27日星期一 29
{
this.name=name;
this.age=age;
System.out.println("姓名,"+name+" 年龄,"+age+"\n");
}
//从性别、职业角度分析 people类时使用:
public People(String career,boolean sex)
{
this.career=career;
this.sex=sex;
System.out.println("职业,"+career+" 性别,"+sex+"\n");
}
public People() //如果有前面定义的构造方法,最好也定义此构造方法
{
System.out.println(sex);
}
}
class A
{
public static void main(String args[])
{
Java最新实用教程
2009年 7月 27日星期一 30
//声明对象并分配内存
People 张三 = new People("张华 ",20); //从姓名、年龄创建对象
People 李四 = new People("自由职业者 ",true);//从职业、性别创建对象
People 无名 = new People();//用显式定义的默认构造方法创建对象
}
}
编译并运行结果如图 3-2。
图 3-2 创建对象上述类 A的 main方法中的三条语句,创建了三个对象:张三
、李四和无名,并且为这三个对象分配了内存。执行完后的内存状态如图 3-3所示。
其中张三、李四和无名分别代表系统分配给三个对象的应用句柄。
Java最新实用教程
2009年 7月 27日星期一 31
图 3-3 对象的内存模型
Java最新实用教程
2009年 7月 27日星期一 32
对象创建的一个主要任务是对象变量的赋值,即对象变量的初始化。初始化常用如下三种方式:
定义类时在类体中用赋值语句进行初始化。如例
3.7中对象“张华”和“无名”的性别属性,对象创建时没有对 sex赋值,若按照默认的赋值应为 fale,但类定义时已经赋值为 true。
使用构造方法进行初始化。如例 3.7中对象“张华
”的属性,name和 age,对象“李四”的属性,career和 sex
。
采用默认的初始化。主要是用类默认的构造方法进行初始化时,默认的构造方法没有参数,并且成员变量在定义类时也没有赋初值,这些变量便被初始化为变量类型默认的初始值:整型变量默认值是 0,浮点型默认为 0.0f,
双精度型默认为 0.0d,布尔型默认为 false; 对于引用型或复合类型数据,如字符串等数据,默认初值均为 null。
Java最新实用教程
2009年 7月 27日星期一 33
3.3.2对象的使用对象创建以后,就拥有了一套创建该对象的类中的变量和方法
。对象就不仅可以操作自己的变量以改变自己的状态,同时还可以操作自己的方法,通过调用某些方法产生一定的行为。
在程序中,对象的使用由几种情况:访问对象的成员变量和调用成员方法;对象作为类的成员;对象作为方法参数和返回值
。
Java中总是通过使用运算符,.”调用自己的变量或方法。
例 3.7:访问对象示例 。
class Point//定义类 Point
{
int x,y; //定义成员变量
Point()//定义无参数构造方法
{
x=0;
y=0;
}
Java最新实用教程
2009年 7月 27日星期一 34
Point(int x,int y)//定义带参数构造方法
{
this.x=x;
this.y=y;
}
void move(int x1,int y1)//定义 move方法
{
x=x1;
y=y1;
}
}
public class Obj{
public static void main(String args[])
{
Point p1=new Point(0,0); //生成对象
p1.move(5,5); //调用成员方法 move
System.out.println("x="+p1.x+" y="+p1.y);//访问成员变量
}}
此程序中 Point类有三个方法。主类中的 main方法中,调用了
Point类对象的 move方法。程序的运行结果:
x=5 y=5
Java最新实用教程
2009年 7月 27日星期一 35
另外,因为对象也是一种变量,因此它可作为数组元素、类的成员、也可以出现在成员方法的参数表和方法体中。
3.3.3 在类定义内调用方法类中的方法之间能互相调用。方法可以对变量进行处理,也可以把其他方法的处理结果作为参数进行处理,以完成更复杂的工作。
1)方法调用规则
实例方法可以调用该类中的其他任何方法。
类方法只能调用该类中的其他类方法,不能调用实例方法。
下面是一个实例方法和类方法之间互相调用以及方法处理变量的的综合例子:
Java最新实用教程
2009年 7月 27日星期一 36
class test
{ int a=3; static int b;
float f( int x,int y)
{
a=x; b=y; //变量引用合法,因为 f为实例方法
return x*y;
}
static float g( int x,int y)
{
a=x; b=2*a; //变量 a引用不合法,因为 g为类方法,而 a为实例变量
return x*y;
}
public void static main( String args[]) ; //特殊的类方法
{
System.out.println(a); //不合法
System.out.println(f(1,2)); //不合法,f实例方法
System.out.println(g(1,2)); //可以引用方法 g,但方法 g本身不合法
}
}
2)方法调用的形式
Java最新实用教程
2009年 7月 27日星期一 37
在创建方法时,给出了这个方法行为的定义。为了使用方法
,必须请求或者调用,基于一个方法是否有返回值有两种方法来调用:
如果方法有返回值,对它的调用通常作为一个数值来处理。例如:
int larger = max(3,4);
调用 max(3,4)并将这个方法的结果赋值给变量 larger。 同时也可以用作某些方法的参数,如:
System.out.println(max(3,4));
它将方法作为参数并输出显示方法的返回值。
如果方法没有返回值,即 void类型,则对这个方法的调用必定是一条语句。比如上边的
,System.out.println(max(3,4));”,println方法没有方回值,重点是完成一定的功能。
Java最新实用教程
2009年 7月 27日星期一 38
3.4 参数的传递方法的功能是它与参数一起工作的能力。如可以使用 println来打印任何信息,使用数学方法对任何数据进行特定操作。
3.4.1 以变量为参数调用方法以变量为参数调用方法,也就是基本数据类型的参数的传递
。
在调用方法时,需要传递参数,以实参代替形参 。 进行参数传递时最基本的要求是实参必须与方法的形参用相同的顺序给出,这称为参数顺序结合 。 如:
public void nprintln(String s,int n)
{
for (int I=0; I<n; I++)
System.out.println(s);
}
上述方法的调用语句可以是 nprintln(“hello”,3),而不能写成
Java最新实用教程
2009年 7月 27日星期一 39
nprintln(3,“hello”)。
注意:不但要求参数顺序相同,实参还必须在个数和兼容类型方面与在方法定义中的形参匹配。兼容类型意思是可以在没有显式强制的情况下给方法传递一个实参 。
3.4.2以数组作为参数或返回值的方法调用向一个方法传递数组参数时,数组的名字不用带方括号。例如数组 num的声明语句为,int num[] = new int[24]”。 若要把数组 num作为参数传递给某个方法时,只需要将数组名 num作为实参,因为前面 2.4节中已经介绍过,java的数组大小是数组的
length属性,不需要单独给出。
尽管整个数组是用引用来传递的(即数组名代表数组的引用
),但基本类型的每个数组元素仍用值传递,这与简单数据类型变量完全相同。这些简单的单个数据个体被称为标量或标量数。为了向一个方法传递一个数组元素,可以在方法
Java最新实用教程
2009年 7月 27日星期一 40
调用中使用该数组元素带下标的名字作为参数。
当然,对于通过方法调用来接收数组的方法而言,该方法的形参表中必须指明要接受的数组。如方法 modifyNum(int a[]),其中的参数,int a[]”表示方法将接受一个整数数组。由于数组是通过引用传递,当被调用的方法使用数组名 a时,它指的是一个名为 a的数组实际参数。
例 3.8:有数组 num,编程首在浏览器中显示数组 num中的前 5
个元素。接着 num被传递到方法 modifyNum中,在这个方法中
,num的每个元素被乘以 3,然后显示。
import java.applet.*;
import java.awt.*;
public class PassArray_test extends Applet
{
int num[] = { 1,2,3,4,5 };
public int[] modifyNum( int a[] ) //以数组为参数的方法
{for ( int i = 0; i < a.length; i++ )
a[ i ] *= 2;
Java最新实用教程
2009年 7月 27日星期一 41
return a; //返回一个数组
}
public void paint(Graphics g)
{
String temp="";
for ( int i = 0; i < num.length; i++ )
temp=temp+num[i]+" ";
g.drawString("数组元素的初值为,"+temp,30,30);
temp="";
num = modifyNum( num ); // 传递数组参数调用方法
for ( int i = 0; i < num.length; i++ )
temp=temp+num [i]+" ";
g.drawString("数组被方法调用后的值为,"+temp,30,60);
}
}
运行结果如图 3-4。
图 3-4 向方法传递数组
Java最新实用教程
2009年 7月 27日星期一 42
利用数组作为参数,可以方便实现对数组的各种操作如数组排序等。
3.5 匿名对象创建完对象,也可以不定义该对象的句柄,而直接调用这个对象的方法,这样的对象叫做匿名对象。如前面例 3.7中的类
A可改写为如下:
class A
{
public static void main(String args[])
{
//声明对象并分配内存
new People(“张华,,20); //这样的改动对程序的执行没有任何影响
new People("自由职业者 ",true);
new People();
}
}
因为其中的三个对象均被调用一次,从这个例子中可以体会
Java最新实用教程
2009年 7月 27日星期一 43
到构造方法特点:只要被调用,就会自动执行,有没有名字都可以用 new运算符创建实例。
使用匿名对象主要由以下两种情况:
如果一个对象只进行一次方法调用。
将匿名对象作为实参传递给一个函数调用。
第二种情况的应用也比较多,比如有一个方法需要以一个
People类的实例作为参数,那么可以这样写:,public void
getAPeople(new People());”。
Java最新实用教程
2009年 7月 27日星期一 44
3.6 本章小结类是创建对象的抽象模板。本章主要介绍了 java面向对象程序设计基本概念和思想,类与对象的基本概念和基本语法,包括类的声明及建立、类中变量及访问控制修饰符的介绍、对象的创建、使用、回收等。
类是对一类对象的共同属性和行为的抽象。由数据成员、方法成员组成。类成员都有一些访问控制符,成员之间可以进行访问。
对象是类的实例,通过类的构造方法创建并初始化。
本章最后简单介绍了方法调用的基本方式、方法的参数传递和匿名对象。