创建类似的对象时
Base b=new Derived();
有时它打印基类中的值,有时它打印派生类中的值。根据代码,它会更改。这是如何工作的?
class Demo
{
int add(int a,int b)
{
return a+b;}}
class Base extends Demo
{
int add(int a,int b,int c)
{
return a+b+c;
}}
public class HelloWorld
{
public static void main(String []args){
Demo d=new Base();
System.out.println(d.add(2,3));
}}
当我们尝试打印d.add(2,3,4)时显示错误,但是
class Demo
{
int cal(int x)
{
return x+x;
}}
class Base extends Demo
{
int cal(int x)
{
return x+x+x;
}}
public class MyClass {
public static void main(String args[]) {
Demo d=new Base();
System.out.println(d.cal(5));
}}
在上面的代码中,它打印15。对象的创建是相同的,但输出是不同的。为什么这样?
答案 0 :(得分:1)
您的第一个示例Demo
类具有一个带有两个参数的方法,而继承的Base
具有一个带有三个参数的方法。让我们看看对此的解释。
您的代码中有一行,如下所示:
Demo d = new Base();
由于Java是一种静态类型的语言,因此编译器会在赋值的两个方面进行区别,将它们称为 static 和 dynamic类型。
在这种情况下,Demo
是静态类型,Base
是动态类型。
在编译期间,只有那些在静态类型中指定的方法对于编译器是可接受的。如果您重写Base
类型的继承方法,则在运行时将调用此方法,而不是您在Demo
中拥有的方法。这是动态绑定。
您有两种选择可以接近:
Demo
中的方法,您将看到动态绑定的结果。例如:
class Demo {
int add(int a,int b) {
return a+b;
}
}
class Base extends Demo {
int add(int a, int b) {
return 0;
}
int add(int a,int b,int c) {
return a+b+c;
}
}
public class HelloWorld {
public static void main(String []args) {
Demo d=new Base();
// System.out.println(d.add(2, 3, 4)); // compilation error
System.out.println(d.add(2,3)); // returns 0, dynamic binding
System.out.println(((Base)d).add(1, 2, 3)); // compiles and returns 6
}
}