JAVA的static关键字

Posted 自学开发的老司机

tags:

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

先看以下代码

package javastudy;

public class StaticDemo {
    public static void main(String[] args) {
        Child c1=new Child();
        c1.name="zhangsan";
        c1.country="CN";        //代码重复
        c1.speak();
        
        Child c2=new Child();
        c2.name="lisi";
        c2.country="CN";        //代码重复
        c2.speak();
    }
}

class Child
{
    String name;
    String country;
    void speak(){
        System.out.println("My name is "+name+",my country is "+country);
    }
}

以上代码中,c1和c2两个对象中,包括一个相同的属性值“.country="CN"”,这个属性及属性值是两个对象所共有的。

代码重复了,如果对象增加,这个属性需要再写。

那么,有没有办法将这个共同的属性值提取,单独存放,且又共有均有访问呢。

这时,就用到关键字——static

 static(静态):用于修饰成员(成员变量、成员方法)。

使用static后的代码如下:

package javastudy;

public class StaticDemo {
    public static void main(String[] args) {
        Child c1=new Child();
        c1.name="zhangsan";
        c1.speak();
        
        Child c2=new Child();
        c2.name="lisi";
        c2.speak();
    }
}

class Child
{
    String name;
    static String country="CN";
    void speak(){
        System.out.println("My name is "+name+",my country is "+country);
    }
}

运行结果:

My name is zhangsan,my country is CN
My name is lisi,my country is CN

 

 static用法:

1、用于修改成员(成员变量和成员方法)

2、当成员被静态修改后,除了可以被对象调用外,可以被类名直接调用——类名.静态成员。

 

static静态特点:

1、静态随着类的加载而加载。

  如上面的示例代码,创建Child类实例,该类即被加载到内存里,此时Country="CN"就在内存中开辟好了空间。

  也就是说静态会随着类的消失而消失。说明其生命周期最长。对象用完后,就消失。

2、优先于对象存在。静态先存的,对象是后存的

3、被所有对象所共享。

4、可以直接被类名所调用。

 

类变量和成员变量的区别:

1、存放位置。

  类变量随着类的加载存在于方法区中,成员变量随着对象的建立而存在于堆内存中。

  被static修饰的内容,就不在堆内存中了,而是存在于单独的方法区(也叫共享区或数据区)。特有对象随着对象存储于堆内存中。

2、生命周期

  类变量生命周期最长,随着类的消失而消失;成员变量随着对象的消失而消失。

 

静态失使用注意事项:

1、静态方法只能访问静态成员。非静态方法可以访问静态和非静态成员。

1、静态方法中不可以定义this、super,因为静态优先于对象存在。

 

静态的利弊:

利:对对象的共享数据进行单独空间的存储,节省内存,没有每个对象都存一份。

  可以直接被类名调用。

弊:生命周期过长。

  访问有局限性,只能访问静态。

 

示例1、

package javastudy;

public class StaticDemo {
    public static void main(String[] args) {
        System.out.println(Child.country);    //未创建对象,可以用类名直接调用。先于对象存在。
    }
}

class Child
{
    String name;    //这是成员变量,也叫实例变量。
    static String country="CN";    //这是静态的成员变量,也称为类变量。
    void speak(){
        System.out.println("My name is "+name+",my country is "+country);
    }
}

输出:CN

 没有创建对象,但可以用类名调用类变量。静态优先于对象的存在。

 

  

 总结:

数据值是否被多个对象所共用享受,是就使用静态,不是则不使用静态。

用类名调用时,就要用static修饰。


以上是关于JAVA的static关键字的主要内容,如果未能解决你的问题,请参考以下文章

Java之static关键字

Java_static关键字,单例设计模式,代码块,final关键字,接口,内部类

零基础学Java并不难!详解Java中的static关键字(下)

java中static关键字的意义

Java中的static关键字解析

Java中static关键字解析