static
当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。我们有时候希望无论是否产生了对象或无论产生多少对象的情况下,某些特定的数据在内存里只有一份
static的使用
- static可以用来修饰:属性,方法,代码块,内部类
- 使用static修饰属性:静态变量(或者类变量)
2.1 属性:按是否使用static修饰,又分为:静态属性 和非静态属性(实例变量)
2.2 实例变量:我们创建了类的多个对象,每个对象都独立一套类中的实例变量(非静态属性)
静态变量:每个对象有共享用一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量是修改过的
2.3 静态变量的其他说明:
(1)静态变量随着类的加载而加载的,可以用过类名来调用
(2)静态变量的加载要早于对象的创建
(3)由于类只加载一次,则静态变量在内存中也只会存一份,存在方法区的静态域中 - 使用static修饰方法:静态方法
3.1 随着类的加载而加载,可以通过类名来调用
3.2 静态方法中只能调用静态方法或属性
非静态方法中既可以调用非静态的方法和属性,也可以调用静态方法和属性 - static注意点:
在静态方法中,不能使用this,super关键字 - 开发中,如何确定一个属性或者方法要声明为static?
属性是可以被多个对象共享的,不会随着对象的不同而不同,类中的常量也声明为static
操作静态属性的方法通常设置为static
工具类中的方法,习惯上声明为static
public class CircleTest {
public static void main(String[] args) {
Circle c1=new Circle();
Circle c2=new Circle();
System.out.println("c1的id是 "+c1.getId());
System.out.println("c2的id是 "+c2.getId());
System.out.println("一共创建的圆的个数 "+Circle.getTotal());
}
}
class Circle{
private int radius;//半径
private int id;//圆编号
private static int init=1001;//自增
private static int total;//创建的圆的个数
public Circle(){
id=init++;
total++;
}
public Circle(int radius){
this();
this.radius=radius;
}
public double findArea(){
return 3.14*radius*radius;
}
public int getId(){
return id;
}
public static int getTotal(){
return total;
}
}
/*
编写一个类实现银行账户的概念,包含的属性有“帐号”、“密
码”、“存款余额”、“利率”、“最小余额”,定义封装这些
属性的方法。 账号要自动生成。
编写主类,使用银行账户类,输入、输出
3 个储户的上述信息。
考虑:哪些属性可以设计成
static 属性。
*/
public class Account {
private int id;
private String pwd="000000";
private double balance;
private static double interestRate;
private static double minMoney=1.0;
private static int init=1001;//用于自动生成
public Account(){
id=init++;
}
//构造器中不操作静态变量
public Account(String pwd,double balance){
id=init++;
this.pwd=pwd;
this.balance=balance;
}
public int getId() {
return id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public double getBalance() {
return balance;
}
public static double getInterestRate() {
return interestRate;
}
public static void setInterestRate(double interestRate) {
Account.interestRate = interestRate;
}
public static double getMinMoney() {
return minMoney;
}
public static void setMinMoney(double minMoney) {
Account.minMoney = minMoney;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", pwd='" + pwd + '\'' +
", balance=" + balance +
'}';
}
}