一 abstract 抽象 类和方法
1. 概念
似是而非 , 像却又不是 ,不够准确 , 不够具体
2. 使用abstract修饰类
名称:抽象类
语法: abstract class 类名{}
public abstract class 类名{}
作用:经过abstract修饰的类 不能直接new对象
特点:
- 一般都是把父类定义为抽象
- 抽象类的属性和方法可以被子类正常继承,只是不能直接new对象
- 抽象类型可以作为引用类型,可以使用多态
- 抽象类具有构造方法
3. 使用abstract修饰方法
名称:抽象方法
语法:public abstract 返回值 方法名 ();
作用:可以省略当前方法的实现
特点:
1、抽象方法只有方法声明 , 不需要写方法实现。
2、抽象类中可以有普通方法,但是有抽象方法的类一定是抽象类
3、子类继承抽象类后,如果类中有抽象方法,子类必须覆盖抽象类中的所有抽象方法
二 static(静态) 属性、方法、代码块
1. 概念
a、static修饰的成员称为静态成员[类成员],全类对象公有
b、不必创建对象,可以直接通过类名调用 类名.静态成员
2, static修饰属性 —— 静态属性
语法:static 变量类型 变量名;
特点:
1,全类共享 , 不属于单独的某个对象
2,访问方式 类名.静态属性 | 对象名.静态属性
A.i | A a = new A() a.i
3,所有通过对象名访问静态属性的方式都会被自动转化为类名访问
a.i =自动转化=> A.i
3,static修饰方法 —— 静态方法
语法:访问修饰符 static 返回值类型 方法名 (){}
特点:
1、全类共享 , 不属于单独的某个对象
2、访问方式 类名.静态方法() | 对象名.静态方法()
A.ma() | A a = new A() a.ma()
3、所有通过对象名访问静态方法的方式都会被自动转化为类名访问
a.ma() =自动转化=> A.ma()
4、静态方法中无法使用非静态成员
5、静态方法可以继承 ,不能覆盖 , 没有多态
4,注意:
静态成员属于类级别成员 , 存在类信息后即可使用 不需要创建对象
普通成员变量和方法属于对象级别成员,想要使用必须先创建对象后再调用
5,static修饰代码块 —— 静态代码块
动态代码块
概念: { 代码 } 对象级别成员
作用:在初始化属性后,执行构造方法之前执行一些功能代码[为属性赋值]
执行机制:每次创建对象都会执行一次
静态代码块
概念:由static修饰的代码块 static{ 代码 } 类级别成员
特点:
- 类加载的时候被执行一次 , 不能手工调用
- 优先加载 , 可以为静态属性赋值 , 或者进行程序必要的初始化行为
类加载:
第一次使用一个类的时候,需要将类的.class文件加载到当前的JVM内存中
(.class文件中保存着当前类的所有详细信息:类名、版本、父类、属性、方法...)
类加载时机【静态代码块执行的时机】
- 创建当前类对象
- 访问静态属性
- 调用静态方法
- 创建子类对象
- 手工执行类加载 Class.forName(“类的全限定名”) 包名.类名
6,对象初始化流程
- 父类 静态属性
- 父类 静态代码块
- 子类 静态属性
- 子类 静态代码块
- 父类 成员变量
- 父类 动态代码块
- 父类 构造方法
- 子类 成员变量
- 子类 动态代码块
- 子类 构造方法
三,final (最终)
- final修饰类 最终类 不能被继承 如:String类
- final修饰属性|局部变量 属性值|变量值只能赋值一次,属性值|变量值不能改变
final修饰的属性没有默认值
final修饰属性可以不赋予初始值,但是要保证属性在创建对象成功之前赋值一次
(动态代码块、构造方法)
3,final修饰方法 最终方法 不能被覆盖,
4,final 修饰方法形参 最终参数 public void ma(final int a){} 只能通过调用时赋值一次
方法内只能使用 无法修改参数的值
5, 三个修饰符混用
只有static 和 final 能同时修饰属性 static final int a = 10; // 静态常量