Static 关键字

 

目录

 

一 、使用 static 声明属性

二 、使用 static 声明方法

三 、static 应用小实例

 

 

前面的代码均使用一个类分别开辟栈内存和堆内存,在堆内存中保存对象中的属性,每个对象有自己的属性,使用 static 声明的属性可被所有对象共享,如果一个类中的方法想由类直接调用,则可以声明为 static 方法。

 

 一 、使用 static 声明属性

class Person {
    String name;
    int age;
    static String country = "北京";  //定义 static 属性,此属性为所有对象共享
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void info(){
        System.out.println("姓名:" + this.name + "  年龄:" + this.age + "  城市:" + country);
    }
}

public class StaticDemo01 {
    public static void main(String[] args) {
        Person p1 = new Person("per1",20);
        Person p2 = new Person("per2",22);
        Person p3 = new Person("per3",24);
        System.out.println("----------修改 static 属性之前----------");
        p1.info();
        p2.info();
        p3.info();

        Person.country = "广州";  //修改 static 属性

        System.out.println("----------修改 static 属性之后----------");
        p1.info();
        p2.info();
        p3.info();
    }
}

程序运行结果:

从以上可以发现,修改类中 static 声明的属性,则全部对象的属性内容都跟着改变,因为static 声明的属性为所有对象共享

 

Java 中主要存在4块内存空间

  1. 栈内存空间:保存所有对象的名称(保存了引用的堆内存空间的地址)
  2. 堆内存空间:保存了每个对象的具体属性内容
  3. 全局数据区:保存 static 类型的属性
  4. 全局代码区: 保存所有的方法定义

 

 

二 、使用 static 声明方法

class Person {
    private String name;
    private int age;
    private static String country = "上海";  //定义 static 属性
    public static void setCountry(String c) {  //定义 static 方法
        country = c;    //修改 static 属性
    }
    public static String getCountry() {   //取得 static 属性
        return country;
    }
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void info(){
        System.out.println("姓名:" + this.name + "  年龄:" + this.age + "  城市:" + country);
    }
}

public class StaticDemo02 {
    public static void main(String[] args) {
        Person p1 = new Person("per1",20);
        Person p2 = new Person("per2",22);
        Person p3 = new Person("per3",24);
        System.out.println("----------修改 static 属性之前----------");
        p1.info();
        p2.info();
        p3.info();

        Person.setCountry("深圳");  //修改 static 属性

        System.out.println("----------修改 static 属性之后----------");
        p1.info();
        p2.info();
        p3.info();
    }
}

程序运行结果:

在以上程序中,Person 类将所有的属性都进行了封装,所以必须使用 setter() 方法设置属性,因为这里的 setter() 方法是使用 static 声明的,所以可以使用 类名称 直接调用 

另外,非 static 声明的方法可以去调用 static 声明的属性或方法,但是,static 声明的方法不能调用非 static 声明的属性或方法

class Person {
    private String name = "Tony";   //定义 非static 属性
    public static void sFun() {     //定义 static 方法
        System.out.println("name = " + name);  //错误,不能调用 非static 属性
        fun();                                 //错误,不能调用 非static 方法
    }
    public void fun() {            //定义 非static 方法
        System.out.println("hello");
    }
}

程序编译报错:

static 不能调用任何 非static 内容,是因为在程序中,所有的属性和方法必须在对象开辟堆内存(即实例化)之后才可以被调用,而 static 类型的方法在对象未被实例化时就可以被类名调用

 

三 、static 应用小实例

class Demo {
    private static int count = 0;
    public Demo() {  //实例化对象时自动调用无参构造方法,此时static声明的count属性自增用以计算产生了多少个对象
        count++;
        System.out.println("实例化了" + count + "个对象");
    }
}
public class StaticDemo04 {
    public static void main(String[] args) {
        new Demo();
        new Demo();
        new Demo();
    }
}

程序运行结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值