Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 有没有办法实施';抽象类方法&x27;在爪哇?_Java - Fatal编程技术网

Java 有没有办法实施';抽象类方法&x27;在爪哇?

Java 有没有办法实施';抽象类方法&x27;在爪哇?,java,Java,更新: 我知道静态方法不能是抽象的,我知道为什么,这不是一个像“是否可能”或“为什么不可能”这样的问题,我只是想知道是否有办法得到我想要的 好的,如果您听说过python中的@classmethod,那么您可以跳过其余部分 我想要的是:在某些情况下,有些方法只是函数,我只需要它的功能。但是,在Java中,您必须将所有内容都放在一个类中,因此我必须将这些函数封装在一个类中,并将它们设置为静态。问题是,对于像这样的类,我不需要,也不应该需要它的任何实例。同时,我希望像这样的类有一些层次结构。这里的层

更新: 我知道静态方法不能是抽象的,我知道为什么,这不是一个像“是否可能”或“为什么不可能”这样的问题,我只是想知道是否有办法得到我想要的

好的,如果您听说过python中的@classmethod,那么您可以跳过其余部分

我想要的是:在某些情况下,有些方法只是函数,我只需要它的功能。但是,在Java中,您必须将所有内容都放在一个类中,因此我必须将这些函数封装在一个类中,并将它们设置为静态。问题是,对于像这样的类,我不需要,也不应该需要它的任何实例。同时,我希望像这样的类有一些层次结构。这里的层次结构类似于一些“控制”:我可以控制子类来完成您应该做的事情,也就是您应该拥有的方法/函数


众所周知,我们不能在类中声明
静态抽象
方法

但是,有时您只需要方法而不需要实例,并且需要方法是抽象的并在子类中实现它

一些人指出了这一点,但是有什么可能的解决办法吗?

不,你不能
主要是因为“抽象”和“静态”方法的术语相互矛盾。 请参见此处的详细说明:

您的静态方法不能是抽象的,但您可以使用功能接口,预定义的接口如,甚至很可能满足您的所有需求,以下是预定义接口的列表:


如果这些不符合您的需求,您可以因此能够传递任意方法引用。。。请务必始终检查null,尽管静态方法不能声明为抽象,因为重写(子类型多态性)不适用于静态方法。如果需要解决方法,这里有一个:

public void myMainFunction() {
    ArrayList<Animal> animals = new ArrayList<Animal>();
    animals.add(AnimalFactory.createAnimal(Bird.class,birdXML));
    animals.add(AnimalFactory.createAnimal(Dog.class,dogXML));
}

public abstract class Animal {
    /**
     * Every animal subclass must be able to be created from XML when required
     * (E.g. if there is a tag <bird></bird>, bird would call its 'createFromXML' method
     */
    public abstract Animal createFromXML(String XML);
}

public class Bird extends Animal {
    @Override
    public Bird createFromXML(String XML) {
    // Implementation of how a bird is created with XML
    }
} 

public class Dog extends Animal {
    @Override
    public Dog createFromXML(String XML) {
    // Implementation of how a dog is created with XML
    }
}

public class AnimalFactory{
    public static <T extends Animal> Animal createAnimal(Class<T> animalClass, String xml) {
      // Here check class and create instance appropriately and call createFromXml
      // and return the cat or dog
    }
}
public void mymain函数(){

ArrayList

你想用它做什么?不。将静态方法标记为抽象是没有意义的。方法的重写基于对象(实例),而不是类型本身。静态方法仅依赖于类型,而不依赖于任何特定实例。为什么不直接调用
MyabstractClass.someMethod()
?您现在无法创建一个
抽象类的实例,因此我现在可以确定您希望添加
静态
的操作会有所不同,或者您正在尝试做的事情会有所不同。顺便说一句,如果您只需要抽象方法,接口可能是一个更好的选择。这对我来说似乎是一个XY问题。您想做什么精神上?