一、抽象类
abstract
修饰类,此类不能new
对象。被
abstract
修饰的类,称为抽象类。抽象类意为不够完整的类、不够具体的类,抽象类对象无法独立存在,即不能new对象。
作用:
- 可被子类继承,提供共性属性和方法;
- 可声明为引用,更自然的使用多态。
- 抽象父类,可作为子类的组成部分,依附于子类对象存在,由父类共性+子类独有组成完整的子类对象。
抽象方法只有方法声明,没有方法实现。
产生继承关系后,子类必须重写父类中所有的抽象方法,否则子类还是抽象类。
public abstract void eat();
public abstract void sleep();
abstract
修饰是类是抽象类,不能new
对象,可以被继承,也可以声明引用;
abstract
修饰方法是抽象方法,只有方法声明,没有方法体,包含在抽象类中;抽象类不一定有抽象方法,有抽象方法的类一定是抽象类;
子类继承抽象类后,必须重写父类中所有的抽象方法,否则子类还是抽象类。
二、static
被static
修饰的属性称为静态属性(类属性),被static
修饰的方法称为静态方法(类方法)。
静态成员是全类所有对象共享的成员,在全类中只有一份,不因创建多个对象而产生多份。
类名.成员
对象名.成员
实例属性是每个对象各自持有的独立空间,对象单方面修改,不会影响其他对象。
public class MyClass {
public int a;//实例属性
public static int b;//静态属性
}
public class MyTest2 {
public static void main(String[] args) {
//static修饰的变量随着类的加载而存在,和是否创建对象无关。
MyClass.b = 10;
System.out.println(MyClass.b);
System.out.println("==========================");
MyClass c1 = new MyClass();
MyClass c2 = new MyClass();
System.out.println("c1.b = " + c1.b);
System.out.println("c2.b = " + c2.b);
System.out.println("==========================");
c1.b = 1000;
System.out.println("c1.b = " + c1.b);
System.out.println("c2.b = " + c2.b);
}
}
静态属性是整个类共同持有的共享空间(只有一份),任何对象修改静态属性,都会影响其他对象对该属性的访问。
static
修饰的变量随着类的加载而存在,和是否创建对象无关。
类加载
- 创建对象;
- 创建子类对象;
- 访问静态属性;
- 调用静态方法;
- 主动加载:
Class.forName("全类名")
静态代码块
定义在类中,与属性和方法处于同一级。
class 类名 {
static {
//静态代码块
}
}
类加载时,触发静态代码块的执行(仅一次)。
执行时机:
- 静态代码块和静态属性的初始化顺序,由在类中书写的顺序决定;
- 代码块和属性的初始化先于构造方法执行。
作用:可为静态属性赋值,或必要的初始行为。
三、final
final
修饰的类,不能被继承
String
、Math
、System
都被final
修饰,不能被继承。
final
修饰的方法,不能被重写(覆盖)
final
修改的变量,是常量,不能修改值
-
所有
final
修改的变量只能赋值一次,值不允许改变。
赋值时机:显式初始化,动态代码块,构造方法。
赋值时机:显式初始化,静态代码块。
final
修饰引用类型,地址不可变。