您是否可以定义抽象类的子类而不定义超类中定义的任何抽象方法?为什么?

时间:2017-10-13 13:54:19

标签: java inheritance abstract-class subclass superclass

例如,如果我创建一个抽象类并且它有两个抽象方法,那么我的子类是否需要以某种形式或形式存在它们? 我是否需要将它们包含在内,只需定义它们或者我是否还需要实现它们并使用它们?

4 个答案:

答案 0 :(得分:1)

您可以在抽象类中实现您的方法,因此无需在子类中实现这些方法。请务必从方法中删除抽象关键字,然后在其中添加正文(在抽象类中)。

如果需要,您仍然可以在子类中覆盖它们。

  • 创建一个新的类文件 AnimalTest.java 并粘贴以下代码:

    public class AnimalTest
    {
    
        public static void main(String[] args)
        {
            Animal cat = new Cat("pussy");
            Animal dog = new Dog("pluto");
    
            cat.speak();
            dog.speak();
        }
    
    }
    
    abstract class Animal
    {
    
        private final String name;
        private final String kind;
    
        public Animal(String name, String kind)
        {
            this.name = name;
            this.kind = kind;
        }
    
        // It has no body. It contains the abstract keyword. It needs to be implemented in subclass
        public abstract void speak(); 
    
        // it's already implemented here, in abstract class. You won't be forced to implement this in subclass. But you can still override it if you want.
        public String name()
        {
            return this.kind + " " + this.name;
        }
    }
    
    class Dog extends Animal
    {
    
        public Dog(String name)
        {
            super(name, "dog");
        }
    
        @Override
        public void speak()
        {
            System.out.println(this.name() + " says woof");
        }
    
    }
    
    class Cat extends Animal
    {
    
        public Cat(String name)
        {
            super(name, "cat");
        }
    
        @Override
        public void speak()
        {
            System.out.println(this.name() + " says niar");
        }
    }
    
  

结果:
  猫猫说niar
  狗pluto说woof

答案 1 :(得分:0)

abstract class A {
    abstract void f1();
    abstract void f2();
}

class B extends A {} // won't compile

你不能写一个没有实现抽象方法的具体子类,编译器会“尖叫你”。您可以定义另一个抽象类并将其用作子类而无需实现这些方法,但最终您会发现自己创建了一个具体的子类,在这一点上您必须实现所有抽象方法,因为它们是一种契约,必须实现。

至于为什么,它会强制某些设计决策给你编码器,这似乎是合乎逻辑的,例如让我们说你正在制作一个游戏,你有很多不同类型的敌人为游戏,你会有他们所有人都有一个共同的超类,class Monster以及你将放入超类中的每一个类似的行为,因为你不知道怪物如何移动,例如你将该方法/行为标记为抽象和一个很好的理由是因为你想强迫每个与你一起工作的人在他们设计他们的具体怪物时实现这种行为,希望这个例子有助于更好地说明它。

答案 2 :(得分:0)

如果您的子类也是抽象的(public abstract class MyAbstractClass extends TheOriginalClass),则不必实现任何方法。基本上,您可以将抽象子类留空。

如果您的子类是具体的(public class MyClass extends TheOriginalClass),则需要实现所有方法。

在你的问题中关于“......并使用它们”:无所谓。

答案 3 :(得分:0)

  

我是否需要将它们包含在内,只需定义它们或者我是否还需要实现它们并使用它们?

Java没有考虑前向声明,因为类的所有内容必须在类中实现。您可以在不实现方法的情况下定义方法,但编译器会强制您将其标记为abstract。 您不需要使用它们,但无论如何都必须实现它。抽象方法通常用于超类调用,但没有人强迫任何人一般调用方法。

  

如果我创建一个抽象类并且它有两个抽象方法,我的子类是否需要以某种形式或形式存在它们?

如果你有一个abstract类,这意味着该类有许多非零的抽象方法。

如果你继承了abstract类,你必须将它标记为abstract,除非这个类实现了所有的抽象方法。

除了为其子类提供统一接口之外,此类本身是否具有任何实用程序?是的,可能是static种方法。

但显然你无法实例化一个类的对象,这个对象没有使用某些方法。