在java中实例化子类
我有一个这样的抽象类:在java中实例化子类,java,abstract-class,subclass,Java,Abstract Class,Subclass,我有一个这样的抽象类: public abstract class MyAbstractClass { protected String greeting; public void run() { doSomething(); } public abstract void doSomething(); } public class MyClass extends MyAbstractClass { public MyClass()
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
}
public class MyClass extends MyAbstractClass {
public MyClass() {
this.greeting = "Hello, World!";
}
public void doSomething() {
System.out.println(greeting);
}
public static void main(String[] args) {
MyAbstractClass c = new MyClass();
c.run();
}
}
。。。还有这样一个子类:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
}
public class MyClass extends MyAbstractClass {
public MyClass() {
this.greeting = "Hello, World!";
}
public void doSomething() {
System.out.println(greeting);
}
public static void main(String[] args) {
MyAbstractClass c = new MyClass();
c.run();
}
}
我将创建多个子类,所有子类都将使用相同的主方法来实例化子类。有没有一种更简洁的方法来编写它,这样我就不需要用不同的子类名称在每个子类中复制main方法了?因此,如果我创建一个名为MyOtherClass
的新子类,我不需要在MyAbstractClass c=new MyOtherClass()中放入main方法代码>
我想我可以反过来做,从抽象类运行main并实例化其中的子类,但是每次我想更改实例化的子类时,我显然需要在new
之后更改类名。我想我要寻找的是一种在抽象类中定义main方法的方法,当我运行子类时,它会实例化子类的一个副本,而不是抽象类。如果这有道理的话…这似乎是一个很好的选择。试着这样做:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
public abstract MyAbstractClass makeClass();
}
public class MyClass1 extends MyAbstractClass {
public MyClass1() {
this.greeting = "Hello, World!";
}
@Override
public void doSomething() {
System.out.println(greeting);
}
@Override
public MyAbstractClass makeClass() {
return new MyClass1();
}
}
public static void main(String[] args) throws Exception {
String className = args[0];
MyAbstractClass object = (MyAbstractClass) Class.forName(className).newInstance();
object.run();
}
然后,当您需要创建一个特定的实例时,只调用一个实现在您认为最方便的地方的<代码>主体()//>代码> >代码> >,例如在<代码> MyAbstractClass < /代码>:
MyAbstractClass mac = new MyClass1();
MyAbstractClass obj = mac.makeClass();
最后一行将根据用于实例化具体对象的类返回一个适当的实例。这似乎非常适合于。试着这样做:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
public abstract MyAbstractClass makeClass();
}
public class MyClass1 extends MyAbstractClass {
public MyClass1() {
this.greeting = "Hello, World!";
}
@Override
public void doSomething() {
System.out.println(greeting);
}
@Override
public MyAbstractClass makeClass() {
return new MyClass1();
}
}
public static void main(String[] args) throws Exception {
String className = args[0];
MyAbstractClass object = (MyAbstractClass) Class.forName(className).newInstance();
object.run();
}
然后,当您需要创建一个特定的实例时,只调用一个实现在您认为最方便的地方的<代码>主体()//>代码> >代码> >,例如在<代码> MyAbstractClass < /代码>:
MyAbstractClass mac = new MyClass1();
MyAbstractClass obj = mac.makeClass();
最后一行将根据用于实例化具体对象的类返回适当的实例。这是动态类加载的有用之处。如果您的所有子类都同意使用无参数构造函数,则只需将单个主类与Main方法一起使用,并将该类作为参数传递:
java com.foo.bar.Main com.foo.bar.MyFrouteenthSubclass
java com.foo.bar.Main fourteen
主要方法如下所示:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
public abstract MyAbstractClass makeClass();
}
public class MyClass1 extends MyAbstractClass {
public MyClass1() {
this.greeting = "Hello, World!";
}
@Override
public void doSomething() {
System.out.println(greeting);
}
@Override
public MyAbstractClass makeClass() {
return new MyClass1();
}
}
public static void main(String[] args) throws Exception {
String className = args[0];
MyAbstractClass object = (MyAbstractClass) Class.forName(className).newInstance();
object.run();
}
您还可以为所有子类指定一个名称,并将每个子类的实例存储在映射中
,只需使用类的名称作为参数调用主类即可:
java com.foo.bar.Main com.foo.bar.MyFrouteenthSubclass
java com.foo.bar.Main fourteen
这是动态类加载非常有用的地方。如果您的所有子类都同意使用无参数构造函数,则只需将单个主类与Main方法一起使用,并将该类作为参数传递:
java com.foo.bar.Main com.foo.bar.MyFrouteenthSubclass
java com.foo.bar.Main fourteen
主要方法如下所示:
public abstract class MyAbstractClass {
protected String greeting;
public void run() {
doSomething();
}
public abstract void doSomething();
public abstract MyAbstractClass makeClass();
}
public class MyClass1 extends MyAbstractClass {
public MyClass1() {
this.greeting = "Hello, World!";
}
@Override
public void doSomething() {
System.out.println(greeting);
}
@Override
public MyAbstractClass makeClass() {
return new MyClass1();
}
}
public static void main(String[] args) throws Exception {
String className = args[0];
MyAbstractClass object = (MyAbstractClass) Class.forName(className).newInstance();
object.run();
}
您还可以为所有子类指定一个名称,并将每个子类的实例存储在映射中
,只需使用类的名称作为参数调用主类即可:
java com.foo.bar.Main com.foo.bar.MyFrouteenthSubclass
java com.foo.bar.Main fourteen
为什么在每个子类中都需要main
方法?你知道main
方法的目的是什么吗?嗯……实际上只有一个main
运行,所以也许你应该将所有的子类实例化压缩成一个驱动程序类(一个只有main
的类)?抽象类具有执行I/O等常见操作的功能。每个子类处理输入的方式不同。因此,我将针对特定的输入运行子类。static
方法不能被重写。它只能重新定义。为什么在每个子类中都需要main
方法?你知道main
方法的目的是什么吗?嗯……实际上只有一个main
运行,所以也许你应该将所有的子类实例化压缩成一个驱动程序类(一个只有main
的类)?抽象类具有执行I/O等常见操作的功能。每个子类处理输入的方式不同。因此,我将针对特定的输入运行子类。static
方法不能被重写。它只能被重新定义,我想我想要摆脱的是在每个子类中都有一个通用的方法,它做的事情完全相同,但是子类的名称不同。您的示例只是将问题从main
转移到makeClass()
@conorgriffin是的,它将责任从一个地方转移到另一个地方-但没有逃避,在某些地方需要实例化对象,将此代码放在每个子类中是有意义的;另一方面,Java应用程序只能有一个main()
方法,因此有必要去掉多个main()
方法。好的,这些子类中的每一个子类都是一个应用程序。它们实际上是解决编程难题的小程序。它们有一些共同的功能,比如读取输入文件和编写输出,所以我将这些功能保留在抽象类中,并将特定于问题的逻辑放在子类中。因此,它们现在都有自己的main,所以我可以在isolation中运行它们。我想我真正想摆脱的是,在每个子类中都有一个通用的方法,它做的事情完全相同,但子类名称不同。您的示例只是将问题从main
转移到makeClass()
@conorgriffin是的,它将责任从一个地方转移到另一个地方-但没有逃避,在某些地方需要实例化对象,将此代码放在每个子类中是有意义的;另一方面,Java应用程序只能有一个main()
方法,因此有必要去掉多个main()
方法。好的,这些子类中的每一个子类都是一个应用程序。它们实际上是解决编程难题的小程序。它们有一些共同的功能,比如读取输入文件和编写输出,所以我将这些功能保存在抽象类和pu中