1.抽象类不能被实例化
2.抽象方法没有方法体
如:
public abstract class Weapen { public abstract void attack(); }
- 抽象类中可以没有抽象方法,但若有了抽象方法,该类就必须是抽象类
- abstract和static不能连用,为什么呢?请往下看……
- 抽象类虽然不能被实例化,但是能创建一个引用变量,类型是抽象类,引用非抽象类的具体子类的一个实例。
abstract class Weapon { public abstract void attack(); } public class Sword extends Weapon { public void attack() { //do sth. } public static void main(String args[]) { //Weapon w1 = new Weapon(); //error Weapon w2 = new Sword(); //ok } }
final
- final修饰的类不允许被继承,即没有子类,断后了。
- final修饰的方法不能被子类的方法覆盖。
- final修饰的变量表示常量,只允许被赋值一次。
- final类型的实例变量,要么在定义变量的时候初始化,要么在构造方法中初始化。
(假如有多个构造函数,每一个构造函数都要初始化final变量,否则会出现编译错误“错误: 可能尚未初始化变量”)
- final类型的静态变量,只能在定义变量的时候初始化。
Static
由于静态方法不需要通过实现实例就可以被调用,所以在静态方法中不能使用this关键字(它不知道this指的是谁,因为没有实例);也不能直接访问实例变量和实例方法(没有实例哪来的实例变量和实例方法);但是可以直接访问静态变量和静态方法。
静态方法必须被实现,为什么
因为静态方法不依赖类的实例而存在,所以当前类必须为静态方法提供实现,换句话说,一个静态的方法不能定义为抽象的方法。即static和abstract不能同时使用。
public class Test { int x;//x是一个实例变量,不能被静态方法直接访问 Test() { x = 1; } public static void main(String[] args) { System.out.println(x); } }
public class Test { int x; Test() { x = 1; } public static void main(String[] args) { Test t1 = new Test(); System.out.println(t1.x); } }