静态变量和静态方法
有一个 Account(银行账户)类,假设它有三个成员变量: amount(账户金额)、
interestRate(利率)和 owner(账户名)。在这三个成员变量中, amount 和 owner 会因人而异,对于不同的账户这些内容是不同的,而所有账户的 interestRate 都是相同的。amount 和 owner 成员变量与账户个体有关,称为“实例变量”, interestRate 成员变量与个体无关,或者说是所有账户个体共享的,这种变量称为“静态变量”或“类变量”。
总结:实例变量会因人而异,静态变量是共有的
静态变量和静态方法示例代码如下:
// Account.java文件
package com.a51work6;
public class Account {
// 实例变量账户金额
double amount = 0.0; ①
// 实例变量账户名
String owner; ②
// 静态变量利率
static double interestRate = 0.0668; ③
// 静态方法
public static double interestBy(double amt){
//静态方法可以访问静态变量和其他静态方法
return interestRate * amt; ⑤
}
// 实例方法
public String messageWith(double amt) { ⑥
/ /实例方法可以访问实例变量、实例方法、 静态变量和静态方法
double interest = Account.interestBy(amt); ⑦
StringBuilder sb = new StringBuilder();
// 拼接字符串
sb.append(owner).append("的利息是").append(interest);
// 返回字符串
return sb.toString();
}
}
static 修饰的成员变量是静态变量,见代码第③行。staitc 修饰的方法是静态方法,见代码第④行。相反,没有 static 修饰的成员变量是实例变量,见代码第①行和第②行;没有 staitc 修饰的方法是实例方法,见代码第⑥行。
注意 静态方法可以访问静态变量和其他静态方法,例如访问代码第⑤行中的interestRate静态变量。实例方法可以访问实例变量、其他实例方法、 静态变量和静态方法,例如访问代码第⑦行interestBy静态方法。
调用 Account 代码如下:
// HelloWorld.java文件
packagecom.a51work6;
public classHelloWorld {
public static voidmain(String[] args) {
// 访问静态变量
System.out.println(Account.interestRate);①
// 访问静态方法
System.out.println(Account.interestBy(1000));②
Account myAccount =new Account();
// 访问实例变量
myAccount.amount =1000000; ③
myAccount.owner ="Tony"; ④
// 访问实例方法
System.out.println(myAccount.messageWith(1000));⑤
// 通过实例访问静态变量
System.out.println(myAccount.interestRate);⑥
}
}
调 用 静 态 变 量 或 静 态 方 法 时 , 可 以 通 过 类 名 或 实 例 名 调 用 , 代 码 第 ① 行Account.interestRate通过类名调用静态变量,代码第②行 Account.interestBy(1000)是通过类名调用静态方法。 代码第⑥行是通过实例调用静态变量。
静态代码块:
前面介绍的静态变量interestRate,可以在声明同时初始化,如下代码所示。
publicclass Account {
// 静态变量利率
staticdouble interestRate = 0.0668;
...
}
//如果初始化静态变量不是简单常量,需要进行计算才能初始化,可以使用静态(static)
//代码块,静态代码块在类第一次加载时执行,并只执行一次。示例代码如下:
//Account.java文件
packagecom.a51work6;
publicclass Account {
// 实例变量账户金额
doubleamount = 0.0;
// 实例变量账户名
Stringowner;
// 静态变量利率
staticdouble interestRate;
// 静态方法
publicstatic double interestBy(double amt) {
// 静态方法可以访问静态变量和其他静态方法
returninterestRate * amt;
}
// 静态代码块
static { ①
System.out.println("静态代码块被调用...");
// 初始化静态变量
interestRate= 0.0668; ②
}
}
上述代码第①行是静态代码块,在静态代码块中可以初始化静态变量,见代码第②行,也可以调用静态方法。
调用 Account 代码如下:
//HelloWorld.java文件
packagecom.a51work6;
publicclass HelloWorld {
publicstatic void main(String[] args) {
AccountmyAccount = new Account(); ①
// 访问静态变量
System.out.println(Account.interestRate);②
// 访问静态方法
System.out.println(Account.interestBy(1000));
}
}
Account 静态代码块是在第一次加载Account 类时调用。上述代码第①行是第一次使用 Account 类,此时会调用静态代码块。