抽象类和接口

一.抽象类

1>.了解抽象类

1.抽象类不能创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现。

2.在继承的层次结构中,每个新的子类都使类更加明确和具体。如果从一个子类向父类追溯,类就会变得更不通用并且不明确。类的设计应该确保父类包含其子类的共同特征。有的时候呢,父类会设计的十分抽象,以至于不能用于创建任何具体的实例;这样的类就称为抽象类。 

2>. abstract(在类的头部使用abstract修饰符表示该类是抽象类

public abstract class GeometricObject{  //父类,abstract表示该类为抽象类
    private String color = "write";   //私有数据域color 和 filled 不能被除了父类本身之外的其他任何类访问
    private boolean filled;           //读取和改变color与filled的唯一方法就是通过它们的获取方法和设置方法
    private java.util.Date dateCreated;  //对象创建的日期

    public GeometricObject(){     //创建一个GeometricObject
        dateCreated = new java.util.Date();
    }

    public GeometricObject(String color,boolean filled){  //创建一个带特殊颜色和填充物的GeometricObject
        dateCreated = new java.util.Date();
        this.color = color;
        this.filled = filled;
    }

    public String getColor(){
        return color; //返回颜色
    }

    public void setColor(String color){
        this.color = color;   //设置新的颜色
    }

    public boolean isFilled(){
        return filled;  //返回filled的属性(false  or  true)
    }

    public void setFilled(boolean filled){
        this.filled = filled;    //设置filled新的属性
    }

    public java.util.Date getDateCreated(){
        return dateCreated; //返回dateCreated
    }

    public String toString(){   //返回这个对象的字符串表述
        return "created on " + dateCreated + "\ncolor: " + color + "and filled: " + filled;
    }
}

public abstract double getArea();    //抽象方法

public abstract double getPerimeter();

可以对比上一篇博客中的代码看更容易观察抽象类的特点*~*

1.抽象类和常规类十分相似,但是不能使用new操作符创建它的实例;抽象方法的定义没有给出实现,其实现由子类实现哦;

一个包含抽象方法的类必须声明为抽象类。

2.抽象类的构造方法定义为protected,因为它只被子类使用;

创建一个具体子类的实例时,其父类的构造方法被调用以初始化父类中定义的数据域。

3>抽象类的注意点 

1.抽象方法不能包含在非抽象类中。

 如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的;

也就是,在继承自抽象类的非抽象子类中,必须实现所有的抽象方法。(抽象方法是非静态的)

2.抽象类不能使用new操作符来初始化。

但是可以定义它的构造方法,这个构造方法在其子类的构造方法中调用。

3.包含抽象方法的类必须是抽象的。

但是呢,可以定义一个不包含抽象方法的抽象类,这个抽象用来定义新子类的基类。

4.子类可以重写父类的方法并且把它定义为抽象的;

这个呢见的比较少,但是当父类的方法实现在子类中变得无效时十分有用(子类必须定义为抽象的)

5.子类可以是抽象的,即使父类是具体类;

eg:Object类是具体类,但是它的子类GeometricObject可以是抽象的。

6.不能使用new操作符从一个抽象类创建一个实例;

但是抽象类可以作为一种数据类型。

eg:

①创建元素为GeometricObject类型的数组

GeometricObject[ ] objects =new GeometricObject[10];

②创建一个GeometricObject的实例,并且将它的引用赋值给数组元素

object [0] = new Circle();

二.接口(interface)

1>了解接口

1.接口是一种与类相似的构造,用于为对象定义共同的操作。

2.接口的目的是指明相关或者不相关类的对象的共同行为;

eg:使用适当的接口可以指明这些对象是可比较的或者可克隆的等等。

2>定义接口的语法

modifier interface InterfaceName{

}

eg:

public interface Edible{

     //code

    public abstract String howToEat( );

}

3>接口继承

类和接口之间的关系称为接口继承。

public class TestEdible {
    public static void main(String[] args){
        Object[] objects = {new Tiger(),new Chicken(),new Apple()};
        for(int i =0;i<objects.length;i++){
            if(objects[i] instanceof Edible)
                System.out.println(((Edible)objects[i]).howToEat());
            if(objects[i] instanceof Animal){
                System.out.println(((Animal)objects[i]).sound());
            }
        }
    }
}

interface Edible{  //Edible接口定义了可食用对象的共同行为
    public abstract String howToEat();
}

abstract class Animal {
    private double weight;

    private double getWeight(){
        return weight;
    }
    public void setWeight(double weight){
        this.weight = weight;
    }

    public abstract String sound();//定义一个sound方法,sound方法是一个抽象方法;被具体的animal类实现
                                 
}

//chicken类实现了Edible接口,表明小鸡是可以食用的
class Chicken extends Animal implements Edible{
    @Override
    public String howToEat(){  //当一个类实现接口的时候,该类实现了定义在接口中的所有方法
        return "Chicken: cock-a-doodle-doo";
    }
    @Override
    public String sound(){
        return "Chicken: cock-a-doodle-doo";
    }
}

class Tiger extends Animal{
    @Override
    public String sound(){
        return "Tiger: RROOAARR";
    }
}

//fruit类实现了Edible
abstract class Fruit implements Edible{//因为fruit类没有实现howtoeat方法,所以fruit必须被定义为abstract
                                       //fruit的子类必须实现howtoeat方法
}

class Apple extends Fruit{
    @Override
    public String howToEat(){
        return "Apple: Make apple cider";
    }
}

class Orange extends Fruit {
    @Override
    public String howToEat(){
        return "Orange: Make orange juice";
    }
}

4>Comparable接口

1.Comparable接口中定义了compareTo方法,用于比较对象。

2.接口定义:

public  interface  Comparable<E> {

   public int compareTo(E o);

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值