抽象类
有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类。
抽象类和常规类很像,但是不能使用new操作符创建它的实例。抽象方法只有定义而没有实现。它的实现由子类提供。一个包含抽象方法的类必须声明为抽象类。
抽象类的构造方法定义为protected,因为它只被子类使用。创建一个具体子类的实例时,它的父类的构造方法被调用以初始化父类中定义的数据域。
抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在抽象类扩展的非抽象类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的。
抽象类是不能使用new操作符来初始化的。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用。
包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用new操作符创建该类的实例。这种类是用来定义新子类的基类的。
子类可以覆盖父类的方法并将它定义为abstract。这是很少见的,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义是为abstract。
即使子类的父类是具体的,这个子类也可以是抽象的。例如,Object类是具体的,但是它的子类如GeometricObject可以是抽象的。
不能使用new操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型。
eg:GeometricObject[] objects = new GeometricObjrct[10];
object[0] = new Circle();
接口
接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面都与抽象类很相似,但是它的目的是指明相关或者不相关类的多个对象的共同行为。
类和接口之间的关系称为接口继承。因为接口继承和类继承本质上是相同的,所以我们将它们都简称为继承。
由于接口中所有的数据域都是public static final而且所有的方法都是public abstra,所以java允许忽略这些修饰符。
类的设计原则
内聚性,类应该描述一个单一的实体,而所有的类操作应该在逻辑上互相配合,支持一个一致的目的。
一致性,遵循标准java程序设计风格和命名习惯。为类,数据域和方法选取具有信息的名字,通常的风格是将数据声明置于构造方法之前,并且将构造方法置于方法之前。如果不想让用户创建类的对象,可以在类中声明一个私有的构造方法,Math类就是如此。
封装性,只在希望数据域可读的情况下,才提供get方法;也只在希望数据域可更新的情况下,才提供set方法。
清晰性,易于解释和理解。
完整性,类是为许多不同用户的使用而设计的。为了能在一个广泛的应用中使用,一个类应该通过属性和方法提供多种方案以适应用户的不同需求。
实例和静态,依赖于类的具体实例的变量或方法必须是一个实例变量或方法。如果一个变量被类的所有实例所共享,那就应该将它的声明为静态的。应该总是使用类名引用静态变量和方法。应该总是使用类名而不是引用静态变量和方法。不要从构造方法中传入参数来初始化静态数据域。最好使用set方法改变静态数据域。
小提示
1.Number类是数据包装类,BigInteger以及BigDecimal的抽象父类。
2.GregorianCalendar是抽象类Calendar的一个具体子类。