2012-07-19 64 views
2

我“马云对私有方法怎么能是静态的,但公众必须动态绑定。解释动态绑定和静态方法

+0

你的问题不明确(AT-至少对我来说),你可以添加更多的细节? – kosa 2012-07-19 17:46:48

+1

修饰符'private','public'和'protected'意味着可见性。他们不得不与绑定无关。你的问题是什么意思? – Lion 2012-07-19 17:51:14

+0

我同意thinksteep。在发布这样的问题时,最好的做法是在每个案例中至少包含一个示例代码片段(这里有3个片段,您尝试做什么,哪些不起作用,静态案例和动态案例)。您提供的例子和细节越多,您将收到的质量更好的答案。 – retrohacker 2012-07-19 17:54:00

回答

7

动态绑定意味着哪个代码运行的决定是在运行时做有点困惑。这是多态的基础。

公众,包访问和保护的方法是动态绑定的。子类可以覆盖的方法,并提供替代实现。私有方法不能被覆盖,因此动态绑定不需要他们。

静态方法不会动态绑定(名称中的线索) ),因为它们是在类本身上定义的,而不是每个对象都是唯一的。

+0

+1这是正确的答案。 Dynamism在运行时受到限制,静态方法隐藏了实现。 – kosa 2012-07-19 18:02:50

+3

你从哪里得到“包访问方法不能被覆盖”?这显然是错误的。 – 2012-07-19 18:31:51

+0

这是一个错误。感谢您的更新。 – 2012-07-19 19:50:14

0

静态方法是类水平的方法以便ü只能通过类名访问,但方法必须是公共

+0

静态方法不必是公开的,但如果它们是私有的,它们只能被同一类的其他静态方法访问...... – 2012-07-20 04:14:07

0

1.类多态性,子类的对象参考变量作为一个传递参数 与接受参数的方法有关,该参数是 类型的对象参考变量超类Public and Protected and Default members can be dynamically bounded,私人会员不是 不会继承

2.静态成员是针对类的,它不受限于对任何单个对象,所以它不是 动态绑定。

0

如果你不需要在private方法中使用this引用,那么你也可以使它成为static,它不会有任何区别。方法在任何情况下都不需要动态绑定,因此在实现级别,它与您选择的实际上无关。尽管如此,当您标记方法static时,它仍然有助于可读性,因为它很清楚该方法不依赖于对象的状态。

3

动态绑定或后期绑定

动态绑定指的是编译器不能够解决的呼叫,并且绑定是仅运行时完成的情况。我们试着理解这一点。假设我们有一个名为SuperClass的类,而另一个名为​​的类扩展了它。现在可以将SuperClass引用分配给​​类型的对象。如果我们在SuperClass中有一个方法(例如someMethod()),我们在​​中覆盖该方法,那么SuperClass引用上该方法的调用只能在运行时解析,因为编译器无法确定此引用的对象类型在运行时指向。

... 
SuperClass superClass1 = new SuperClass(); 
SuperClass superClass2 = new SubClass(); 
... 

superClass1.someMethod(); // SuperClass version is called 
superClass2.someMethod(); // SubClass version is called 
.... 

在这里,我们可以看到,即使两个对象引用superClass1superClass2SuperClass类型的唯一,但在运行时,它们分别指类型父类和​​的对象。

因此,在编译时,编译器无法确定对这些引用的方法someMethod()的调用是否实际引用了该方法的哪个版本 - 超类版本或子类版本。

因此,我们发现Java中的动态绑定只是绑定了方法调用(继承方法只是因为它们可以在子类中被重写,因此编译器可能不确定调用哪个版本的方法)实际的对象类型而不是对象引用的声明类型。


静态绑定或早期绑定

如果编译器能够解决在编译时绑定只有这样的结合被称为静态绑定或早期绑定。所有实例方法调用总是在运行时解析的,但所有静态方法调用都是在编译时本身解析的,因此我们有静态方法调用的静态绑定。由于静态方法是类方法,因此它们可以使用类名本身进行访问(事实上,它们被封装为仅使用其对应的类名称而不是使用对象引用),因此需要解析对它们的访问在编译期间只使用编译时间类型信息。这就是静态方法实际上无法被重写的原因。阅读更多 - Can you override static methods in Java?

访问Java中的所有成员变量遵循静态绑定,因为Java不支持(实际上,它阻止)成员变量的多态行为。

[除了这个讨论中,不能覆盖静态私人和Java中最后方法(如通过上面的链接提到)。]