概念:static被称为静态,可以用来修饰类的属性,方法,代码块,内部类
特点: 1.随着类的加载而加载 2.优先于对象存在 3.修饰的成员,被所有对象所共享 4.可以不创建对象,直接被类调用
属性:静态属性的类是所有对象共享的,不管创建了多少个对象,静态属性在内存中只有一个。
代码如下:
public class Chinese {
String name; //非静态属性
int age; //非静态属性
static String country = "中国"; // 静态属性,所以类中只有一个公共的country
}
class Test{
public static void main(String[] args) {
System.out.println(Chinese.country); //此输出没有创建对象,直接拿类调用
Chinese c1 = new Chinese(); //创建新的对象c1
c1.country = "卡尔塔"; //改变了原来的属性
System.out.println(c1.country);
Chinese c2 = new Chinese(); //创建新的对象c2
System.out.println(c2.country); //因为静态属性country在内存中只有一个,且被所有对象共享 所以输出还是 c1的属性
}
}
静态代码块:类加载时自动调用,与是否创建对象无关,也就是说先于方法执行,static方法可以使用对象调用,也可以使用对象直接调用
代码如下:
/*
实例代码块在创建对象时自动调用 静态代码块 > 实例代码块 > 构造方法 执行
静态代码块 在类加载时 只调用一次 永远存在
*/
public class Demo {
{
System.out.println("实例代码块1");
}
{
System.out.println("实例代码块2");
}
static {
System.out.println("静态代码块1");
}
static {
System.out.println("静态代码块2");
}
public Demo(){
System.out.println("哈哈哈");
}
public static void test(){
System.out.println("无参构造方法");
}
}
public class TestDemo {
public static void main(String[] args) {
Demo.test(); //使用类名直接调用静态方法
System.out.println();
new Demo(); // 创建Demo对象,先加载Demo类 原静态成员
// 因为静态代码块在Demo.test() 中执行了所以此处不会再执行
}
}