抽象类和接口

抽象类与接口详解:Java编程中的设计模式
本文探讨了Java中的抽象类,包括其定义、特点、抽象方法及注意点,同时介绍了接口的概念、目的、语法、继承以及Comparable接口的应用。理解这两种构造如何定义类的行为和协作,对于面向对象设计至关重要。

一.抽象类

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]。 2. 抽象类接口都可以包含抽象方法,这些方法需要被子类或实现类覆写后才能使用[^4]。 3. 两者都位于继承结构的顶端,用于定义通用的行为或规范[^4]。 #### 区别 1. **继承关系** - 抽象类通过 `extends` 关键字进行继承,一个类只能继承一个抽象类。 - 接口通过 `implements` 关键字实现,一个类可以实现多个接口,这弥补了 Java 的单继承限制[^1]。 2. **实现细节** - 抽象类可以包含普通方法(即带有具体实现的方法)以及抽象方法,子类可以选择性地覆写这些方法。 - 接口在 JDK 8 之前只能包含抽象方法声明,在 JDK 8 及之后可以通过 `default` `static` 关键字提供默认实现或静态方法[^5]。 3. **成员变量** - 抽象类中可以有成员变量,并且其修饰符可以是任意类型(如 `private`、`protected` 等)。 - 接口中所有的变量默认是 `public static final` 类型,不能有普通的成员变量[^3]。 4. **多态性** - 由于 Java 的单继承限制,一个类只能继承一个抽象类,因此在设计灵活性上受到一定限制。 - 接口允许多个实现,一个类可以同时实现多个接口,从而提供更高的灵活性[^1]。 5. **设计目的** - 抽象类主要用于定义一种通用的类,其子类可以基于这个通用类进行扩展。 - 接口更多地用于定义一组规范,实现多种功能的类可以实现同一个接口。 6. **抽象类的特殊性** - 即使一个抽象类不包含任何抽象方法,也可以被定义为抽象类,目的是防止该类被直接实例化[^2]。 #### 示例代码 以下是一个简单的代码示例,展示抽象类接口的使用: ```java // 抽象类示例 abstract class Animal { // 普通方法 public void breathe() { System.out.println("Breathing..."); } // 抽象方法 public abstract void makeSound(); } // 接口示例 interface Swimmable { default void swim() { System.out.println("Swimming..."); } } // 子类实现 class Dog extends Animal implements Swimmable { @Override public void makeSound() { System.out.println("Barking..."); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值