随笔-208  评论-469  文章-30  trackbacks-0

abstract修饰符可用来修饰类和实例成员方法

用abstract修饰的类表示抽象类,抽象类不能被实例化。没有用abstract修饰的类称为具体类,具体类可以被实例化。

用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法必须要有方法体。

使用abstract修饰符需要遵守以下语法规则:

    (1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类,否则编译出错。

    (2)没有抽象构造方法,也没有抽象静态方法。
    abstract class Base {
       abstract Base() {}               //编译出错,构造方法不能是抽象的
       static abstract void method1();  //编译出错,static和abstract修饰符不能连用
       static void method2() {...}      //合法,抽象类中可以有静态方法
    }

    (3)抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。

    (4)抽象类及抽象方法不能被final修饰符修饰。即,abstract与final不能连用。这是因为abstract与final的作用是恰恰相反的,如:抽象类只允许创建其子类,而final修饰的类不允许拥有子类; 抽象方法必须被子类的具体方法来实现,而final修饰的方法不允许被子类方法覆盖。

为什么抽象类不允许被实例化?

在语义上,抽象类表示从一些具体类中抽象出来的类型。从具体类到抽象类,这是一种更高层次的抽象。如:苹果类、香蕉类和桔子类是具体类,而水果类则是抽象类,在自然界并不存在水果类本身的实例,而只存在它的具体子类的实例。
            Fruit fruit = new Apple(); //创建一个苹果对象,把它看做是水果对象
在语法上,抽象类中可以包含抽象方法,如果抽象类可以实例化,那么在访问抽象方法时将无法执行,因为抽象方法中根本就没有方法体。由此可见,Java编译器不允许创建抽象类的实例是必要的。
             abstract class Base {
                public void method1() {...}       //具体方法
                public abstract void method2();   //抽象方法
             }   

             Base base = new Base();  //假定Java编译器没有报错
             base.method1();
             base.method1();          //运行时Java虚拟机无法执行这个方法

posted on 2006-11-29 00:46 EricWong 阅读(584) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: