创建对象时调用的方法

时间:2018-10-20 16:19:03

标签: java object

创建类似的对象时 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。对象的创建是相同的,但输出是不同的。为什么这样?

1 个答案:

答案 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
  }
}