修饰符 abstract static final
abstract :修饰的类为抽象类,不完整,不具体的类,,无法独立存在,不能new对象
强制使用多态
作用:
- 可被子类继承,提供共性属性和方法。
- 可声明为引用,更自然的使用多态。
抽象父类可作为子类的组成部分,依附于子类对象的存在 由 父类共性+子类独有组成完整的子类对象。
抽象方法:只声明方法,不实现方法,强制子类必需实现该抽象方法,提供完整的具体的调用版本
static: 静态 可以修饰属性和方法,成为静态属性(类属性)。静态方法(类方法);
在类加载时执行,且只执行一次
静态成员是整个类共同持有的共享空间(一份),任何对象修改都会影响其他对象。
方法区存储类的相关信息;
不能在静态中引用非静态的,原因是: 非静态属性(\方法)只有实例化对象后才能调用,静态方法不需实例就可调用;非静态属性(\函数)可以引用静态的
堆中存放类实例化的对象, 栈中存放的是局部变量,局部变量的地址指向堆中的对象 。
Dog() dog = new Dog();实例一个对象放到变量中,
方法区存放类的相关信息,静态属性存放在方法区中,每个实例化的对象,都共用一个方法区。
静态 可以继承,只是类层面的,不是对象层面的 。 所有不能重写,没有多态, ,,访问静态只是通过类的层面访问 类.属性(方法) 子类中与父类同名的方法毫无关系,不存在重写覆盖关系,
类加载
- JVM首次使用某个类时,需通过CLASSPATH 查找该类的 .calss 文件,(bin中)
- 将.class文件中对类的描述信息加载到内存中,进行保存。(信息有 包名,类名,父类,属性,方法,,,)
加载时机:
- 创建对象 间接加载
- 创建子类对象。 间接加载
- 访问静态属性 间接加载
- 调用静态方法 间接加载
- Class.forName(“全限定名”) 直接加载,主动加载一个类 Class.forName(“包名 . 类名”) 只加载静态属性和静态代码块;
动态代码块 : { 代码 }
静态代码块: static{ 代码 } 作用: 为静态属性赋值,或必要的初始化行为
实例化对象执行顺序: (无论实例化多少对象,静态属性静态代码块只执行一次)
静态属性 ——> 静态代码块(类层面 类级别,类加载时就执行)——> |||||| (实例层面,实例级别,创建对象时执行)先执行构造方法super() ——> 在加载实例变量 ——> 在执行动态代码块 ——> 在执行构造方法中的代码
父子类中都有静态属性静态代码块,实例变量动态代码执行顺序;
- 父类静态属性
- 父类静态代码块
- 子类静态属性
- 子类静态代码块 ( 之后执行子类构造方法,子类构造方法第一句默认执行父类构造方法,)
- 父类 实例变量
- 父类动态代码块
- 父类构造方法
- 子类 实例变量
- 子类动态代码块
- 子类构造方法
public class s {
public static void main(String[] args) {
new a();
}
public s(){
System.out.println("b");
}
}
class a extends s{
String c= "c"; // 5 加载实例变量
static String a = "a"; // 1 先加载静态属性
{ System.out.println("d") ;} // 6 执行动态代码块
static{System.out.println(a);} // 2 再执行静态属性
public a () { // 3 再执行构造方法,
super(); // 4 执行父类的构造方法
System.out.println("e"); // 7 执行构造方法中的内容
}
}
final:最终类(不能被继承),最终方法(不能被覆盖),最终变量(命名大写 不能被修改 --常量), 限制某个类使用多态
最终常量必需要有默认值,( 显示初始化,动态代码块,构造方法)