Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 在super()构造函数中获取子类名_Java_Oop - Fatal编程技术网

Java 在super()构造函数中获取子类名

Java 在super()构造函数中获取子类名,java,oop,Java,Oop,我有两个Java类teradatable和RdbmsTable- RdbmsTable.java的有用部分 public class RdbmsTable { public RdbmsTable(String uri, String type) { this.uri = uri; this.type = type; } public class TeradataTable extends RdbmsTable { public Tera

我有两个Java类
teradatable
RdbmsTable
-

RdbmsTable.java的有用部分

public class RdbmsTable {

    public RdbmsTable(String uri, String type) {
       this.uri = uri;
       this.type = type;
    } 
public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, "TERADATATABLE");
    }
teradatable.java的有用部分

public class RdbmsTable {

    public RdbmsTable(String uri, String type) {
       this.uri = uri;
       this.type = type;
    } 
public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, "TERADATATABLE");
    }
我需要在
super()。我不想使用硬编码字符串

我不能使用
this.getClass().getSimpleName().toUpperCase()
super()


是否有设计方面的问题?

如果您需要在
RdbmsTable
构造函数中使用该名称,请在那里使用
this.getClass().getSimpleName().toUpperCase()
(而不是
super
):

getClass
始终为您提供实例的实际类,无论从何处调用它。因此,在上面的
RdbmsTable
中,
this.getClass()
将为实例实际是什么类返回
Class
实例。如果它是
teradatable
实例,
this.getClass()
将返回
teradatable
类的引用(而不是
RdbmsTable

:

输出:

TERADATATABLE Teradata表
但我认为最好使用注释或类似的方法来参数化它,以防您需要使用与类名不完全匹配的名称。

如果您需要在
RdbmsTable
构造函数中使用该名称,请在那里使用
this.getClass().getSimpleName().toUpperCase()(而不是
super
):

getClass
始终为您提供实例的实际类,而不管您从何处调用它。因此,在上面的
RdbmsTable
中,
this.getClass()
将返回实例实际为的任何类的
class
实例。如果它是
teradatable
实例,
this.getClass()
将返回对
teradatable
(非
RdbmsTable
)的
类的引用

:

输出:

TERADATATABLE Teradata表
但我认为最好使用注释或类似的方法来参数化它,以防您需要使用与类名不完全匹配的名称。

这对您有用吗


public class TeradataTable extends RdbmsTable {

    public TeradataTable(String uri) {
        super(uri, TeradataTable.class.getSimpleName().toUpperCase());
    }
  • 它不需要“这个”
  • 它只是您方法的静态版本
  • 如果重构类名,它仍然会更新
  • 您可以保持其他代码不变

    • 这对你有用吗

      
      public class TeradataTable extends RdbmsTable {
      
          public TeradataTable(String uri) {
              super(uri, TeradataTable.class.getSimpleName().toUpperCase());
          }
      
      • 它不需要“这个”
      • 它只是您方法的静态版本
      • 如果重构类名,它仍然会更新
      • 您可以保持其他代码不变

      “我不能在
      super()
      中使用
      这个.getClass().getSimpleName().toUpperCase();
      为什么不呢?这就是你所要求的。但是你不需要在
      super()中使用它。”
      ;您可以在基类中执行。@T.J.Crowder我需要输入子类的名称。还有其他类也类似于OracleTable、NetezzaTableYes。和?这就是
      this.getClass().getSimpleName()
      将提供给您的。需要注意的关键问题(可能会混淆OP)是,如果调用
      this.getClass()
      在基类中,它将在运行时返回类名。这将是子类而不是基类。也许OP认为它将返回基类。@AR.3你是对的。我明白你的意思。“我不能在
      super()
      中使用
      This.getClass().getSimpleName().toUpperCase();
      ”为什么不呢?这就是你所要求的。但是你不需要在
      super()
      中这样做;你可以在基类中这样做。@t.J.Crowder我需要输入子类的名称。还有其他类也像OracleTable,NetezzaTableYes。还有?这就是
      this.getClass().getSimpleName()
      将给你的。需要注意的关键点(这可能会让OP感到困惑)如果调用
      this.getClass()
      在基类中,它将在运行时返回类名。这将是子类而不是基类。也许OP认为它将返回基类。@AR.3你是对的。我明白了你的意思。谢谢你的澄清。谢谢你的澄清。