Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重载与继承_Java_Oop - Fatal编程技术网

Java 重载与继承

Java 重载与继承,java,oop,Java,Oop,假设我有这些类: class A {} class B extends A {} 也 我得到的输出是:AA 在我期待的时候:AB 我想知道为什么 我想知道为什么 因为引用类型是A 重载方法在编译时绑定。所以在编译时 只有编译器知道类A的方法将作为 参考变量b的类型为A 始终记住,要调用的重载方法是在 基于变量引用类型的编译时间 稍微解释一下 A b = new B(); 这一行表示引用变量b引用类b的对象,但它的类型是A,根据上面的规则,编译器在编译时只知道要调用的call方法应该属于类

假设我有这些类:

class A {}
class B extends A {}

我得到的输出是:AA

在我期待的时候:AB

我想知道为什么

我想知道为什么

  • 因为引用类型是
    A
  • 重载方法在编译时绑定。所以在编译时 只有编译器知道类A的方法将作为 参考变量
    b
    的类型为
    A
  • 始终记住,要调用的重载方法是在 基于变量引用类型的编译时间
稍微解释一下

A b = new B();
这一行表示引用变量
b
引用类
b
的对象,但它的类型是
A
,根据上面的规则,编译器在编译时只知道要调用的
call
方法应该属于类
A

编辑:如Subhrajyoti所建议。 正如Subhrajyoti正确地说的,这是编译时多态性

我想知道为什么

  • 因为引用类型是
    A
  • 重载方法在编译时绑定。所以在编译时 只有编译器知道类A的方法将作为 参考变量
    b
    的类型为
    A
  • 始终记住,要调用的重载方法是在 基于变量引用类型的编译时间
稍微解释一下

A b = new B();
这一行表示引用变量
b
引用类
b
的对象,但它的类型是
A
,根据上面的规则,编译器在编译时只知道要调用的
call
方法应该属于类
A

编辑:如Subhrajyoti所建议。 正如Subhrajyoti所说,这是编译时多态性

重载调用绑定是在编译类型上使用静态类型完成的 Java使用静态类型引用类型在编译时决定重载调用,而不使用运行时类型

因此,由于
b
的静态类型是
A
,因此调用接受参数
A
的方法

call(b)//现在编译器看到引用类型是A

因此,使用
call(A)
not
call(B)

重载调用绑定是在编译类型下使用静态类型完成的 Java使用静态类型引用类型在编译时决定重载调用,而不使用运行时类型

因此,由于
b
的静态类型是
A
,因此调用接受参数
A
的方法

call(b)//现在编译器看到引用类型是A


因此,将此调用与
调用(A)
调用(B)
绑定变量
B
的类型为
A
。静态方法是在声明的变量类上调用的,而不是在它的实际运行时内容上调用的,因此
call(b)
被绑定为
call(ab)
变量
b
的类型是
a
。静态方法是在声明的变量类上调用的,而不是在它的实际运行时内容上调用的,因此
call(b)
被绑定为
call(ab)
对于没有多态性的静态方法。静态方法绑定到类。如果引用了
A
,则可以从
A

中为没有多态性的静态方法校准静态方法。静态方法绑定到类。如果您有对
A
的引用,那么您可以从
A

中调用静态方法,您期望的是方法重写。在这种情况下,这两个调用方法应该是不同类的一部分,一个在父类中,一个在子类中,在这种情况下,两个方法签名应该完全相同/匹配

另外,由于您的方法是静态的,所以您应该记住静态方法不会被重写。不过,您可以在子类中使用相同的签名和名称编写静态方法,但这将被称为方法隐藏


当您调用重写的方法时,根据引用变量引用的对象类型,在运行时将方法调用绑定到其定义。

您期望的是方法重写。在这种情况下,这两个调用方法应该是不同类的一部分,一个在父级,一个在子级,在这种情况下,两个方法签名应该完全相同/匹配

另外,由于您的方法是静态的,所以您应该记住静态方法不会被重写。不过,您可以在子类中使用相同的签名和名称编写静态方法,但这将被称为方法隐藏


当您调用重写的方法时,根据引用变量引用的对象类型,在运行时将方法调用绑定到其定义。

按照惯例,不建议在此类方法中使用静态字段以提高可读性。正如你看到的,你有些困惑


使用像这样的所有静态字段“A.call(some variable)”而不是“new A().call(some variable)”。

按照惯例,不建议在此类手册中使用静态字段以提高可读性。正如你看到的,你有些困惑


使用像“A.call(some variable)”这样的所有静态字段,而不是“new A().call(some variable)”。

@sureshatta,谢谢您的编辑。现在是编译时polymorphism@JunedAhsan您的评论可能与我的重复..:D@MarounMaroun我在某个地方读到“伟人所见略同”:-p;-)@SubhrajyotiMajumder感谢您提供准确的术语,编辑了答案:)@sureshatta,感谢您的编辑。现在是编译时polymorphism@JunedAhsan您的评论可能与我的重复..:D@MarounMaroun我在什么地方读过书