Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象方法与仅子类方法_Java_Oop_Inheritance - Fatal编程技术网

Java 抽象方法与仅子类方法

Java 抽象方法与仅子类方法,java,oop,inheritance,Java,Oop,Inheritance,最近我读到一个抽象方法本质上创建了一个标记为继承的方法,它是无块的,等待子类专门化。那么我问这个, 创建一个抽象方法,允许其继承,创建一个子类版本,但没有相应的超类方法,而只有一个由/在子类中定义,两者之间的区别是什么。 根据重写原则,子类对象不应该自动使用子类方法吗?如果没有相应的超类方法,子类对象将始终使用子类方法。 创建一个抽象方法的目的是什么,而不是仅仅创建一个没有超类对应物的标准方法 我的知识可能完全有缺陷,扭曲了我的看法:-) 非常感谢所有帮助超类可以通过抽象方法将其部分职责委托给子

最近我读到一个抽象方法本质上创建了一个标记为继承的方法,它是无块的,等待子类专门化。那么我问这个, 创建一个抽象方法,允许其继承,创建一个子类版本,但没有相应的超类方法,而只有一个由/在子类中定义,两者之间的区别是什么。 根据重写原则,子类对象不应该自动使用子类方法吗?如果没有相应的超类方法,子类对象将始终使用子类方法。 创建一个抽象方法的目的是什么,而不是仅仅创建一个没有超类对应物的标准方法

我的知识可能完全有缺陷,扭曲了我的看法:-)
非常感谢所有帮助

超类可以通过抽象方法将其部分职责委托给子类。这样做的好处是,超类将只包含通用的可重用逻辑,实现的更具体细节将从继承树向下推送到子类

在这种情况下,超类可能仍然需要访问一些方法,就好像它们已经实现了一样。这就是为什么您需要在超类中定义抽象的无体方法——否则它将无法引用它们

例如,超类可以处理数据处理,而具体的子类可以处理来自不同来源的数据输入。在这种情况下,超类和子类可能如下所示:

class DataProcessor {
    public void doWork() {
        Data data = readData();

        processData(data);
    }

    public abstract Data readData();  // this method is here and marked as abstract to make sure that:
                                      // 1. child classes never fail to implement it;
                                      // 2. parent class have a possibility to refer to the method that he is not actually implementing;
                                      // 3. users of parent class have a possibility to refer to the method that parent is not capable of implementing.
}

class FileSystemDataProcessor extends DataProcessor {
    public Data readData();
        // handle data reading from the file system
    }
}
这与,;一个类模仿另一个类的能力

以一个名为
Animal
的抽象类为例,它被子类化为
Dog
Fish
。如果在
Animal
类中我们有一个抽象方法
move()
,那么
Dog
Fish
都将被迫实现
move()
方法

public class Animal {
    public abstract void move();
}

public class Dog extends Animal {
    public void move() {
        System.out.println("walk");
    }
}

public class Fish extends Animal {
    public void move() {
        System.out.println("swim");
    }
}
此外,如果我们在某处有一个helper方法:

public static void moveTheAnimal(Animal a) {
    a.move();
}
然后我们知道,无论提供什么具体的类(子类),都保证定义
move()
方法


另一方面,如果在
Animal
类中没有抽象方法
move()
,我们就需要
moveTheDog(狗d)
moveTheFish(鱼f)
等。对于每个可能的动物。

抽象方法的目的是告诉开发人员,您希望每个子类都有该方法的实现。下面是一个例子:

public class Animal {
    public abstract void move(); // you expect that every animal will be able to move
}

public class Bird extends Animal {
    @Override
    public void move() { ... }

    public void fly() { ... } // Birds can fly
}

public class Dog extends Animal {
    @Override
    public void move() { ... }
}

public class Pig extends Animal {
    public void oink();
} // COMPILE ERROR
然后,当你有一个函数接受一个
动物
对象时,你也意味着该函数不会做任何特定于
、或
猪的事情

如果在
Animal
超类中没有提供抽象方法声明,则该函数将不会编译,因为它不能保证其任何子类都有
move()
方法

public class Animal {
    public abstract void move();
}

public class Dog extends Animal {
    public void move() {
        System.out.println("walk");
    }
}

public class Fish extends Animal {
    public void move() {
        System.out.println("swim");
    }
}