抽象类和接口

十三:抽象类和接口

抽象类

抽象类不可以用于创建对象,抽象类可以包含抽象方法,方法的实现在子类中实现,在类及方法的定义时需要用关键字abstract进行标示。具体使用如下:

public abstract class Gemetric{
public Gemetric(){};
}

关于抽象类的几点注意:

1.抽象类不能创建实例,但是可以作为一种数据类型,比如在几何类中可以这样使用Gemetric[] objects=new Gemetric[10],声明一个可以包含几何对象的数组之后就可以使用Circle类的实例对数组进行赋值,如objects[0]=new Circle(2.5);
2.一个抽象类可以包含有abstract修饰的抽象方法,也可以不包含。当不包含时,该抽象类就仅仅作为一个基类;当包含时,所有继承它的子类要对其中的所有抽象方法进行实现,如果不能全部实现,则子类也必须声明为抽象的。另外抽象方法是非静态的,包含抽象方法的类必须是抽象类。
3.即使父类是具体的,其子类也可以是抽象的:比如Object类是具体的但是它的子类Gemetric是抽象的。
4.虽然不能使用new操作符对抽象类进行实例化,但是也可以定义抽象类的构造函数,在其子类的构造函数中进行使用。
5.一个方法只有在父类中进行了声明,才能在后续的子类类型不确定的情况下使用同名的方法。

接口

接口是一种与类相似的结构,只包含常量和抽象方法:它的目的是指明相关或不相关类的多个对象的共同行为,比如是可比较的、可食用的、可序列化的等。java中进行接口定义的语法如下:

//定义接口,包括常量和对应的方法签名
修饰符 interface 接口名{
/** 常量声明 **/
/** 方法签名 **/

在具体的使用上和抽象类类似,比如为了说明一个类是可食用的或者可比较的,则需要使用关键字implements,来实现接口继承,它和一般类的继承是类似的,因此统称为继承:

public class Chicken extends Animal implements Edible{
//实现了接口,则需要对接口中的方法进行实现
//如果不对howToEat方法进行实现,则该类需要声明为*abstract*类型的
@Override
public String howToEat(){
return "Chicken: fry it";
}
@Override
public String Sound(){
return "ji-ji-ji";
}

通过接口实现了一种类似于多重继承的方案,比如通过对java中的Comparable接口的继承,实现其中的compareTo方法既可以利用java.utils.Arrays.sort()对包含该种对象的数组进行排序。

Cloneable接口:这是一个特殊的接口,它不包括任何的常量和方法,声明如下:

public interface Cloneable{};```
一个带空体的接口被称为标记接口,它用来表示一个类拥有某些特别的属性,例如,被Cloneable标记的类就具有可以复制的属性,它的实例对象可以使用Object类中的clone()方法对其内容进行克隆。另外针对克隆有一点需要注意:虽然经过克隆后的两个对象在“==”意义上是false,也就是它们是两个不同的对象而不是将其中一个的引用给对方,但是如果克隆对象的内部有的部分是对象的话,它仍然是把该对象的引用给另一个对象也就是有下面的现象出现:

```java
\\假如House是一个类,House内有一个属性whenToBuild,它的类型是java.utils.Date
House house1=new House(77);//内部参数是房屋大小
House house2=house1;
House house3=house1.clone();
System.out.println(house1==house2);//输出为true,内容相同的相同对象只是把house1的引用给了house2,修改house2,house1也会变化
System.out.println(house1==house3);//输出为false,内容相同的不同对象,两个相互独立,修改其中一个另一个不变
System.out.println(house1.whenToBuild==house2。whenToBuild);//输出为true

接口与抽象类比较

  • 一个类可以实现多个接口但是只能继承一个类,仅能有一个父类。
  • 利用关键字extends接口可以继承其他多个接口,该接口被称为子接口,如果一个类实现了一个子接口,则它需要实现子接口及其各层级父接口定义的所有抽象方法。
  • 所有的类共享一个根类object,而接口不存在共同的根,与类相似,接口可以实现一种类型,对于实现了接口的类,该接口可以引用其实例,可以将接口当作一种数据类型使用。
  • 接口比类更加灵活,它可以作为许多种不同类型的共有属性,而不用保证它必须是某种类型才能对其继承实现。
    当使用“+”把一个字符串和一个对象进行连接时,实际上是默认调用了该对象的toString()方法,再进行相连接

类的设计原则

  1. 内聚性:类应该描述一个单一的实体,所有的类操作在逻辑上应该是相互联合的,比如可以设计一个学生类就不应该再将教工放在该类中。

String类处理不可变的字符串,StringBuilder类创建可变的字符串,StringBuffer类与前者类似,但是还包含字符串更新的同步方法。

  1. 一致性:遵循统一的设计标准和命名风格,基本顺序是数据域-》构造函数-〉一般方法;
  2. 封装性:应该默认使用private对数据域进行修饰,避免外部访问修改,只有需要得到数据时才设置get方法,同样仅在需要修改时设置set方法。
  3. 实例和静态:对于不依赖于任何实例的方法和被类中所有方法共享的变量应该声明为静态的;不要从构造方法中传入数据对数据域中的变量进行初始化,最好使用set方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值