Java中静态关键字的使用方法介绍二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中静态关键字的使用方法介绍二相关的知识,希望对你有一定的参考价值。

1         静态方法

前面我们了解了静态成员变量的一些使用的方式,现在我们接着探讨一下静态方法的相关内容,并了解一下静态方法的使用情况。

1.1      静态方法和一般方法的定义方法

在类中我们可以定义类的方法,如果当一个方法的前面加了关键字Static,也当方法使用静态修饰符时,我们则称这个方法为静态方法,没有这个关键字,则不是静态方法。还是以Car类为例,定义一个静态方法stop(),和一个非静态方法show(),具体看下面代码所示。

public class Car {

         publicString color;

         publicstatic String myColor="white";

         Car(Stringcolor){

                   this.color=color;

}

         //一般方法show()

         voidshow(String color,String myColor){

                   System.out.println("汽车的颜色是"+color);

         }

         //静态方法stop()

static voidstop() {

                   System.out.println("汽车停了下来。");

         }

         publicstatic void main(String[] args) {

                   Carcar1=new Car(“blue”);

                   car1.show();

                   car1.stop();

car car2=new Car(“yellow”);

                   car2.show();

car2.stop();

         }

}

运行结果为:

汽车的颜色是blue

汽车停了下来。

汽车的颜色是yellow

汽车停了下来。

         通过以上代码,我们发现除了在静态方法前增加了静态修饰符之外,静态方法和一般方法一样都能够被对象所调用。这是静态方法与一般方法的相同之处。

1.2      什么情况下使用静态方法?

1.2.1   静态方法不调用成员变量

Car类中存在两个方法,一个方法是show(),另一个方法是stop()。假设这两个方法都是普通方法,那么在定义对象的时候,就需要给给两个方法分配相应的内存地址空间。

从代码中我们可以得出,show()访问了成员变量color和静态成员变量myColor,而stop()方法没有访问任何的成员变量。也就是说给在构建对象的时候,给方法show()和方法stop()都分配内存空间,而方法show()分配内存空间并没有用来存放对象的属性,那么这个内存空间就白白浪费了。具体如下图所示。

技术分享

图1             定义一般方法方法后在内存中的使用情况图

为了解决这种浪费内存空间的情况,我们可以将一个方法不需要访问成员变量的情况时,将该方法前面添加静态修饰符,定义为静态方法。静态方法只需要在内存中分配一次内存空间,而且这个内存空间属于数据共享区,与对象的内存空间不同,同时该类的所有对象都可以调用该静态方法。使用静态方法就能去掉一般方法的弊端,节约内存空间。

    

技术分享

图2             定义静态方法后内存空间使用情况图

1.2.2   在类中直接调用方法

假设不构建类的对象,而想调用方法该如何实现?

我们知道一般方法都需要先构建对象,然后通过对象才能能调用方法,这达不到我们的要求。这时候就使用静态方法,才能够实现这个需求。具体以下面例子为例。

public class Car {
         publicString color;
         publicstatic String myColor="white";
Car(){
}
Car(Stringcolor){
                   this.color=color;
         }
         //一般方法show()
         voidshow(){
                   System.out.println("汽车的颜色是"+this.color);
         }
         //静态方法stop()
static voidstop() {
                   System.out.println("汽车停了下来。");
         }
         publicstatic void main(String[] args) {
                   newCar().stop();
         }
}

运行结果为:

汽车停了下来。

我们发现没有构建对象,但是成功的调用了静态方法。不用构建对象,就不需要给对象分配内存空间,所以使用类来调用静态方法,这同样达到了节约内存空间的效果。

1.3     是不是任意方法都能定义为静态方法?

静态方法节约内存,那是不是所有的方法都定义为静态方法来节约内存空间呢?还是以Car类为例,将show()方法定义为静态方法看会发生什么。

public class Car {
         publicString color;
         publicstatic String myColor="white";
Car(){
}
Car(Stringcolor){
                   this.color=color;
         }
         //静态方法show()
         staticvoid show(){
                   System.out.println("汽车的颜色是"+color);
         }
         //静态方法stop()
static voidstop() {
                   System.out.println("汽车停了下来。");
         }
         publicstatic void main(String[] args) {
                   newCar().show();
new Car().stop();
         }
}

