java 中对多态性概念的混淆
Confusion over polymorphism concept in java
我对 java 中的多态性概念有点困惑,因为不同的作者写法不同。
案例-1
动态(运行时)多态性---方法重载和使用实例方法覆盖方法是动态多态性的例子。
静态(编译时)多态性---使用静态方法的方法重载和方法覆盖;使用私有或最终方法覆盖的方法是静态多态性的例子
案例二
方法重载是编译time/static多态
的一个例子
方法覆盖是运行 time/dynamic 多态性
的一个例子
所以哪种情况是正确的???
并且 java 支持静态或动态多态性?
编译时重载。
覆盖是在运行时。
所以情况2是正确的。
情况2正确
方法覆盖 - 运行 时间多态性
方法重载 - 编译时多态性
编译时 和运行时 多态性与调用解析 的时间直接相关。
在编译时多态性中,调用在编译时解析。方法重载是编译时多态性的一个例子。重载 无关 是在实例级别还是 class 级别
示例:
public class Sample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
public static void main(String args[]) {
System.out.println(doSomething(null)); // "compilation" error . Ambiguous call. Both InputStream and OutputStream can take `null` argument.
}
}
接下来,运行时多态性:这里调用/方法签名在编译期间检查是否存在,但实际调用在编译期间解析运行。
示例:
class ParentOfSample {
void testingOverriding(String s) {
System.out.println("Parent..");
}
}
public class Sample extends ParentOfSample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
void testingOverriding(String s) {
System.out.println("Sample..");
}
public static void main(String args[]) {
ParentOfSample s = new Sample();
s.testingOverriding(null);
}
}
O/P :
样本。请注意,在重写期间,方法签名是相同的。
所以,底线是:第二种情况是正确的。 Java 同时支持 static 和 dynamic 多态性。
基本上方法重载是静态绑定,你也可以说是早期绑定。因为编译器在编译时只能识别你实际想要调用的方法。
Method Overriding 是动态绑定或后期绑定,其中 JVM 将仅在 运行 时间识别方法调用(取决于 Base class 引用指向哪个Child class object).
你可以检查这个方法过载:
class OverLoadedClass{
int x;
int y;
public void display(int x)
{
System.out.println(x);
}
public void display(int x,int y)
{
System.out.println(x+""+y);
}
}
public class Test{
public static void main(String args[]){
OverLoadedClass o= new OverLoadedClass();
o.display(5);
o.display(5,10);
}
}
你可以检查这个方法覆盖:
class Base{
int x;
public void display(int x)
{
System.out.println(x);
}
}
class Child extends Base{
int x;
public void display(int x)
{
System.out.println(x);
}
}
public class Test{
public static void main(String args[]){
Base o= new Child();
o.display(5);
}
}
我对 java 中的多态性概念有点困惑,因为不同的作者写法不同。
案例-1
动态(运行时)多态性---方法重载和使用实例方法覆盖方法是动态多态性的例子。
静态(编译时)多态性---使用静态方法的方法重载和方法覆盖;使用私有或最终方法覆盖的方法是静态多态性的例子
案例二
方法重载是编译time/static多态
的一个例子方法覆盖是运行 time/dynamic 多态性
的一个例子所以哪种情况是正确的??? 并且 java 支持静态或动态多态性?
编译时重载。 覆盖是在运行时。 所以情况2是正确的。
情况2正确
方法覆盖 - 运行 时间多态性
方法重载 - 编译时多态性
编译时 和运行时 多态性与调用解析 的时间直接相关。
在编译时多态性中,调用在编译时解析。方法重载是编译时多态性的一个例子。重载 无关 是在实例级别还是 class 级别
示例:
public class Sample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
public static void main(String args[]) {
System.out.println(doSomething(null)); // "compilation" error . Ambiguous call. Both InputStream and OutputStream can take `null` argument.
}
}
接下来,运行时多态性:这里调用/方法签名在编译期间检查是否存在,但实际调用在编译期间解析运行。 示例:
class ParentOfSample {
void testingOverriding(String s) {
System.out.println("Parent..");
}
}
public class Sample extends ParentOfSample {
static void doSomething(InputStream is) {
System.out.println("is");
}
static void doSomething(OutputStream os) {
System.out.println("os");
}
void testingOverriding(String s) {
System.out.println("Sample..");
}
public static void main(String args[]) {
ParentOfSample s = new Sample();
s.testingOverriding(null);
}
}
O/P : 样本。请注意,在重写期间,方法签名是相同的。
所以,底线是:第二种情况是正确的。 Java 同时支持 static 和 dynamic 多态性。
基本上方法重载是静态绑定,你也可以说是早期绑定。因为编译器在编译时只能识别你实际想要调用的方法。
Method Overriding 是动态绑定或后期绑定,其中 JVM 将仅在 运行 时间识别方法调用(取决于 Base class 引用指向哪个Child class object).
你可以检查这个方法过载:
class OverLoadedClass{
int x;
int y;
public void display(int x)
{
System.out.println(x);
}
public void display(int x,int y)
{
System.out.println(x+""+y);
}
}
public class Test{
public static void main(String args[]){
OverLoadedClass o= new OverLoadedClass();
o.display(5);
o.display(5,10);
}
}
你可以检查这个方法覆盖:
class Base{
int x;
public void display(int x)
{
System.out.println(x);
}
}
class Child extends Base{
int x;
public void display(int x)
{
System.out.println(x);
}
}
public class Test{
public static void main(String args[]){
Base o= new Child();
o.display(5);
}
}