初学者---简介java中的对象和类(2)

来源:互联网 发布:parallels mac 破解版 编辑:程序博客网 时间:2024/06/06 09:30

上一节中我们简单介绍了类和对象,以及怎么通过类来定义对象,和如何来调用对象的方法

http://blog.csdn.net/w865629524/article/details/77062932

接下来我们介绍类中的静态变量和常量,以及方法中的静态方法和实例方法


我们知道,每个类都有一个由变量组成的数据域,而且每个对象的数据域是独立的,也就是说liLei的age和hanMeiMei的age虽然名字都叫age,但因为他们是两个不同对象的变量,所以他们是不同的。那我们有没有什么办法可以让每个类共用一些变量呢?比方说我们想知道在我们的程序里面有几个人,也就是对People类建立了多少个对象,那该怎么办呢?

这就要用到我们的静态变量,静态变量被类中的所有对象所共享,意思就是说,如果People类中有这样一个静态变量,那么liLei和hanMeiMei会共用这个变量,通过对象liLei对这个变量的操作,会影响到hanMeiMei中这个变量的值。那我们怎样来声明一个静态变量呢?只需要在变量的声明中加上修饰符static。

举一个简单的例子:

public class People {//int age;static int sumOfPeople = 0;People() {//age = 0;sumOfPeople++;}People(int nowAge){//age = nowAge;sumOfPeople++;}//void growUp() {//age++;//}//int getAge() {//return age;//}//void printAge() {//System.out.println(age);//}int getSumOfProple() {return sumOfPeople;}}
在这个例子中,我们给People类定义了一个静态变量sumOfPeople,每次创建对象时都让他加一,这样就能达到统计对象数的效果。

在类中的常量应该是被类的所有对象所共享的,因此在固有常量的定义上还要加上一个修饰符static,例如在Math类中的PI就是一个常数,他被定义为

final static double PI = 3.14159265358979323846;


介绍完静态变量和常量,再来介绍一下实例方法和静态方法。

首先要明确,实例方法的意思,就是必须根据一个特定的对象才能进行的方法,比如我要求一个圆的周长,不同圆有不同的周长,那么我求圆的周长这个方法是依赖于某一个圆而存在的,这种方法就是实例方法。另一种方法叫做静态方法,静态方法就是不依赖一个具体的对象,可以直接调用的方法,我们熟悉的Math类中的所有方法都是静态方法。

下面是一个例子:

public class Circle {double radius;static int numOfCircle = 0;final static double PI = 3.14;Circle() {radius = 1;numOfCircle++;}Circle(double newradius) {radius = newradius;numOfCircle++;}static int getNumberOfCircle() {return numOfCircle;}double getArea() {return PI*radius*radius;}}
例中,numOfCircle表示圆的数量,是一个静态变量,getNumberOfCircle是一个静态方法,他直接返回圆的个数,getArea是一个实例方法,他求出一个具体的圆的面基。

在使用实例方法和静态方法时,我们要注意一个细节:静态方法不能访问实例方法和实例数据域,比方说把这里numOfCircle前面的static去掉,使它成为一个实例变量,那么getNumberOfCircle就会产生一个错误,因为静态方法不能调用实例变量。但是反过来,实例方法是可以调用静态的方法和数据域的。


既然我们已经知道了该怎么设计一个带有实例方法和静态方法的类,那我们怎么来调用实例方法和静态方法呢?

因为实例方法需要基于一个特定的对象才能使用,所以我们直接在对象后用“.”点运算符去调用实例方法就可以了。但是静态方法不依赖于对象,那我们怎么做呢?我们可以回顾一下我们是怎么调用Math类中的方法的,然后我们就知道,调用静态方法,需要在类名后用“.”点运算符来调用静态方法,比如Math.sin(),静态变量也是如此,比如Math.PI.

下面是一个具体调用实例方法和静态方法的例子:

public class Test {public static void main(String[] args) {Circle c1 = new Circle();Circle c2 = new Circle(2);double maxArea = c1.getArea();if( maxArea < c2.getArea() ) {maxArea = c2.getArea();}System.out.println("there are "+Circle.getNumberOfCircle()+" circles");System.out.println("the max Area between c1( radius = "+c1.radius+" ) and c2 ( radius = "+c2.radius+" ) is "+maxArea);}}public class Circle {double radius;static int numOfCircle = 0;final static double PI = 3.14;Circle() {radius = 1;numOfCircle++;}Circle(double newradius) {radius = newradius;numOfCircle++;}static int getNumberOfCircle() {return numOfCircle;}double getArea() {return PI*radius*radius;}}