Java-返回静态方法的继承

Java-返回静态方法的继承,java,inheritance,static,classname,Java,Inheritance,Static,Classname,我读过很多帖子和文章,现在明白了静态方法不能被继承。为了解释我的问题,您可以查看以下代码: 主要类别: 其中一个子类: 因此,如果我需要在某个时间点预约联系人,我需要写: Contact contact=new Contact(); String id = contact.reserve(); 这很有效。但我发现这不是最优的。对我来说,第一行是完全无用的。我更喜欢写作: String id = Contact.reserve(); 代码会更干净,我猜它在运行时使用的资源会更少,因为它不必创建

我读过很多帖子和文章,现在明白了静态方法不能被继承。为了解释我的问题,您可以查看以下代码:

主要类别:

其中一个子类:

因此,如果我需要在某个时间点预约联系人,我需要写:

Contact contact=new Contact();
String id = contact.reserve();
这很有效。但我发现这不是最优的。对我来说,第一行是完全无用的。我更喜欢写作:

String id = Contact.reserve();
代码会更干净,我猜它在运行时使用的资源会更少,因为它不必创建我们真正不需要的Contact实例。但为此,我应该:

在每个子类中创建一个特定的reserve静态方法,并将其从主类中删除。我真的不认为它更好,因为我会在大量的类中拥有完全相同的代码; 或者在主类中设置reserve static,并允许它访问调用它的类名,这在java中似乎不可行。
我希望我的问题足够清楚。有没有办法处理这个问题?或者我应该保持原样吗?

不要把更少的代码行误认为更干净

代码会更干净,我猜它在运行时使用的资源会更少,因为它不必创建我们真正不需要的Contact实例

我不同意。很明显,您保留的是联系人对象,而不是类,因此对该类的实例调用reserve更有意义。当然,如果您想将其缩小到一行,您可以:

new Contact().reserve();
…这可能更清晰,也可能不清晰,具体取决于您是否需要重用contact对象。在这种情况下,不要陷入创建对象的开销中——好的样式更重要。除非你注意到这样的事情不够快,否则你就没有问题


简而言之,就从上面的代码来看,我觉得一切都很好。

不要把更少的代码误认为更干净

代码会更干净,我猜它在运行时使用的资源会更少,因为它不必创建我们真正不需要的Contact实例

我不同意。很明显,您保留的是联系人对象,而不是类,因此对该类的实例调用reserve更有意义。当然,如果您想将其缩小到一行,您可以:

new Contact().reserve();
…这可能更清晰,也可能不清晰,具体取决于您是否需要重用contact对象。在这种情况下,不要陷入创建对象的开销中——好的样式更重要。除非你注意到这样的事情不够快,否则你就没有问题


简而言之,就从上面的代码来看,我觉得事情的现状非常好。

如果都是关于冗余代码行,那么有什么问题:

String id = new Contact().reserve();
当然,每次调用都会创建一个联系人对象。如果这是不可接受的,那么为什么不使用单例:

String id = Contact.instance.reserve();

这将只创建一个联系人实例,并具有保留而不是静态的优点。

如果这都是关于冗余代码行,那么有什么问题:

String id = new Contact().reserve();
public class DataTable {
    //...

    public static String reserve(Class clazz) throws SQLException {    
        ......
        String query="insert into `" + clazz.getSimpleName() +"`() values ()";
        ........
        String key = ......
        .......
        return key;
    }
}
当然,每次调用都会创建一个联系人对象。如果这是不可接受的,那么为什么不使用单例:

String id = Contact.instance.reserve();
这将只创建一个联系人实例,并且具有保留而不是静态的优点

public class DataTable {
    //...

    public static String reserve(Class clazz) throws SQLException {    
        ......
        String query="insert into `" + clazz.getSimpleName() +"`() values ()";
        ........
        String key = ......
        .......
        return key;
    }
}
然后您可以像DataTable.reserveContact.class那样调用它


然后您可以像DataTable.reserveContact.class那样调用它

您的联系人已经扩展了DataTable,因此您在联系人处已经有了保留方法。现在可以重写该方法,甚至可以编写新方法

public class Contact extends DataTable {

   public String reserve() throws SQLException {
       super.reserve();
       System.out.println("I override the super class");
   }

}
如果您不扩展DataTable,那么您基本上将其视为一个实用程序,这样您的DataTable就具有类似于的签名

public class DataTable {
     public static String doReserve(String id, Date date) {
         // do your logic
     }
}

只需从Contact静态调用DataTable.doReserve方法

您的联系人已经扩展了DataTable,因此您在联系人处已经有了保留方法。现在可以重写该方法,甚至可以编写新方法

public class Contact extends DataTable {

   public String reserve() throws SQLException {
       super.reserve();
       System.out.println("I override the super class");
   }

}
如果您不扩展DataTable,那么您基本上将其视为一个实用程序,这样您的DataTable就具有类似于的签名

public class DataTable {
     public static String doReserve(String id, Date date) {
         // do your logic
     }
}

只需从Contact静态调用DataTable.doReserve方法

我真的不明白为什么您觉得它不是最优的:代码是干净的,如果需要特定的reserve实现,您可以创建Contact的子类。或者更好:将其作为一种实用方法,并传递所需的参数,而不是进行此类静态继承。我真的不明白为什么您认为它不是最佳的:代码是干净的,如果需要特定的保留实现,您可以创建Contact的子类。或者更好:将其作为实用方法,并传递所需的参数,而不是进行此类静态继承。