下面示例中的实用方法仅用于说明目的。
import java.sql.Timestamp;
import java.util.Date;
public class DynamicMethodDispatchEx {
public static void main(String[] args) {
Timestamp now = new Timestamp(System.currentTimeMillis());
Timestamp beforeNow = new Timestamp(now.getTime() - 1);
System.out.println("Finding newest in " + now + " and " + beforeNow);
System.out.println("Attempt 1: " + staticFindNewer(beforeNow, now));
System.out.println("Attempt 2: " + staticFindNewer(now, beforeNow));
}
public static Date staticFindNewer(Date one, Date two) {
if (one.after(two)) {
return one;
} else {
return two;
}
}
}
Finding newest in 2016-08-23 17:56:36.375 and 2016-08-23 17:56:36.374
Attempt 1: 2016-08-23 17:56:36.375
Attempt 2: 2016-08-23 17:56:36.374 // <---
经过一些调查,我发现java.util.Date.After(Date)
在staticfindnewer()
中被调用,尝试1和尝试2中的差异是由于使用Date的方法造成的精度损失。
然而,我对动态调度感到困惑。我期望调用Timestamp#after(Timestamp)
,但调用的是Date#after(Date)
。我认为实例-方法调度总是基于运行时对象。我是不是错过了一些愚蠢的东西(很可能)?
我期望调用Timestamp#after(Timestamp)
,但调用的是Date#after(Date)
。我认为实例-方法调度总是基于运行时对象。
动态分派只发生在被调用的对象上,而不发生在参数上。
因此调用将转到timestamp#after(Date)
(因为参数的编译时类型是Date
,而被调用方的运行时类型是timestamp
)。
不幸的是,timestamp
不重写此方法,因此它默认返回到Date#after(Date)
(这里不太好用)。
因此,必须确保直接调用Timestamp#after(Timestamp)
,或者使用Date#compareto(Date)
方法,该方法已正确实现(并在Timestamp
中重写)。
问题内容: 到处都写着静态方法不能被覆盖,但是当我尝试将访问说明符从public改为protected时,它给出了一个错误。例如 它说 无法降低继承方法的可见性 所以说这是遵循最重要的规则,为什么我们说foo在B类中没有被忽略?为什么我们说它是隐藏/阴影而不是覆盖? 问题答案: 它 遵循 与覆盖 相同 的 一些规则 ,但这并不意味着它 被 覆盖。在这种情况下,这就是JLS的8.4.8.3节 “覆盖
问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是
问题内容: Java main()方法的方法签名为: 此方法是否有理由是静态的? 问题答案: 该方法是静态的,因为否则会产生歧义:应调用哪个构造函数?特别是如果你的班级是这样的: JVM应该调用吗?它应该做什么x? 如果不是,JVM是否应该在不运行任何构造方法的情况下实例化?我认为不应该这样,因为这将对整个类进行特殊处理-有时你有一个尚未初始化的实例,并且必须在每个可以调用的方法中进行检查。 对于
问题内容: 在上面的程序中,我尝试调用 aObj.b时 遇到错误。 1.为什么我无法通过aObj访问该变量,尽管它引用的是B类? 2.为什么我可以使用show()方法? 问题答案: 你有区分 静态类型 的和 运行时类型 的。 代码如 产生具有静态类型和运行时类型的变量。 在决定允许或不允许的内容时,编译器也只会考虑 静态类型 。 对您的问题: 1.为什么我无法通过aObj访问该变量,尽管它引用的是
在许多语言中,例如Java和JavaScript,静态关键字指的是类方法或类变量。 为什么叫'静态'方法?为什么不叫'蓝色'方法?或者'全局'方法? 关键字从何而来?那个面额的来源是什么? 和编译器有关吗?
根据我的理解,如果子例程不作用于类的实例(其作用仅限于显式输入/输出),则它是;如果子例程作用于类的实例,则它是(它可能会对实例产生副作用,使其不纯)。 关于这个话题,这里有一个很好的讨论。请注意,根据接受答案的定义,静态实际上应该是一个函数,因为实例从不隐式传递,而且它不能访问任何实例的成员。 不过,考虑到这一点,静态实际上不应该是函数吗? 我想确保我使用了正确的措辞。 有人能澄清一下吗?