1.static关键字
static关键字被称为静态,可以用来修饰类的属性,方法,代码块,内部类。
特点:
- 随着类的加载而加载;
- 优先于对象存在;
- 修饰的成员被所有对象共享;
- 可以不创建对象,直接被调用。
注意:如果其中一个对象将静态变量进行了修改,其他的对象的静态变量值跟着改变。
public class Chinese {
String name;
int age;
/**
* static 静态变量 当所有对象中的某个属性值都一样时,此属性值可以使用static修饰,在内存中只有一份,被所有对象共享
* 若不使用static修饰,那么会给每个对象复制一份该变量,浪费内存空间
* 特点:
* 1.随着类的加载而加载
* 2.优先于对象的存在
* 3.修饰的成员被所有对象共享
* 4.可不创建对象,直接被调用
*/
static String country = "中国";
}
public class Test {
public static void main(String[] args){
//通过类名直接调用,省去创建对象 eg:Math.PI; 不创建对象直接调用
System.out.println(Chinese.country);
Chinese zs = new Chinese();
zs.name = "张三";
zs.age = 65;
Chinese ls = new Chinese();
ls.name = "李四";
ls.age = 66;
//对象名调用静态变量
System.out.println(zs.country);
}
}
当所有对象中的某个属性值都一样时,此属性可以使用static修饰,在内存中只有一份,被所有对象共享,对象名调用静态变量/通过类名调用静态变量,省去创建对象。
static修饰方法,被static修饰的方法也存在方法区,可以直接通过类名调用。
静态方法只能访问静态变量,而成员方法可以访问成员变量和静态变量。
public class StaticMethod {
String name;
static int age;
public static void testStaitc(){ //可以通过类名调用,被static修饰的方法也是存储在方法区
System.out.println("静态方法");//静态方法只能访问静态的变量
}
public void test(){
System.out.println("成员方法");//成员方法可以访问成员变量和静态变量
}
}
2.代码块
代码块:类似于一个没有名称的方法
分为:实例块:每次在创建对象时自动执行。
静态块:类加载时执行
/**
* 代码块:类似于一个没有名称的方法
* 1、实例块:每次在创建对象时自动执行
* 2、静态块:类加载时执行
*
*/
public class Demo {
static int num = 10;
{
System.out.println("这是实例块");
}
static{
System.out.println("这是静态块");
}
public static void main(String[] args){
/*new Demo();
new Demo();*/
/*这是静态块
* 这是实例块
* 这是实例块*/
/*System.out.println(num);
System.out.println(num);
System.out.println(num);*/
/*这是静态块
* 10
* 10
* 10*/
}
}
为什么先打印静态变量和静态方法?
个人理解为:因为静态变量和静态方法随着类的加载而加载,而成员变量和成员方法在创建对象时才被创建。且在一个方法中一个类只加载一次,所以静态变量和静态方法也只被加载一次。