我对私有方法如何静态而且公共必须动态绑定有点困惑。
答案 0 :(得分:7)
动态绑定意味着在运行时决定运行哪些代码。这是多态性的基础。
公共,包访问和受保护的方法是动态绑定的。子类可以覆盖方法并提供替代实现。私有方法无法覆盖,因此不需要动态绑定。
静态方法不是动态绑定的(名称中的线索),因为它们是在类本身上定义的,而不是每个对象都是唯一的。
答案 1 :(得分:3)
动态绑定或后期绑定
动态绑定是指编译器无法解析调用且绑定仅在运行时完成的情况。让我们试着理解这一点。假设我们有一个名为SuperClass
的类,另一个名为SubClass
的类扩展了它。现在,SuperClass
引用也可以分配给SubClass
类型的对象。如果我们在someMethod()
中有一个方法(比如SuperClass
),我们会在SubClass
中覆盖,那么在SuperClass
引用上调用该方法只能在运行时解析因为编译器无法确定此引用在运行时将指向哪种类型的对象。
...
SuperClass superClass1 = new SuperClass();
SuperClass superClass2 = new SubClass();
...
superClass1.someMethod(); // SuperClass version is called
superClass2.someMethod(); // SubClass version is called
....
在这里,我们看到即使对象引用superClass1
和superClass2
都只是SuperClass
类型,但在运行时它们引用的类型为SuperClass和{{} 1}}分别。
因此,在编译时,编译器无法确定对这些引用上的方法SubClass
的调用是否实际引用了该方法的哪个版本 - 超类版本或子类版本。
因此,我们看到Java中的动态绑定只是绑定方法调用(只能继承方法,因为它们可以在子类中被覆盖,因此编译器可能无法确定要调用哪个版本的方法)基于实际对象类型而不是对象引用的声明类型。
静态绑定或早期绑定
如果编译器可以在编译时解析绑定,那么这种绑定称为静态绑定或早期绑定。所有实例方法调用总是在运行时解析,但所有静态方法调用都在编译时自行解析,因此我们对静态方法调用有静态绑定。因为静态方法是类方法,因此可以使用类名本身访问它们(实际上它们只是使用它们相应的类名而不是使用对象引用来使用)因此需要解析它们的访问权限在编译期间只使用编译时类型信息。这就是为什么静态方法实际上不能被覆盖的原因。阅读更多 - Can you override static methods in Java?
访问Java中的所有成员变量遵循静态绑定,因为Java不支持(事实上,它不鼓励)成员变量的多态行为。
[除了这个讨论,你不能覆盖 static (如上面的链接所提到的),Java中的 private 和 final 方法]
答案 2 :(得分:0)
静态方法是类级方法,因此您只能通过类名访问,但方法必须是公共的
答案 3 :(得分:0)
1。在类多态中,子类的对象引用变量作为参数传递
接受作为类型的对象引用变量的参数的方法
超类。Public and Protected and Default members can be dynamically bounded
,私人成员不是
不是继承的。
<强> 2。静态成员是针对类的,并且它不受任何单个对象的限制,所以不是 动态有界。
答案 4 :(得分:0)
如果您不需要this
方法中的private
引用,那么您也可以static
进行引用,它不会有任何区别。在任何一种情况下,private
方法永远不需要动态绑定,因此在实现级别,您选择的方式实际上是无关紧要的。但是,当您标记方法static
时,它有助于提供可读性,因为很明显该方法不依赖于对象的状态。