Java 方法重写在子类和父类中可以有不同数量的参数?参数的数量可以不同吗?
我们有父类和子类,它们有共同的方法Java 方法重写在子类和父类中可以有不同数量的参数?参数的数量可以不同吗?,java,class,methods,overriding,conceptual,Java,Class,Methods,Overriding,Conceptual,我们有父类和子类,它们有共同的方法testparent(),但参数不同 //父类 public class Overriding { int a,b,c; //Parameters are different in number public void testParent(int i, int j) { System.out.println(a+b); } } //Child Class Extending Parent Class Me
testparent()
,但参数不同
//父类
public class Overriding {
int a,b,c;
//Parameters are different in number
public void testParent(int i, int j) {
System.out.println(a+b);
}
}
//Child Class Extending Parent Class Method
class ChildOverriding extends Overriding {
int c;
public void testParent(int i,int j,int k) {
System.out.println(a+b+c);
}
//Main Is not getting executed????
public static void main(String args[]) {
Overriding obj = new ChildOverriding();
obj.testParent(1,4,8);
}
}
}
您可以使用这两种方法,但是
ChildOverriding
中的方法不会覆盖overriding
中的方法。它们是两种独立的方法
要解决编译问题,您必须声明obj
ChildOverriding
ChildOverriding obj = new ChilOverriding();
或者您还必须在
Overriding
中实现一个三参数方法。您可以使用这两个方法,但是ChildOverriding
中的方法不会覆盖Overriding
中的方法。它们是两种独立的方法
ChildOverriding obj = new ChilOverriding();
要解决编译问题,您必须声明obj
ChildOverriding
ChildOverriding obj = new ChilOverriding();
或者您还必须在重写中实现一个三参数方法,重写意味着子类应该具有与基类方法相同的签名。
ChildOverriding obj = new ChilOverriding();
参数和返回类型应该相同。重写意味着子类应该具有与基类方法相同的签名。
参数和返回类型应该是相同的。实际上,这里的问题是,您是通过超类的引用对象从子类访问方法 让我再解释一下
Super obj=new Sub()代码>
此行将创建一个名为obj
的引用变量(属于Super类),并将其存储在堆栈内存中,new Sub()
的实例以及所有实现细节将存储在堆内存区域中。所以,在这之后,存储在堆中的实例的内存地址被链接到存储在堆栈内存中的引用变量
obj.someMethod()
现在,当我们在引用变量obj
上调用任何方法(如someMethod
)时,它将在超类中搜索方法签名,但当它调用someMethod
的实现时,它将从存储在堆内存区域中的实例中调用它
这就是不允许从超类映射到子类(比如Sub obj=new Super();
)的原因,因为子类可能有更具体的方法签名,可以调用,但堆区域中存储的实例可能没有被调用方法的实现
所以您的程序给出错误仅仅是因为它无法找到您在超类中调用的方法签名
请记住,Java总是只在引用对象类型中查找方法签名
你的问题的答案是是的,我们可以在子类的方法中有不同数量的参数,但是它不会被命名为方法重载/重写。
因为重载意味着你在添加新的行为,而重写意味着改变行为
对不起,我的英语不好,如果我在哪里错了,请让我知道我在学习Java
谢谢。:) 实际上,这里的问题是,在超类的引用对象上从子类访问方法
让我再解释一下
Super obj=new Sub()代码>
此行将创建一个名为obj
的引用变量(属于Super类),并将其存储在堆栈内存中,new Sub()
的实例以及所有实现细节将存储在堆内存区域中。所以,在这之后,存储在堆中的实例的内存地址被链接到存储在堆栈内存中的引用变量
obj.someMethod()
现在,当我们在引用变量obj
上调用任何方法(如someMethod
)时,它将在超类中搜索方法签名,但当它调用someMethod
的实现时,它将从存储在堆内存区域中的实例中调用它
这就是不允许从超类映射到子类(比如Sub obj=new Super();
)的原因,因为子类可能有更具体的方法签名,可以调用,但堆区域中存储的实例可能没有被调用方法的实现
所以您的程序给出错误仅仅是因为它无法找到您在超类中调用的方法签名
请记住,Java总是只在引用对象类型中查找方法签名
你的问题的答案是是的,我们可以在子类的方法中有不同数量的参数,但是它不会被命名为方法重载/重写。
因为重载意味着你在添加新的行为,而重写意味着改变行为
对不起,我的英语不好,如果我在哪里错了,请让我知道我在学习Java
谢谢。:) 方法现在重载可能重复的方法现在重载可能重复的现在我得到了这个,即签名,或者我们可以说在子类和父类中参数的数量必须相同。现在我得到了这个,即签名,或者我们可以说在子类和父类中参数的数量必须相同。