面向对象学习21 - 关键字static

static

被它修饰过后的变量称为静态变量
如果想让一个成员变量被类中所有实例共享,就用static修饰,称为类变量或类属性;

对比静态变量和实例变量(static修饰变量)

1.个数

静态变量:在内存空间中只有一份,被类的多个对象共享
实例变量:类的每一个实例(或对象)都保存着一份实例变量。

2.内存位置

静态变量:jdk6及以前在方法区,jdk7及以后在堆空间
实例变量:堆空间的对象实体中

3.加载时机

静态变量:随着类的加载而加载,由于类只会加载一次,所以静态变量只有一份
实例变量:随对象的创建而创建,每个对象拥有一份实例变量

4.调用者

静态变量:可以被类调用,也可以使用对象调用
实例变量:只能使用对象调用

5.消亡时机

静态变量:随类的卸载而消亡
实例变量:随对象的消亡而消亡

static修饰方法

随着类的加载而加载。
可以通过"类.静态变量"的方式,直接调用静态方法
静态方法内可以调用静态的属性和方法。
不可以调用非静态的结构
static修饰的方法内,不能使用this、super
补充:在类的非静态方法中,可以调用当前类中的静态结构(属性、方法)或非静态结构。

Q&A

Q:开发中,什么时候需要将属性声明为静态的?
A:判断当前类的多个实例是否能共享此成员变量,且此成员变量的值是相同的。
开发中常将一些常亮声明为静态的,如Math中的PI。

Q:什么时候将方法声明成静态的?
A:方法内操作的变量如果都是静态变量(而非实例变量)的话,则建议使用静态方法
开发中常将工具类中的方法,声明为静态方法。比如Array类、Math类

例子

public class ChineseTest{
}
public chinese{//中国人类
//非静态变量、实例变量
String name;
int age;
static String nation;
@Override
public String toString(){
return "Chinese{" +
"name'" + name + '" +
",age = " + age +
'}';
public static void show(){
System.out.println("我是中国人");
System.out.println("nation = " nation);
method1();
}
public static void method1(){
System.out.println("测试");
}
}

public class ChineseTest{
public static void main(String[] args){
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;

    Chinese c2 = new Chinese();
    c2.name = "刘翔";
    c2.age = 39;
    c2.nation = "CHN";
    System.out.println(chinese.nation);
    Chinese.show();
    ChineseTest.test();
}
public static void test(){
    System.out.println("我是静态的测试方法");

}

# 测试题
编写一个类实现银行账户的概念,包含的属性有"账号"、"密码"、"存款余额"、"利率"、"最小余额",
定义封装这些属性的方法。
账号要自动生成。
编写主类,使用银行账户类、输入、输出3个储户的上述信息。
考虑;哪些属性可以设计成static属性

```java
public class Account{//省略get、set方法
    private int id;
    private String password;
    private double balance;
    private static double interestRate;
    private static double minBalance = 1.0;//最小余额
    private static int init = 1001;//用于自动生成id的基数
    public Account(){
        this.id = init;
        init++;
    }
    public Account(String password,double balance){
        this.password = password;
        this.balance = balance;
        this.id = init;
        init++;
    }
    @Override
    public String toString(){
        return "Account{" +
               "id = " + id +
               ",password = '" + password + '\'+
               ",balance = " + balance +
               '}';
    }
}
public class Account{
    public static void main(String[] args){
        Account acct1 = new Account();
        System.out.println(acct1);
        Account acct2 = new Account(123456,2000);
        System.out.println(acct2);
        Account.setInterestRate(0.0123);
        System.out.println("银行存款的利率为:" + Account.getInterestRate());
        System.out.println("银行的最小存款额度为:" + Account.getMinBalance());
    }
}
posted @ 2025-06-17 20:48  谁来着?  阅读(8)  评论(0)    收藏  举报