Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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_Object - Fatal编程技术网

Java 创建对象时调用的方法

Java 创建对象时调用的方法,java,object,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(Str

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

您的第一个示例,
Demo
类有一个带两个参数的方法,继承的一个,
Base
有一个带三个参数的方法。让我们看看关于这一点的解释

代码中有一行代码,如下所示:

Demo d=newbase();
由于java是一种静态类型的语言,编译器会区分赋值的两个方面,称它们为静态类型和动态类型。
Demo
是静态类型在本例中,
Base
是动态类型。 在编译期间,静态类型中指定的编译器只接受这些方法。如果在运行时重写
Base
类型中的继承方法,将调用此方法,而不是
Demo
中的方法。这是动态绑定

您有两个选项可以靠近:

  • 将静态类型转换为动态类型
  • 重写
    Demo
    中的方法,您将看到动态绑定的结果
例如:

类演示{
整数相加(整数a,整数b){
返回a+b;
}
}
类基扩展了Demo{
整数相加(整数a,整数b){
返回0;
}
整数相加(整数a、整数b、整数c){
返回a+b+c;
}
}
公共类HelloWorld{
公共静态void main(字符串[]args){
Demo d=新基();
//System.out.println(d.add(2,3,4));//编译错误
System.out.println(d.add(2,3));//返回0,动态绑定
System.out.println(((Base)d.add(1,2,3));//编译并返回6
}
}

请提供一个答案,您的问题很不清楚这完全取决于所声明的代码。如果没有它,我们将无法提供答案。在后一种情况下,
Base.cal
覆盖
Demo.cal
。在另一种情况下,它没有,因为这两种方法有不同数量的参数。