JAVA程序员必读:基础篇(5)

程序|程序员

JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院

 
2.4实例和类成员

2.4.1理解实例和类成员

下面详细讨论一下实例和类成员,具体涉及变量和方法以及类变量和方法:

你这样声明一个成员变量,比如在类Myclass中有一个float型的aFloat:

class MyClass {

float aFloat;

}

这样你就声明一个实例变量。每次你创建一个类的实例的时候,系统就为实例创建了类的每一个实例变量的副本。你可以从对象中访问对象的实例变量。

实例变量跟类变量是不一样的,类变量示使用静态修改量来声明的。不管类创建了多少个实例,系统为每个类变量分配了类变量。系统为类变量分配的内存是在它第一次调用类的时候发生的。所有的实例共享了类的类变量的相同副本。你可以通过实例或者通过类本身来访问类变量。

它们的方法是类似的:你的类可以有实例方法和类方法。实例方法是对当前对象的实例变量进行操作的,而且访问类变量。另外一个方法,类方法不能访问定义在类中的实例变量,除非它们创建一个新的对象并通过对象来访问它们。同样,类方法可以在类中被调用,你不必需要一个实例来调用一个类方法。

缺省地,除非其它的成员被指定,一个定义在类中成员就是一个实例成员。这个在下面定义的类有一个实例变量,有一个整型的x,两个实例方法x和setX,它们设置其它对象以及查询x的数值。

class AnIntegerNamedX {

int x;

public int x() {

return x;

}

public void setX(int newX) {

x = newX;

}

}

每次你从一个类实例化一个新的对象,你可以得到每个类的实例变量的副本。这些副本都是跟新对象有关系的。因此,每次你从这个类实例化一个新的AnIntegerNamedX对象的时候,你得以得到跟新的AnIntegerNamedX对象有关的新副本。

一个类的所有实例共享一个实例方法的相同的实行;所有的AnIntegerNamedX实例都共享x和setX的相同执行。这里注意,两个方法x和setX是指对象的实例变量x。但是,你可能会问:如果所有AnIntergerNamedX共享x和setX的相同执行,会不会造成模棱两可的状态?答案当然是:不是。在实例方法中,实例变量的名字是指当前对象的实例变量,假如实例变量不是由一个方法参数来隐藏的。这样在x和setX中,x就等价于这个x,而不会造成混乱。
对于AnIntegerNamedX外部的对象如果想访问x,它必须通过特定的AnIntegerNamedX的实例来实现。假如这个代码片段处在其它对象的方法中。它创建了两种不同类型的AnIntegerNamedX,它设置了x为不同的数值,然后显示它们:

AnIntegerNamedX myX = new AnIntegerNamedX();

AnIntegerNamedX anotherX = new AnIntegerNamedX();

myX.setX(1);

anotherX.x = 2;

System.out.println("myX.x = " + myX.x());

System.out.println("anotherX.x = " + anotherX.x());

这里注意,代码使用setX来为myX设置x的值,而直接给anotherX.x指定一个数值。不管用什么方法,代码是在操作两个不同的x副本:一个包含在myX对象中一,另外一个包含在anotherX对象中。其输出是用以下代码片段来实现的:

myX.x = 1

anotherX.x = 2

上面代码显示了类AnIntegerNamedX的每一个实例有自己实例变量x的副本以及每个x有自己的数值。

你可以在声明成员变量的时候,指定变量是一个类变量而不是一个实例变量。相似地,你可以指定方法是一个类方法而不是一个实例方法。系统在第一次调用类来定义变量的时候创建了一个类变量的副本。所有的类实例共享了类变量的相同副本。类方法可以只操作类变量,它们不能访问定义在类中的实例变量。

为了指定一个成员变量为一个类变量,你可以使用static关键字。比如,我们可以修改一下上面的AnIntegerNamedX类,使得x变量现在是一个类变量:

class AnIntegerNamedX {

static int x;

public int x() {

return x;

}

public void setX(int newX) {

x = newX;

}

}

现在设置它们的x数值并显示不同的输出:

myX.x = 2

anotherX.x = 2

这次的输出不同,是因为x现在是一个类变量,所以就只有这个变量的副本,它是被AnIntegerNamedX的所有实例所共享的,包括myX和anotherX。当你在其它实例中调用setX的时候,你可以为所有的AnIntegerNamedX的所有实例改变x的数值。

同样,当我们声明一个方法的时候,你可以指定方法为类方法而不是实例方法。类方法只可以在类变量中进行操作,并且不能访问定义在类中的所有实例变量。

为了指定方法为类方法,你可以在方法声明处使用static关键字。下面,我们再次来修改AnIntegerNamedX类,使它的成员变量x为一个实例变量,以及它的两个方法为类方法:

class AnIntegerNamedX {

int x;

static public int x() {

return x;

}

static public void setX(int newX) {

x = newX;

}

}

当你想编译这个版本的AnIntegerNamedX,编译器就会显示如下的错误: AnIntegerNamedX.java:4: Can't make a static reference to

nonstatic variable x in class AnIntegerNamedX.

return x;

^

出现这些错误的原因是类方法不能访问实例变量,除非方法先创建AnIntegerNamedX的一个实例并且通过它来访问变量。

下面我们修改一下AnIntegerNamedX,让x变量成为类变量:

class AnIntegerNamedX {

static int x;

static public int x() {

return x;

}

static public void setX(int newX) {

x = newX;

}

}

现在为x设置数值,并打印出x数值:

myX.x = 2

anotherX.x = 2

再一次,我们通过myX来改变x,并将它改变为AnIntegerNamedX的其它实例。

实例成员和类成员之间的另外一个差别是类成员可以从类本身进行访问。你不必实例化类来访问它的类成员。下面让我们编写一段代码来直接从AnIntegerNamedX类中访问x和setX:

