static(静态的)可以用来修饰属性,方法,*代码块(或者初始代码块)、*内部类
一、static修饰属性(类变量)
1.由类创建的所有对象,都公用这一个属性
2.当其中一个对象对子属性进行修改,会导致其他对象对此属性的一个调用。vs实例变量(非static)各个独享拥有一套副本;
3.类变量随着类的加载而加载的,而且独一份
4.静态的变量可以直接通过“类.类变量”的形式来调用
5.类变量的加载是要早于对象的(加载类时变量就已经加载了)。所以当有对象以后,可以“对象.类变量”来加载类变量和调用, 反过来想通过"类.实例对象"来加载。
6.类变量存在于静态域中(对于new出来的对象名这些存放在占空间中,对象中存放的内容在堆空间中,但是对于static来说会 单独创建一个静态域空间用于存放static定义的对象的内容)
二、static修饰方法(类方法)
1.随着类的加载而加载,在内存中也是独一份
2.可以直接通过“类.类方法”的方式进行调用
3.内部可以调用静态的属性或者静态的方法啊,而不能调用非静态的属性和方法,反之,非静态的方法可以调用静态的变量
》》》》在静态方法中不能使用this和super关键字的
》1)对于this来说,this表示当前对象,因为在建造static时还没有创建对象,所以不可以使用this关键字
》2)对于super来说,是调用当前对象的父类的属性和方法,所以也不可以使用super关键字
注:静态的结构(static的属性、方法、代码块、内部类)的生命周期要早于非静态的结构,同时被回收的也比非静态的晚
三、static的一个应用
1、static的一个应用:在内存中可以实现“累加”的效果,因为静态变量在内存中独一份。
2、实例
package static_lxf;
public class TestAccount {
public static void main(String[] args) {
Account a1 = new Account("abd1323",1000.0);
Account a2 = new Account("abd1233",2000.0);
Account a3 = new Account("abd1623",3000.0);
Account a4 = new Account("abd1723",4000.0);
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
}
}
class Account {
private int id;// 账户
private String password; // 密码
private double balance; // 余额
@SuppressWarnings("unused")
private static double rate = 0.05;// 利率
@SuppressWarnings("unused")
private static double minBalance = 1;// 最小账户余额
private int init = 1000; // 账户初始化
public Account() {
super();
}
/*普通属性,对象用完就销毁了,下次还是从初始值开始
在定义时会出现如果使用一般的方法定义的时候创建完就会消失,但是使用静态的将不会出现这样的结果
* */
public Account(String password, double balance) {
//init为static变量,独一份,每调用一次便加1;每次加一的数赋给id
this.id = init ++ ;
this.password = password;
this.balance = balance;
}
@Override
public String toString() {
return "Account [id=" + id + ", password=" + password + ", balance=" + balance + "]";
}
}
四、static内存管理
实例
public class TestSportsMan {
public static void main(String[] args) {
SportsMan s1 = new SportsMan("金龙",23);
SportsMan s2 = new SportsMan("银龙",23);
s1.setName("花龙");
s1.setNation("China");
System.out.println(s1);
System.out.println(s2);
System.out.println(SportsMan.nation);
SportsMan.show1();
}
}
class SportsMan{
//实例变量(随着对象的创建才能被加载)
String name;
int age;
//类变量
static String nation;
public SportsMan() {
super();
}
public SportsMan(String name, int age) {
super();
this.name = name;
this.age = age;
}
public SportsMan(String name, int age, String nation) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getNation() {
return nation;
}
@SuppressWarnings("static-access")
public void setNation(String nation) {
this.nation = nation;
}
@Override
public String toString() {
return "SportsMan [name=" + name + ", age=" + age + ", nation=" + nation + "]";
}
public void show() {
show();
System.out.println("我是来自中国的运动员");
}
public static void show1() {
System.out.println("nation " + nation);
System.out.println("我是一名优秀的运动员!");
}
}