编译时,发现会报错

报错内容:Cannot make astatic reference to the non-static field color

这是因为show()方法中调用了非静态变量color,而静态方法只能调用静态变量,所以会报错。

如果我们将show()方法中的代码进行修改,改为以下内容:

         staticvoid show(){

                   System.out.println("汽车的颜色是"+myColor);

         }

运行结果为:

汽车的颜色是white

汽车停了下来。

         我们将show()方法中访问的变量更换为静态成员变量后,发现可以编译通过,并正常运行。

         如果我们将show()方法中的代码进行修改,改为以下内容:

         staticvoid show(){

                   System.out.println("汽车的颜色是"+this.myColor);

         }

         编译时,发现会报错。

         报错内容:Cannotuse this in a static context

通过以上可以得出结论,不是所有的方法都能够定义为静态方法的,只有不访问成员变量或者访问静态成员变量的方法才能够定义为静态方法,不使用this关键字的方法才能定义为静态方法。

    为什么静态方法不能访问非静态成员变量呢?这是因为静态方法是随着类的加载而加载的,静态方法先与对象存在于内存中,无法访问后出现的对象中的属性和方法,所以静态方法无法访问非静态方法或变量。而静态变量随着类的加载而加载,所以静态方法可以访问静态变量。

为什么在静态方法中不能使用this关键字?这是因为this关键字是指向对象的地址,而使用类调用静态方法的时候,并没有生成对象,所以this关键字就会出现指向不明确的情况,所以在java中静态方法不能使用this关键字。

1.4    静态方法都能被谁调用?

定义完静态方法后,就可以调用静态方法。那么静态方法都能被谁调用呢?在前面我们使用了“new Car().stop();”语句来调用静态方法stop(),这说明使用类可以调用静态方法。

1.4.1   对象调用静态方法

静态方法也是方法的一种,使用对象可以调用静态方法吗?我们用下面的代码来举例:

public class Car {
         publicString color;
         publicstatic String myColor="white";
Car(){
}
Car(Stringcolor){
                   this.color=color;
         }
         //一般方法show()
         voidshow(){
                   System.out.println("汽车的颜色是"+color);
         }
         //静态方法stop()
static voidstop() {
                   System.out.println("汽车停了下来。");
         }
         publicstatic void main(String[] args) {
                   Carcar=new Car();
                   Car.stop();
         }
}

运行结果如下:

汽车停了下来。

         根据运行结果,我们得以得出结论,对象可以直接调用静态方法。

1.2.2   非静态方法调用静态方法

非静态方法可以调用静态方法吗?我们用下面的代码来举例。

public class Car {
         publicString color;
         publicstatic String myColor="white";
Car(){
}
Car(Stringcolor){
                   this.color=color;
         }
         //一般方法show()
         voidshow(){
                   System.out.println("汽车的颜色是"+ myColor);
                   Stop();
         }
         //静态方法stop()
static voidstop() {
                   System.out.println("汽车停了下来。");
         }
         publicstatic void main(String[] args) {
                   Carcar=new Car();
                   Car.show();
         }
}

运行结果如下:

汽车的颜色是white

汽车停了下来。

         通过运行结果我们可以得出结论,非静态方法show()成功的调用了静态方法stop()

         通过以上的几个例子,我们得出类、对象和非静态方法都能够成功的调用静态方法。


本文出自 “菜鸟进阶” 博客,请务必保留此出处http://zyejl.blog.51cto.com/2769851/1792335

以上是关于Java中静态关键字的使用方法介绍二的主要内容,如果未能解决你的问题,请参考以下文章

Java中静态关键字的使用方法介绍四

Java中静态关键字的使用方法介绍二

Java中静态关键字的使用方法介绍三

Java中静态关键字的使用方法介绍一

Java中静态static的基础和数组工具类数学工具类的介绍

Java中static关键字和代码块的学习