什么是Java';s';自我';关键词

什么是Java';s';自我';关键词,java,php,oop,Java,Php,Oop,我试图在Java的抽象类中编写工厂方法(因此我希望它返回扩展类的新实例,而不是超类) 在PHP中,我会使用self关键字: abstract class Superclass { public static function factory($arg) { return new self($arg); } private function __construct($arg) {} abstract public function doSomet

我试图在Java的抽象类中编写工厂方法(因此我希望它返回扩展类的新实例,而不是超类)

在PHP中,我会使用
self
关键字:

abstract class Superclass {
    public static function factory($arg) {
        return new self($arg);
    }

    private function __construct($arg) {}

    abstract public function doSomething() {}
}

Java是否有一个像self这样的关键字,我可以使用它?

我认为在Java中不可能找到“当前”子类的名称。尤其是一些动态对象生成是不可能的


因此,您需要在每个子类中定义该静态函数;在Java中,静态方法的继承方式与非静态方法不同。子类将具有其超类的静态方法,但当它们执行时,它们将在超类的上下文中执行-因此,在静态方法中没有关键字可用于找出调用该方法的类

编辑:更精确的表述是,静态方法根本不被继承;但是,该语言允许我们使用
Subclass.foo()
调用静态方法
Superclass.foo()

基于您似乎想要实现的目标,您可能希望实现。大致是这样的:

public abstract class Superclass {}
public class SubclassA extends Superclass {}
public class SubclassB extends Superclass {}

public abstract class AbstractFactory {
    public abstract Superclass Create();
}

public class FactoryA extends AbstractFactory {
    public Superclass Create() {
        return new SubclassA();
    }
}

public class FactoryB extends AbstractFactory {
    public Superclass Create() {
        return new SubclassB();
    }
}
现在,您可以创建一个采用
AbstractFactory
的方法(实际上,它将是
FactoryA
FactoryB
)。在此对象上调用
Create()
,将生成
子类a
子类b


编辑:修复了编译错误(忘记让工厂扩展AbstractFactory)。

要实现这一点,您需要一些技巧。我能想到的一种方法是:

public static <T extends SuperClass> T factory(Class<T> clazz) {
    return clazz.newInstance();
}
公共静态T工厂(clazz类){
返回clazz.newInstance();
}

如果您必须您可以在静态上下文中使用此代码:

Class cls = new Object() { }.getClass().getEnclosingClass();
Object instance = cls.newInstance();

你的类需要一个空构造函数。

@Ross:也许-你需要在什么上下文中创建实例(为什么你需要这个方法而不是直接使用子类构造函数)?您是否曾经需要在不事先知道需要什么样的类的情况下创建实例?如果是这样,请参阅更新以获取关于抽象工厂模式的代码示例;否则,这种模式可能会有点过头了。:-)我明白了,关键是要让事情充满活力。@tada:请解释一下;我在哪里自相矛盾?(我提出抽象工厂模式是因为我认为他想要实现这一目标,但后来我意识到他可能有其他意图,所以我只想说明,这种模式只在某些情况下有用。或者你在考虑其他事情吗?@tada:啊;我想你指的是我对包含编译错误的答案的否决票;我现在已经修复了错误(至少是我能发现的错误)。