. . .

AnIntegerNamedX.setX(1);

System.out.println("AnIntegerNamedX.x = " + AnIntegerNamedX.x());

. . .

值得一提的是,你现在已经不用再创建myX和anotherX了。你可以设置x并直接AnIntegerNamedX类中检索x。你不能利用实例成员来处理它,你只能从一个对象来调用实例方法并且只可以从对象中访问实例变量。而你可以从类的实例或者从类本身来访问类变量和方法。

时间: 2024-09-10 06:25:24

JAVA程序员必读:基础篇(5)的相关文章

JAVA程序员必读:基础篇(8)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31 作者:ZSC 太平洋网络学院 2.6什么是接口 接口是一个收集方法和常数表单的契约.当类执行一个接口,它就许诺声明在那个接口中执行所有的方法. 接口是一个设备或者一个系统,它是用于交互的无关的实体.根据这个定义,远程控制是一个在你和电视的接口:而英语是两个人之间的接口:强制在军事中的行为协议是不同等价人之间的接口.在JAVA语言中,接口是一个设备,它是用来与其它对象交互的设备.一个接口可能对一个协议是类似的.实际上,

JAVA程序员必读:基础篇(9)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 2.8 面向对象概念的问题和练习 本节教程测试一下你对对象.类.消息等等的理解,我们是通过做一些练习以及回答一些问题来进行的. 2.8.1 问题 你可以使用API文档来回答这些问题: ClickMe applet使用Color.red来设置画图颜色为红色.其它有什么颜色可以象这样来使用? 怎样设置颜色为紫色(purple)? 2.8.2 练习 现在,利用你从API文档中学到的知识来修改Cl

JAVA程序员必读:基础篇(7)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 2.5什么是继承 一个类可以从它的父类继承状态和行为.继承为组织和构造软件程序提供了一个强大的和自然的机理. 总得说来,对象是以类得形式来定义得.你可能现在已经可以从它类知道许多对象了.即使你如知道,如果我告诉你它是一辆自行车,你就会知道它有两个轮子和脚踏板等等.面向对象系统就更深入一些了,它允许类在其它类中定义.比如,山地自行车.赛车以及串座双人自行车都是各种各样的自行车.在面向对象技术

JAVA程序员必读:基础篇(6)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 2.4.2初始化实例和类成员 下面讲讲初始化实例和类成员: 你可以在类中定义它们的时候,使用static初始化程序和实例初始化程序来为类和实例成员提供初始化数值: class BedAndBreakfast { static final int MAX_CAPACITY = 10; boolean full = false; } 这个对于原始数据类型是没有问题的.有时候,它可以用在创建数组

JAVA程序员必读:基础篇(4)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 2.3什么是类 类实际上是对某种类型的对象定义变量和方法的原型. 在现实世界中,你经常看到相同类型的许多对象.比如 ,你的自行车只是现实世界中许多自行车的其中一辆.使用面向对象技术,我们可以说你的自行车是自行车对象类的一个实例.通常,自行车有一些状态(当前档位.两个轮子等等)以及行为(改变档位.刹车等等).但是,每辆自行车的状态都是独立的并且跟其它自行车不同. 当厂家制造自行车的时候,厂商

JAVA程序员必读:基础篇(3)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 2.2什么是消息 软件对象之间进行交互作用和通讯是利用消息的. 单一的一个对象通常不是很有用的.相反,一个对象通常是一个包含了许多其它对象的更大的程序或者应用程序.通过这些对象的交互作用,程序员可以获得高阶的功能以及更为复杂的行为.你的自行车如果不使用它的时候,它就是一堆铝合金和橡胶,它没有任何的活动.而只有当有其它的对象来和它交互的时候才是有用的. 软件对象与其它对象进行交互与通讯是利用

JAVA程序员必读:基础篇(2)

程序|程序员 JAVA程序员必读:基础篇时间:2001/09/13 13:31作者:ZSC 太平洋网络学院 二.面向对象编程 如果你以前从来没有使用面向对象语言,你需要在开始编写JAVA代码之前先理解这个概念.你需要理解什么是对象.什么是类.对象和类的关系怎样以及使用消息怎样在对象之间进行通讯.本教程的前面部分将描述面向对象编程的概念,而后面的教程将教你怎样将这个概念编成代码. 2.1什么是对象 对象是一些相关的变量和方法的软件集.软件对象经常用于模仿现实世界中我们身边的一些对象.对象是理解面向

JAVA程序员必读:基础篇(1)

程序|程序员 JAVA程序员必读:基础篇 时间:2001/09/13 13:31 作者:ZSC 太平洋网络学院 JAVA是有SUN公司开发的新一代编程语言,它可以用在各种不同的机器.操作系统的网络环境中进行开发.不论你使用哪种浏览器或者使用哪种操作系统(Windows.Unix等等),只要浏览器支持JAVA,你就可以看到生动的主页.JAVA正在逐步成为Internet应用的主要开发语言,它彻底改变了应用软件的开发模式,为迅速发展的信息世界增添了新的活力.所以作为Internet应用的开发技术人员

JAVA程序员必读:基础篇(目录)

程序|程序员 JAVA是有SUN公司开发的新一代编程语言,它可以用在各种不同的机器.操作系统的网络环境中进行开发.不论你使用哪种浏览器或者使用哪种操作系统(Windows.Unix等等),只要浏览器支持JAVA,你就可以看到生动的主页.JAVA正在逐步成为Internet应用的主要开发语言,它彻底改变了应用软件的开发模式,为迅速发展的信息世界增添了新的活力.所以作为Internet应用的开发技术人员不可不看JAVA,而JAVA程序不可不先从基础学起,这正是JAVA程序员必读:基础篇的用意. 本J