3.3.4、理解类成员

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
理解类成员

在这一章中,我们讨论使用static关键字来创建属于类的字段和方法,而不是实例的。

类变量

当基于同一个类创建多个对象时,它们每一个都会拥有自己的实例变量拷贝。在Bicycle 类中,实例变量有cadence、gear和speed。每个Bicycle对象都有自己的成员变量值,它们位于内存里不同的位置。

有时,你需要声明一些变量,这些变量是所有对象共有的。这可以通过使用static修饰符来完成。声明时用static修饰符修饰的字段我们一般叫做静态变量或者类变量。它们是与类绑定的,不绑定任何对象。所有类实例共享同一个类变量,位于内存中固定的位置。任一对象都可以改变类变量的值,在类变量上的操作不需要创建类实例的。

比如,假设你想创建一批Bicycle对象,为每个对象分配一个序列号;第一个对象从1开始分配。每个对象的ID编号都是不同的,所以ID编号是实例变量。同时,你需要知道到目前为止已经创建了多少个Bicycle对象这样才能为下一个对象分配ID编号。这样一个字段是跟任一对象无关的,是类上全局的。这样你需要一个类变量 numberOfBicycles 如下所示:

public class Bicycle{
	private int cadence;
	private int gear;
	private int speed;
	
	private int id;
	private static int numberOfBicycles = 0;
	···
}

类变量被类自己引用,

Bicycle.numberOfBicycles 

这说明它们是类变量。


注意:你也可以使用对象来访问静态字段,
myBike.numberOfBicycles
不过一般不鼓励这样来引用静态字段,因为这样使用不能清楚的表明该字段是静态字段。


你可以在构造器中设置id字段并对numberOfBicycles完成自增操作:

public class Bicycle{
	private int cadence;
	private int gear;
	private int speed;
	private int id;
	private static int numberOfBicycles = 0;

	public Bicycle(int startCadence,int startGear,int startSpeed){
		cadence = startCadence;
		gear = startGear;
		speed = startSpeed;
		id = ++numberOfBicycles ;
	}

	public id getId(){
		return id;
	}
	···
}
类方法

Java编程语言像支持静态字段一样支持静态方法。静态方法是指声明时使用static修饰的,通过类名访问,而不需要通过对象名访问的方法。

ClassName.methodName(args);

静态方法的一般用法是访问静态字段。比如,我们可以在Bicycle类中增加一个静态方法来访问静态字段numberOfBicycles :

public static int getNumberOfBicycles(){
	return numberOfBicycles;
}

并不是说所有类和实例 的变量和方法组合都是允许的,比如:

  • 实例方法可以访问实例变量和其他的实例方法
  • 实例方法可以访问类变量和类方法
  • 类方法可以访问类变量和类方法
  • 类方法不能直接访问实例变量和实例方法,并且,类方法不能使用this关键字因为没有实例需要this引用
常量

static修饰符,与final修饰符组合起来,就可以用来定义常量。final修饰符指明变量的值不能再改变。

比如,如下的代码定义了一个变量叫PI,其值是pi的近似值

static final double PI = 3.141592653589793;

这种方式定义的常量不能重新赋值,如果你尝试这样做将会导致编译错误。一般来讲,常量的命名用大写字母。如果名字有多个单词组成,单词之间用(_)拼接。

public class Bicycle{
	private int cadence;
	private int gear;
	private int speed;
	
	private int id;
	private static int numberOfBicycles = 0 ;
	
	public Bicycle(int startCadence,int startGear,int startSpeed){
			cadence = startCadence;
			gear = startGear;
			speed = startSpeed;
			id = ++numberOfBicycles ;
		}
	
	public id getId(){
		return id;
	}
	
	public static int getNumberOfBicycles(){
		return numberOfBicycles;
	}
	
	public int getCadence(){
		return cadence;
	}
	
	public void setCadence(int newValue){
		cadence = newValue;
	}
	
	public int getGear(){
		return gear;
	}
	
	public void setGear(int newValue){
		gear = newValue;
	}
	
	public int getSpeed(){
		return speed;
	}
	
	public void applyBrake(int decrement){
		speed -= decrement;
	}
	
	public void speedUp(int increment){
		speed += increment;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值