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
    }
}
Sword.java 

 

final

  • final修饰的类不允许被继承,即没有子类,断后了。
  • final修饰的方法不能被子类的方法覆盖。
  • final修饰的变量表示常量,只允许被赋值一次。
  • final类型的实例变量,要么在定义变量的时候初始化,要么在构造方法中初始化。

  (假如有多个构造函数,每一个构造函数都要初始化final变量,否则会出现编译错误“错误可能尚未初始化变量”)

  • final类型的静态变量,只能在定义变量的时候初始化。

 

Static

由于静态方法不需要通过实现实例就可以被调用,所以在静态方法中不能使用this关键字(它不知道this指的是谁,因为没有实例);也不能直接访问实例变量和实例方法(没有实例哪来的实例变量和实例方法);但是可以直接访问静态变量和静态方法。

 

静态方法必须被实现,为什么

因为静态方法不依赖类的实例而存在,所以当前类必须为静态方法提供实现,换句话说,一个静态的方法不能定义为抽象的方法。即staticabstract不能同时使用。

public class Test
{
    int x;//x是一个实例变量,不能被静态方法直接访问
    
    Test()
    {
        x = 1;
    }
    
    public static void main(String[] args)
    {
        System.out.println(x);
    }
}
错误的Test.java
public class Test
{
    int x;
    
    Test()
    {
        x = 1;
    }
    
    public static void main(String[] args)
    {
        Test t1 = new Test();
        
        System.out.println(t1.x);
    }
}
正确的Test.java

相关文章: