目录
1. 关键字:static
回顾类中的实例变量(即非static的成员变量)
class Circle{
private double radius;
public Circle(double radius){
this.radius=radius;
}
public double findArea(){
return Math.PI*radius*radius;
}
}
创建两个Circle对象:
Circle c1=new Circle(2.0); //c1.radius=2.0
Circle c2=new Circle(3.0); //c2.radius=3.0
Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。
如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(或类属性)!
1.1 类属性、类方法的设计思想
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份
。例如,所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。
此外,在类中声明的实例方法,在类的外面必须要先创建对象,才能调用。但是有些方法的调用者和当前类的对象无关,这样的方法通常被声明为类方法
,由于不需要创建对象就可以调用类方法,从而简化了方法的调用。
这里的类变量、类方法,只需要使用static
修饰即可。所以也称为静态变量、静态方法。
1.2 static关键字
-
使用范围:
-
在Java类中,可用static修饰属性、方法、代码块、内部类
-
-
被修饰后的成员具备以下特点:
-
随着类的加载而加载
-
优先于对象存在
-
修饰的成员,被所有对象所共享
-
访问权限允许时,可不创建对象,直接被类调用
-
1.3 静态变量
1.3.1 语法格式
使用static修饰的成员变量就是静态变量(或类变量、类属性)
1.3.2 静态变量的特点
-
静态变量的默认值规则和实例变量一样。
-
静态变量值是所有对象共享。
-
静态变量在本类中,可以在任意方法、代码块、构造器中直接使用。
-
如果权限修饰符允许,在其他类中可以通过“
类名.静态变量
”直接访问,也可以通过“对象.静态变量
”的方式访问(但是更推荐使用类名.静态变量的方式)。 -
静态变量的get/set方法也静态的,当局部变量与静态变量
重名时
,使用“类名.静态变量
”进行区分。
1.4 静态方法
1.4.1 语法格式
用static修饰的成员方法就是静态方法。
1.4.2 静态方法的特点
-
静态方法在本类的任意方法、代码块、构造器中都可以直接被调用。
-
只要权限修饰符允许,静态方法在其他类中可以通过“类名.静态方法“的方式调用。也可以通过”对象.静态方法“的方式调用(但是更推荐使用类名.静态方法的方式)。
-
在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
-
静态方法可以被子类继承,但不能被子类重写。
-
静态方法的调用都只看编译时类型。
-
因为不需要实例就可以访问static方法,因此static方法内部不能有this,也不能有super。如果有重名问题,使用“类名.”进行区别。
1.5 练习
练习:
编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,定义封装这些属性的方法。账号要自动生成。
编写主类,使用银行账户类,输入、输出3个储户的上述信息。
Account类
package exer1;
/**
* ClassName:IntelliJ IDEA
* Description:
* 编写一个类实现银行账户的概念,包含的属性有“帐号”、“密码”、“存款余额”、“利率”、“最小余额”,
* 定义封装这些属性的方法。`账号要自动生成
* @Author zyjstart
* @Create:2024/9/3 21:43
*/
public class Account {
private int id; // 账户
private String password; // 密码
private double balance; // 余额
// 静态变量
private static double interestRate; // 利率,使用static修饰,共享
private static double minBalance = 1.0; // 最小余额
private static int init = 1001; // 用于自动生成id的基数
// 构造器
public Account() {
this.id = init;
init++;
password = "000000";
}
// 由于id要自动生成,所以这里不需要添加id的参数
public Account( String password, double balance) {
this.password = password;
this.balance = balance;
this.id = init;
init++;
}
//get、set方法
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public static double getInterestRate() {
return interestRate;
}
public static void setInterestRate(double interestRate) {
Account.interestRate = interestRate;
}
public static double getMinBalance() {
return minBalance;
}
public static void setMinBalance(double minBalance) {
Account.minBalance = minBalance;
}
// alt + insert快速生成toString()方法
@Override
public String toString() {
return "Account{" +
"id=" + id +
", password='" + password + '\'' +
", balance=" + balance +
'}';
}
}
AccountTest类
package exer1;
/**
* ClassName:IntelliJ IDEA
* Description:
* 编写主类,使用银行账户类,输入、输出3个储户的上述信息。
* @Author zyjstart
* @Create:2024/9/3 21:51
*/
public class AcountTest {
public static void main(String[] args) {
Account acc1 = new Account();
System.out.println(acc1);
Account acc2 = new Account("123456",20000.0);
System.out.println(acc2);
// 通过类名去调用静态属性
Account.setInterestRate(0.0123);
Account.setMinBalance(10);
System.out.println("银行存款的利率为:" + Account.getInterestRate());
System.out.println("银行最小存款额度为:" + Account.getMinBalance());
}
}
运行结果: