一、static关键字
1、static是修饰符,也是java关键字
2、被static修饰的成员被称为静态成员(静态属性,静态方法)
3、static修饰的成员,独立存在JVM内存当中
3-1、JDK7之前,存在于方法区静态域当中
3-2、JDK7以后,存在于堆独立空间中
4、static的优先级高,执行new 对象的时候,JVM优先加载被static修饰的成员
5、静态方法只能调用静态成员,普通方法可以调用普通成员和静态成员
6、static修饰的成员,被所有当前类的对象共享
7、static修饰的成员,可以用类名或对象名调用,不能通过this和super调用
二、fianl关键字
1、final修饰的类,不能被继承
2、final修饰的方法,不能被子类重写
3、final修饰的成员属性叫做常量,常量值不能被修改
- - -public final static String BMW = “宝马”; (BMW 必须得是“宝马“)
4、final修饰的局部变量,也不能改
5、final和static同时修饰的属性被调用时,不会触发类加载
public class 玩 {
public static void main(String[] args) {
System.out.println(Test.s);
}
}
class Test {
public final static String s = "aaa";
static {
System.out.println("static块执行");//2
}
}
输出:aaa,静态代码块没有输出
三、代码块
1、普通代码块
1、普通代码块:每创建一个对象,就执行
2、如果只使用类的静态成员,普通代码块不会执行
2、静态代码块
当类被加载的时候优先执行,而且只会执行一次
什么时候发生类加载:
1、创建当前类实例对象时
2、创建子类实例对象时,父类的静态代码块也会执行(先加载父类信息,在加载子类)
3、使用类的静态成员时(静态属性,静态方法)
3、同类的执行顺序
package day2;
public class 玩 {
public static void main(String[] args) {
A a = new A();
}
}
class A{
public A(){
System.out.println("当前类无参构造器");
}
private int a =getA();
private static int b = getB();
public int getA(){
System.out.println("普通成员方法");
return 100;
}
{
System.out.println("普通代码块");
}
public static int getB(){
System.out.println("静态方法");
return 200;
}
static {
System.out.println("静态代码块");
}
}
输出结构:
结论:静态成员 > 普通成员 > 构造器
静态成员和普通成员之间的执行顺序:按照main方法的先后顺序执行
4、父子类的执行顺序
当子类构造器没有显示的写出调用父类哪个构造的时候,默认调用父类无参构造(super(),默认隐藏)