static、final、abstract
1 static关键字
修饰成员变量
用static修饰的成员变量不属于对象的数据结构;
static变量是属于类的变量,通常可以通过类名来引用static成员;
static成员变量和类的信息一起存储在方法区,而不是在堆中,一个类的static成员变量只有“一份”,无论该类创建了多少个对象。
static修饰方法
通常的方法都会涉及到对具体对象的操作,这些方法在调用时,需要隐式的传递对象的引用(this)。
static修饰的方法则不需要针对某些对象进行操作,其运行结果仅仅与输入的参数有关,调用时直接用类名引用。
由于static在调用时没有具体的对象,因此在static方法中不能对非static成员(对象成员)进行访问。static方法的作用在于提供一些“工具方法”和“工厂方法”等。
static块
static块:属于类的代码块,在类加载期间执行的代码块,只执行一次,可以用来在软件中加载静态资源。
2 final关键字
final修饰变量
final关键字修饰成员变量,意为不可改变。
final修饰成员变量,两种方式初始化:
– 声明同时初始化
– 构造函数中初始化
final修饰方法
final关键字修饰的方法不可以被重写。
使一个方法不能被重写的意义在于:防止子类在定义新方法时造成的“不经意”重写。
final修饰类
final关键字修饰的类不可以被继承。
使一个类不能被继承的意义在于:可以保护类不被继承修改,可以控制滥用继承对系统造成的危害。
static final 常量
static final 修饰的成员变量成为常量,必须声明同时初始化,不可被改变。
3 abstract关键字
抽象方法和抽象类
• 由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法体实现,用一个分号结尾;
• 一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类;
• 如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)。
抽象类不可以实例化
• 抽象类不可以实例化,例如,如果Shape是抽象类的话,下面的代码是错误的:
Shape s1 = new Shape();
• 即使一个类中没有抽象方法,也可以将其定义为抽象类,同样,该类不可以实例化。
• abstract和final关键字不可以同时用于修饰一个类,因为final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。
继承抽象类
• 一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。