一、static修饰成员变量
一旦使用了static关键字,那么这样的内容不再属于某个对象自己,而属于整个类,所以凡是本类的对象,都共享。
1、访问类的静态变量,推荐通过类名来访问,比如下例访问room,推荐写成student.room
student.java
public class student {
private int id;
private String name;
private int age;
static String room;
private static int id_cnt = 0;
public student() {
this.id = ++id_cnt;
}
public student(String name, int old) {
this.name = name;
this.age = old;
this.id = ++id_cnt;
}
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 int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
public class DemoStaticFile {
public static void main(String[] args) {
student one = new student("张三", 15);
one.room = "308";
System.out.println("姓名:"+one.getName()+"年龄:"+one.getAge()
+"学号:"+one.getId()+"教室:"+one.room);
student two = new student("李四",18);
System.out.println("姓名:"+two.getName()+"年龄:"+two.getAge()
+"学号:"+two.getId()+"教室:"+two.room);
}
}
输出结果:
姓名:张三年龄:15学号:1教室:308
姓名:李四年龄:18学号:2教室:308
二、static 修改成员方法
如果使用static 修饰类中的某个方法,则该方法为静态方法,它不属于某个对象,而属于整个类。
1、静态方法不能直接访问非静态。
2、静态方法中不能使用this关键字。
举例:
MyClass.java
public class MyClass {
private int a;
static int ststic_a;
public void method()
{
System.out.println("非静态方法");
System.out.println("a="+this.a);//非静态方法可以访问非静态成员变量
System.out.println("ststic_a="+ststic_a);//非静态方法可以访问静态成员变量
}
public static void staticMethod()
{
System.out.println("静态方法");
//System.out.println(a);//静态方法不可以访问非静态成员变量
System.out.println("ststic_a="+ststic_a);//静态方法可以访问静态变量
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
MyClassMethod.java
public class MyClassMethod {
public static void main(String[] args) {
MyClass.staticMethod(); //静态方法可以不new对象,直接使用,而且推荐用类名来使用
MyClass mc = new MyClass();
mc.method(); //非静态方法只有new了对象后才能使用
localStaticMethod();//对于本地静态变量,可以直接通过方法名来访问
}
public static void localStaticMethod()
{
System.out.println("本地静态变量");
}
}
输出结果;
静态方法
ststic_a=0
非静态方法
a='0
ststic_a=0
本地静态变量
静态内存示意图
三、静态代码块
静态代码块格式:
public class 类名称{
static {
//静态代码块内容
}
}
特点:
1、当第一次使用到本类时,静态代码块执行唯一一次。
2、静态代码块优先于非静态执行,也就是说静态代码块优先于构造函数执行。
典型应用:用来一次性对静态成员变量进行赋值
举例:
StaticBlock.java
public class StaticBlock {
static {
System.out.println("静态代码块");
}
public StaticBlock() {
System.out.println("构造函数");
}
}
StaticBlockMethod.java
public class StaticBlockMethod {
public static void main(String[] args) {
StaticBlock one = new StaticBlock();
System.out.println("================");
StaticBlock two = new StaticBlock();
}
}
输出结果:
静态代码块
构造函数
================
构造函数