【问题标题】:Difference Interfaces between Abstract Classes [duplicate]抽象类之间的差异接口
【发布时间】:2012-10-29 05:13:55
【问题描述】:

可能重复:
Interface vs Base class
Interface vs Abstract Class (general OO)
Abstract class vs Interface in Java

所以我在我的编程课程中学习了接口和抽象类。这两个主题看起来非常相似。我知道它们都与继承有关,但是两者有什么区别?

【问题讨论】:

  • 从这里开始http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo

标签: java


【解决方案1】:

抽象类可以在方法体中包含代码,而这在接口中是不允许的。

【讨论】:

  • 哦,非常感谢!这实际上比我想象的要简单得多。我不敢相信我没有看到。
【解决方案2】:

接口具有必须由实现它的类定义的方法。

抽象类是类似的。但是,在抽象类中,它可以包含继承类将能够自动调用的方法定义。

底线:如果所有实现类的方法定义完全不同,则使用接口。如果继承类共享一些定义并且对某些方法有不同的定义,则使用抽象类。

例子:

public interface Shape {
    public float getArea();
    public void doThings();
}

public class Circle implements Shape{
    public float getArea() {
        return Math.PI * R * R;
    }

    public void doThings() { }
}

public abstract class Quadilateral implements Shape {

    public float getArea() { // defined
    return l * h;
    }

    public abstract void doThings(); // left abstract for inheriting classes
}

public class Rectangle extends Quadilateral {
    public void doThings() {
    // does things
    }
}

public class Parallelogram extends Quadilateral {
    public void doThings() {
    // does things
    }
}

【讨论】:

    【解决方案3】:

    抽象类可以有方法,而接口不能有。

    我通常是这样想的:

    • 如果您希望某个类强制其他类编写方法,请使用接口。
    • 如果您希望一个类为多个类保存一个公共方法,请使用抽象类。

    例如,您可能想要创建一个Animal 类。然后有一个DogCat 类。狗和猫都睡觉。所以你希望他们都有一个 sleep 方法。他们的睡眠方式基本相同。因此,您希望 Animal 类保存该方法(因为 DogCat 相同。

    public abstract class Animal {
        public void sleep() {
            //make ZZZZ appear in the air or whatever
        }
    }
    
    public class Dog extends Animal {
        //This class automatically has the sleep method
    }
    
    public class Cat extends Animal {
        //This class automatically has the sleep method
    }
    

    另一方面,假设您有一个 SnakeShark 课程。蛇和鲨鱼都会攻击,但方式不同(毒液与咬人)。所以你可能有一个Attacker 接口。

    public interface Attacker {
        //We HAVE to have this here
        public void attack(); //Note - we didn't write the method here, just declared
    }
    
    public Snake implements Attacker {
        //We HAVE to have this here
        public void attack() {
            //inject venom
        }
    }
    
    public Shark implements Attacker {
        public void attack() {
            //rip apart
        }
    }
    

    请注意,抽象类也可以有未定义的方法(如接口)。所以你可以在Animal 中有public void makeMeanSound();,然后有Dog 咆哮和Cat 嘶嘶声。主要区别在于抽象类可以编写实际的方法。

    接口 - 强制编写方法(即强制 SnakeShark 具有 attack() 方法)。

    抽象类 - 为子类提供通用方法。

    【讨论】:

      【解决方案4】:

      有两个主要区别。

      1. 接口不能包含任何实现。接口只是抽象方法的列表,实现该接口的所有类都必须实现所有这些方法。另一方面,抽象类可以包含某些方法的实现,这些方法随后可供子类使用。
      2. 一个类只能有一个超类,无论是抽象的还是其他的,但一个类可以实现任意数量的接口。

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2014-08-03
        • 2012-03-18
        • 2023-03-03
        • 2011-05-22
        • 1970-01-01
        相关资源
        最近更新 更多