什么是Java的“自我”关键字

时间:2011-05-26 22:18:45

标签: 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 doSomething() {}
}

Java是否有self这样的关键字可用于此?

4 个答案:

答案 0 :(得分:8)

没有;在Java中,静态方法的继承方式与非静态方法的继承方式不同。子类将具有其超类的静态方法,但是当它们执行时,它们将在超类的上下文中执行 - 因此没有可以在静态方法中使用的关键字来找出调用该方法的类。

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

根据您似乎想要实现的目标,您可能希望实现Abstract Factory pattern。它大概是这样的:

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的方法(实际上,它将是FactoryAFactoryB。在此对象上调用Create()将生成SubclassASubclassB

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

答案 1 :(得分:3)

如果您绝对必须,则可以使用此代码形成静态上下文:

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

你的班级需要一个无效的构造函数。

答案 2 :(得分:2)

你需要一些黑客来实现这一目标。我能想到的一种方法是:

public static <T extends SuperClass> T factory(Class<T> clazz) {
    return clazz.newInstance();
}

答案 3 :(得分:0)

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

所以你需要在每个子类中定义静态函数。