abstract
-
修饰 类
只能声明引用,不能创建对象 -
修饰 方法
只有方法的声明,没有方法的实现
static
-
修饰 属性
同类共有 ,即:基于同一个类创建的所有对象都共享此属性
可用 类名.属性名 直接使用 -
修饰 初始代码块
静态初始代码块,只能存储静态属性。
静态初始代码块,仅在类加载时执行一次。
动态初始代码块,创建对象的时候执行,创建一次该类的对象就会执行一次。
class Test{
public static void main(String[] args){
System.out.println(A.value);
System.out.println();
A a = new A();
}
}
class A {
static int value = 3;
static{
System.out.println(value);
value = 5;
System.out.println(value);
System.out.println("A初始");
}
public A(){
System.out.println("构造");
value = 10;
System.out.println(value);
}
}
结果:
- 修饰 方法
1)静态方法可直接调用: 类名.方法名
2)静态方法只能访问静态成员,动态方法可随意访问。
3)由于静态方法可能是通过类名.方法名访问,没有创建对象,所以不能出现this(super)。
4)静态方法之间才能相互覆盖
5)无多态,即引用调用子类中静态方法时,由于子类不会覆盖父类静态方法,所以只会调用到父类的静态方法
final
-
修饰 类
不能被继承,即不能拥有子类 -
修饰 变量
final 变量–>常量
1)只能赋值一次,且系统不提供默认值,程序员必须在初始代码块或构造方法中给予赋值一次。
2)修饰引用时,不变的是引用的地址。
3)常量还是属性。
4)若修饰静态属性,只能在静态代码块中初始化。 -
修饰 方法
可继承给子类,但不能被子类覆盖。
修饰符的组合
private、static、final 都不能和 abstract 组合
类加载
当 JVM 第一次使用一个类的时候 , 它需要将这个类对应的字节码文件读入JVM , 从而获取这个类的全部信息 (类的父类, 拥有哪些属性,方法, 构造方法等等), 并保存起来。(保存在JVM的方法区)
类加载过程
- 如有必要,先加载父类
- 为类的静态属性分配空间,分配默认值
- 按照代码顺序,初始化静态属性或运行静态代码块
【注】如果仅仅是声明类的引用,不需要类加载
class Test{
public static void main(String[] args){
// 访问了一个类的静态属性,进行类加载
System.out.println("b="+B.b);
System.out.println();
A a = new B(); // 创建对象
}
}
class A {
static int a = 3;
static{
a = 5;
System.out.println("A静态初始代码块");
}
public A(){
System.out.println("A构造");
a = 10;
System.out.println("a="+a);
}
}
class B extends A {
static{
b=1;
System.out.println("B静态初始代码块");
}
public B(){
super();
System.out.println("B构造");
System.out.println("b="+b);
}
static int b=2;
}
结果: