Java学习笔记之static关键字

Java里可以使用static声明属性或者方法,对于非static的属性和方法,每个对象都占有各自的内容,如果想要有一个方法或者属性为所有对象所共有,可以声明为static类型,声明了static类型的属性或方法之后,此方法也称为类方法,可以由类名直接调用。

1、使用static声明属性

static可以声明全局属性,全局属性有什么作用呢?看一下如下代码

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 30);
        Person p2 = new Person("李四", 31);
        Person p3 = new Person("王五", 32);
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
        System.out.println("----------- 修改 p1 的country 属性 ----------");
        p1.country = "B城";
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
    }
}

class Person{

    String name;  // 声明name属性,暂时不封装
    int age;      // 声明age 属性,暂时不封装
    String country="A城";  // 声明country属性,给默认值

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void getInfo(){
        System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
    }
}

执行结果:
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改 p1 的country 属性 ----------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城

我们看到,上面的程序基本实现了我们想要的功能,但是当改变country属性的时候,只有明确修改属性的p1改变了,p2,p3都没变,如果只有几个对象,我们打不了逐个修改,但是如果对象有成千上万个,那逐个修改就是非常耗时耗力的重复工作,这个时候,我们就可以用static关键字来处理,只要把country属性声明为static就行

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 30);
        Person p2 = new Person("李四", 31);
        Person p3 = new Person("王五", 32);
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
        System.out.println("----------- 修改 p1 的country 属性 ----------");
        p1.country = "B城";
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
    }
}

class Person{

    String name;  // 声明name属性,暂时不封装
    int age;      // 声明age 属性,暂时不封装
    String country="A城";  // 声明country属性,给默认值

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void getInfo(){
        System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
    }
}

执行结果:
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改 p1 的country 属性 ----------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:B城
姓名:王五 年龄:32 城市:B城

可以看到,修改一个对象的country属性值,所有对象的country属性都发生改变,这表明这个country属性是所有对象所共享的

内存关系

说到这里,顺便提一下Java的内存区域

  • 栈内存:可以保存对象的名称
  • 堆内存:每个对象的具体属性
  • 全局数据区:保存static类型的属性
  • 全局代码区:保存所有方法的定义

再回来看一下刚才的代码,在修改static属性的时候,我们用的是 对象.属性=" "来修改,这种方式其实不推荐,最好是用 “类名称 . 属性” 来修改。

2、使用static声明方法

public class Demo5 {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 30);
        Person p2 = new Person("李四", 31);
        Person p3 = new Person("王五", 32);
        System.out.println("----------- 修改前 ------------");
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();
        Person.setCountry("B城");  // 调用静态方法修改country属性
        System.out.println("----------- 修改后 ------------");
        p1.getInfo();
        p2.getInfo();
        p3.getInfo();

    }
}

class Person{

    private String name;  // 声明name属性
    private int age;      // 声明age 属性
    private static String country="A城";  // 声明country属性,给默认值

    public static String getCountry() {
        return country;
    }

    public static void setCountry(String country) {
        Person.country = country;
    }

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }

    public void getInfo(){
        System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
    }

}

执行结果:
----------- 修改前 ------------
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改后 ------------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:B城
姓名:王五 年龄:32 城市:B城

注意:静态方法不能调用非静态属性或方法

猜你喜欢

转载自blog.csdn.net/zuolixiangfisher/article/details/84314320