Java 中 static 关键字的使用

设置字体大小:

static 一词是“静态的”意思,在 Java 中,我们写主方法的时候就一直用的是 static,static 不仅可以修饰方法,也可以修饰类的属性和代码块。下面就讲一讲 static 关键字的使用:静态属性静态方法静态主方法静态代码块

静态属性

在类中如果用 static 关键字来修饰属性的话,则此属性就成为静态属性,也称类变量。后者的概念比较形象,因为使用了 static 关键字定义的属性,就直接升级为一个类的属性,和该类的对象是平级的关系,也就是说,不属于某个对象,而属于类,可以直接使用类名来访问,而普通的类属性只能通过对象名来访问。并且,类变量的值是该类的所有对象共享的,一旦更改了类变量的值,该类的所有对象读取到的类变量的值都会发生改变。下面来看一个示例程序(下面的几个程序我都添加了包名,直接复制粘贴运行的时候会有错误):

package com.example.staticDemo.Attribute;

/**
 * User: sunriseydy
 * 2018-4-18 17:22
 */

class Person {
    private String name;
    private int age;
    static String city = "郑州";
    
    Person() {
        this.name = null;
        this.age = 0;
    }

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    void print() {
        System.out.println("我叫 " + this.name + "\t今年 " + this.age + " 岁\t来自 " + city);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 20);
        p1.print();
        Person p2 = new Person("李四",22);
        p2.print();
        //修改类变量城市为北京
        System.out.println("修改类变量'city'为 北京");
        Person.city = "北京";
        //p1.city = "北京";  //等同于上一行语句
        System.out.println("修改之后:");
        p1.print();
        p2.print();
    }
}

运行示例:

我叫 张三	今年 20 岁	来自 郑州
我叫 李四	今年 22 岁	来自 郑州
修改类变量'city'为 北京
修改之后:
我叫 张三	今年 20 岁	来自 北京
我叫 李四	今年 22 岁	来自 北京

可以看到,在 Person 类中有一个类变量“city”,该类变量在声明的时候就初始化为“郑州”,Person 的两个对象在调用 print 方法时调用了该类变量,都输出为“郑州”。

之后,利用”类名.类变量”直接修改类变量 “city”  的值为“北京”,也可以用其中一个对象来访问类变量,如37行中被注释掉的部分。

修改之后,两个对象再次调用 print 方法,显示出 “city” 已经都变为“北京”了。即使只在一个对象中更改类变量的值,所有的对象调用该属性都会发生改变。

从内存方面来说,无论 Person 类有多少个实例化对象内存空间,也只有一个 static 属性 city 的内存空间,该类的所有对象都指向这个 static 属性的内存空间。

静态方法

当 static 用来声明一个方法时,该方法就被叫做“静态方法”,也可以称为“类方法”。和类变量一样,属于一个类而不属于任何对象。它可以由类名称直接调用,并且在类方法里只能访问静态属性,不能访问非 static 类型的属性。下面直接来一个示例程序:

package com.example.staticDemo.Method;

/**
 * User: sunriseydy
 * 2018-4-18 17:22
 */

class Person {
    String name;
    int age;
    static String city = "郑州";

    public Person() {
        this.name = null;
        this.age = 0;
    }

    public Person(String name, int age) {
        this.setName(name);
        this.setAge(age);
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public static void setCity(String city) {
        Person.city = city;
        //name = city;  //It throws an error: Non-static field 'name' cannot be referenced from a static context
    }


    public void print() {
        System.out.println("我叫 " + this.getName() + "\t今年 " + this.getAge() + " 岁\t来自 " + city);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 20);
        p1.print();
        Person p2 = new Person("李四",22);
        p2.print();
        //修改类变量城市为北京
        System.out.println("用静态方法修改类变量城市为 北京");
        Person.setCity("北京");
        System.out.println("修改之后:");
        p1.print();
        p2.print();
    }
}

在程序的第38行,声明了一个静态方法:setCity(String city) ,该方法用来修改静态属性 city 的值,而在第40行的注释中,我企图在静态方法中访问一个非静态属性 name,这个时候 IDEA 就报错了,提示:“Non-static field ‘name’ cannot be referenced from a static context”,即静态的方法不能访问非静态的属性。我们来看看运行结果:

我叫 张三	今年 20 岁	来自 郑州
我叫 李四	今年 22 岁	来自 郑州
用静态方法修改类变量城市为 北京
修改之后:
我叫 张三	今年 20 岁	来自 北京
我叫 李四	今年 22 岁	来自 北京

其实和上一部分的运行结果差不多,只不过将修改类变量的操作交给类方法来完成了。

静态主方法

见下一页

静态代码块

见下一页

分享到:

赞 (2)   -->微信赞赏<--

微信扫描二维码或搜索“sunriseydy”关注我的公众号,便捷地阅读博客内容,订阅博客更新



版权说明:
文章内容如未说明均为原创,欢迎转载,但请注明原作者和出处。部分来自互联网的文章,如有侵权,请联系我,24小时内删除,谢谢
Email:i@mail.sunriseydy.top


知识共享许可协议
作品 sunriseydy 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

“Java 中 static 关键字的使用”的一个回复

评论一下呗亲

电子邮件地址不会被公开。 必填项已用*标注

添加表情