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的子类。或者更好:将其作为实用方法,并传递所需的参数,而不是进行此类静态继承。