java基础知识之抽象类

来源:互联网 发布:java第三方服务器ftp 编辑:程序博客网 时间:2024/04/25 08:11

一,抽象类的概念和定义

1,本文中的抽象类表示的是一个抽象体,并非直接从abstract class翻译而来,而abstract class仅仅是Java语言中用于定义抽象类的一种方法。

2,在面向对象的概念中,所有的对象都是通过类来描绘的但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

3,抽象类是对一系列看上去不同,但是本质上相同的具体概念的抽象,往往用来表征我们在对问题进行分析、设计中得出的抽象概念。

       (1) 比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们本质上又都属于这样一个概念:形状,形状这个概念在问题领域是不存在的,所以形状就是一个圆形、三角形的抽象类。

       (2)   正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的。

4,说到抽象类,那必定要提到抽象方法,抽象方法是指在类中没有方法体的方法,而抽象类中的抽象方法必须被子类实现。含有抽象方法的类就叫抽象类,那如果一个抽象类不含有抽象方法可以吗?答案是可以,但是这就失去了抽象类本身的用处和意义了,因为抽象方法就是为了继承而存在的。

5,在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类。

6,这一组任意个可能的具体实现则表现为所有可能的派生类(子类),模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

二,注意点

     1) 抽象类不能被直接实例化,要通过其子类进行实例化,因为抽象类中含有无具体实现的方法,也就是含有抽象方法,所以不能使用抽象类来创建对象。

     2) 抽象类不能被声明为private,且abstract不能与final并列修饰同一个类,否则子类无法继承。

     3) 抽象类中的普通方法,可以不必实现,但是子类中的抽象方法不能与父类的抽象方法同名。

     4) abstract 不能与private、static、final或native并列修饰同一个方法。(因为抽象类要被继承重写,所以不能用private和final修饰,因为抽象类不能够创建实例,所以不能够用static修饰)

     5) 抽象类被子类继承,子类(如果不是抽象类)必须重写抽象类中的所有抽象方法,如果子类没有实现父类的所有抽象方法,那么该子类也必须声明为抽象类。

     6) 只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。

     7) 抽象类只能被单继承,如果一个子类继承了一个抽象类,那么这个子类将不能再继承别的类。

     8) 抽象类中可以有非抽象的方法,也可以没有非抽象的方法,但是必须要有抽象的方法,否则该抽象类将失去意义。

     9) 特别注意:在其他方面,抽象类和普通的类并没有区别。

总结来说:抽象类就是包含一个抽象方法的类。

                  抽象方法就是一个方法被声明了但是没有被实现的方法,抽象方法必须使用abstract关键词字声明。

三,表格总结


语法

备注

抽象类定义用abstract关键字修饰

要通过子类进行实例化

抽象类是不能被实例化的

要通过子类进行实例化

子类必须重写父类的所有抽象方法

抽象方法:声明但却未被实现的方法,用abstract关键字修饰

含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法

抽象类是用来被它的子类继承的

关键字extends

抽象类是在功能上的一个规定


四,举例说明:

/** * 抽象类人 * abstract修饰词不能与privatestaticfinalnative共用 */

public abstract class People {//关键词abstract,声明该类为抽象类    public int age;//可以有普通的成员变量    public People(){//可以拥有自己默认的构造方法    }    public People (int age){//可以拥有自己的有参数的构造方法        this.age = age;    }    //普通的成员变量和方法可以用privateprotectedfinalstatic等修饰符修饰    private int num;    private void cry(){};    public abstract void singing();//声明该方法为抽象方法(抽象类中至少需要有一个抽象方法,子类必须实现该方法)   //void run();//该方法编译器会报错,需要申明为abstract方法,或者具有方法体。    public void eat() {//可以包含普通的有方法体的方法(子类可以实现,可以不实现)        System.out.println("吃饭");    }    public void sleep(){//可以包含有方法体但没有具体实现的普通方法    }    public static void learn(){};//可以包含普通的静态方法,但是不能包含抽象的静态方法    static{//可以包含静态代码块        System.out.println("静态代码块");    }}
/** * 子类小明继承父类人 */
public class XiaoMing extends People {    //因为小明继承了父类,所以必须实现父类所有的抽象方法,    // 其他的方法可以实现也可以不实现。    @Override    public void singing() {        System.out.println("唱歌");    }


原创粉丝点击