abstract
-
抽象类,被其他类继承,不能new对象,但可以声明引用。
-
抽象类的作用:
- 可被子类继承,提供共性属性和方法
- 可声明为引用,更自然的使用多态。
-
抽象类特点
- 抽象类不能被实例化,包含构造方法。
- 抽象类中可以包含抽象方法,也可以包括非抽象方法。
- 包含抽象方法的类,一定是抽象类。
- 子类必须实现抽象类中的抽象方法,除非子类也是抽象类。
-
抽象方法:只有方法声明,没有方法体实现。(需包含在抽象类中)。
-
特点
- 抽象方法没有方法体。
- 包含抽象方法一定是抽象类
- 抽象方法必须被子类重写,除非子类也是抽象类。
-
注意:抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。
-
子类继承抽象类后,必须重写父类中所有的抽象类方法,否则子类还是抽象类。
static
-
静态属性
-
访问静态属性使用:类名.静态属性。
-
访问静态方法使用:类名.静态方法。
-
静态成员存在方法区(JDK1.7之前永久代,JDK1.8源空间)中
-
static 特点:
- 静态方法中可以直接访问静态属性,不能直接访问非静态属性和方法,不能使用this.super。
- 非静态方法可以直接访问静态属性,静态方法。
- ***静态方法可以继承,不能重写,没有多态,重写后自动隐藏父类的静态方法。***。
-
常用静态类方法:Array,System,Math.
-
特殊方法:由于Java开放性,使用对象访问静态属性和方法,不推荐这种写法
-
三个代码块
- 局部代码块 :会缩小变量的使用范围,提前释放局部变量,节省内存。
- 动态代码块:定义在类中,创建对象时,触发动态代码的执行,可以为实例属性赋值。,执行顺序1.实例属性,2.动态代码块,3.构造方法{}
- 本质上没有动态代码,自动把代码块的内容优化放到构造方法中。把代码块放到类属性的前面,在代码块中输出属性,会报错,应该加this.
- 静态代码块(重点)
- 没有优化到构造方法。因为静态代码块不能访问类的非静态属性。
final
- final可修饰的内容
- 类(最终类) :没有子类,不可已被继承,
- 方法(最终方法):不能被子类重写(override),当时可以被继承,可以使用。
- 变量(最终变量)(常量)(不能被修改)
- 字面常量:10,100
- 符号常量:final int a=10;(a).
- final赋值:
- 1.修饰局部常量:声明并赋值,只能赋值一次。
- 2.实例常量赋值
- 声明是赋值。 final String name=“a”;
- 2.构造方法中赋值 final String name; public constructor(String name){this.name=name;1}
- 3.final 修饰类变量
- 1.声明时赋值,
- 2.在静态代码块赋值
- final修饰类,地址不能修改,不可继承,但是属性可以修改。
- 总结:
- final修饰类:此类不能被继承。
- final修饰方法:此方法不能被覆盖
- final修饰变量:此变量值不能被改变。(无初始值,只允许赋值一次)
- 局部常量:显示初始化。
- 实例常量:显示初始化,动态代码块,构造方法
- 静态常量:显示初始化,静态代码块
- 基本类型常量:值不可变
- 引用类型常量:地址不可变。
类加载
- 类加载 .class从硬盘类加载到内存(按需加载) :String,Math,System均为final修饰的类。
- 类加载会触发静态代码块的执行,仅此一次
- 作用:可为静态属性赋值,或必要的初始行为。
- 类加载时机:
- 创建对象
- 创建子类对象
- 访问静态属性
- 调用静态方法
- 主动加载:Class.forName(“全限定名”)
-
Demo.show(); 首先会累加在Demo类,在堆中间开辟空间,首先为属性初始化,new
-
Demo()=null,count1=0,count2=0;其次调用构造函数,count1 count2=1;其次从上至下执行静态属性,count2被覆盖为0,在调用show()所以count1=1,count=0;
-
- abstract和final不可以一起使用
- abstract和static不可以一起使用。
- abstract和private不可以一起使用。
- 抽象方法没有方法体,静态方法必须有方法体。
- 静态方法可以继承,不能重写,没有多态