8. abstract 、static 和final修饰符
8.1 abstract 抽象的
-
类 抽象类
抽象类 只能声明引用,不能创建对象
供子类去继承
生活中,抽象类时从不同子类中抽象出的父类,自身不存在对象 如:动物类,交通工具类
-
方法 抽象方法
只有方法声明,没有方法实现 方法实现部分用分号
只声明了对象具有什么功能,没有定义对象如何实现该功能
8.1.2抽象类和抽象方法的关系
如果一个类具有抽象方法,那么这个类就必须是抽象类
抽象类中未必有抽象方法
子类继承抽象类,如果子类不希望成为抽象类,就必须实现父类中所有的抽象方法
一个引用可以调用其引用类型中声明的所有方法,包括抽象方法
声明和实现分离,声明在父类,实现留给子类 ------资料类的共性放在父类
8.1.3多态和抽象的作用
-
提高代码的弱耦合性
抽象类可以作为便准,约定了对象应该具备的方法 规格
隔离了标准的使用者和标准的实现这 从而实现弱耦合
8.2static 静态的
-
成员变量(属性)静态属性
全类共有 不属于任何对象
可以直接用类名访问
-
方法 静态方法
可以直接用类名调用
静态方法只能访问类的静态成员,不能访问类的非静态成员,不能出现this
子类可以用静态方法覆盖父类的静态方法,没有多态
如果我们对引用调用静态方法,编译器会将代码变为:对引用类型调用静态方法
package day05; /** * @author 小白孙佳遥 想杨屎郡了 * static 静态 */ public class textStatic { public static void main(String[] args) { Myclass mc1 =new Myclass(); Myclass mc2 =new Myclass(); mc1.a++; mc2.b++; System.out.println(mc2.a); System.out.println(mc2.b);//21 System.out.println(Myclass.b); Myclass mc = new Myclass(); mc.print(); Myclass.print();//静态方法直接用类名调用 ClassA a=new ClassB(); a.method();//执行时变为 ClassA.method(); } } class Myclass{ int a=10; static int b= 20; public static void print(){ //System.out.println(a); error!静态方法只能访问类的静态成员,不能访问类的非静态成员 System.out.println(b); } } class ClassA{ public static void method(){ System.out.println("ClassA method"); } } class ClassB extends ClassA { public static void method(){ System.out.println("Class B method"); } }
-
初始代码块 静态初始代码块
class A{
static {
Systerm.out.println("Init A");
}
}
-
在类加载的时候执行一次
类加载:当JVM第一次使用一个类的时候,它需要将这个类对应的字节码文件读入JVM,从而获取这个类的全部信息(类的父类,有哪些属性,方法,构造方法等等),并保存起来。(保存在JVM的方法区) 在JVM运行的过程中,一个类只会加载一次。
public class textStaticInitCode { public static void main(String[] args) { new A(); new A(); } } class A{ static { System.out.println("Init A"); } static int m =10; public A(){ System.out.println("A()"); } } // 输出 InitA A() A()
什么时候会类加载?
第一次创建该类对象
第一次访问类的静态成员
加载子类时,也可能需要先加载父类
如果,仅仅是生命类的引用,不需要进行类加载
类加载的过程?
如有必要,先加载父类
为类的静态属性分配空间,分配默认值
按照代码的顺序,初始化静态属性,或是运行静态初始代码快
8.3final
-
类 该类不能被继承 不能拥有子类
-
方法 该方法不能被子类覆盖
-
变量 成员变量 + 局部变量 常量 一旦赋值,不能改变
当final修饰成员变量时,系统不提供默认值,就必须在初始化属性时或是构造方法中赋值一次。
8.4 修饰符组合
private static final 都不能和 abstract 同时出现