gpt4 book ai didi

java - 当子类对象具有父类型的引用并且父类没有相同的子类方法时,无法访问子类方法

转载 作者:行者123 更新时间:2023-12-02 10:59:54 36 4
gpt4 key购买 nike

无法使用以下行访问子类的方法,

Parent p = new Child(); p.print();

假设我有一个方法 print()在 Child 类中,相同的方法在 Parent 类中。在这种情况下我们无法访问子类方法 print()使用上面的代码行。但请注意,如果我们有相同的方法 print()在父类中,我们可以使用上面的代码访问它。

现实生活中可能没有这样的场景,但试图理解为什么我无法访问子类 print()如果我们没有在父类中定义相同的方法,则使用 Parent 类型的子对象。

示例代码如下:

public class Main {

public static void main(String[] args)
{

Parent p = new Child();
p.print(); //Compiler throws an error saying "cannot resolve print method".


}

}

class Parent {
int x = 10;


}

class Child extends Parent {

void print(){
System.out.println("Child");
}

int x = 20;
}

更多解释 - 如果我定义 print()父类中的方法然后我可以访问子类 print()使用 Parent 类型的对象的方法。所以我假设我们不能说父类型的对象只能访问父类中定义的成员/方法。

另外,我知道我们可以通过将父类型转换为子类型来访问子方法。我想知道为什么我们不能在不进行强制转换的情况下访问子类方法,并且如果我们不在父类中定义相同的方法。

我已编辑该问题,以确保这与其他问题没有关系 - Calling a subclass method from superclass

最佳答案

当父级没有声明该方法(作为具体或抽象方法)时,子级在父变量内部实例化时将无法使用该方法。您可以使用以下代码示例来使用它

Parent p = new Child(); 
if(p instanceof Child){
((Child) p).print();
}

这背后的解释是变量 p 实际上并不知道运行时其中存储的子实例(可能有多个子实例,但只有一个具有 print() 方法。也许你会在编译时知道 Parent p 中存储的对象的真实类型,但执行时却是另一个世界。因此,如果 p 对象是 Child 的实例,这意味着 p 的类型为 Child 或其子级之一,那么您可以将其转换为 ((Child) p) 并且所有方法都将被识别为好像是一个 child (因为它是)。

注意,你可以强制转换一个不可 Casteable 的类,并且你将遇到 ClassCastException。在这个具体的例子中写 if句子不是必要的,因为我们确定 p 类型,但有时在运行时事情会变得困惑,我们不知道什么存储在哪里,因此确保类型转换的健全性变得至关重要。谈到变量转换,如果您只想让 Child 类访问方法 print 而不是其子类,则可以使用

Parent p = new Child(); 
if(p.getClass() == Child.class){
((Child) p).print();
}

如果您不想强制转换子级并且您的父类适合使用 print 方法(并非总是一个选项),正如您所说,您可以将其声明为父级中的具体方法并覆盖该方法 child )

class Parent {
int x = 10;
void print(){
System.out.println("Parent");
}
}

或者您可以在父级中将该方法声明为抽象方法,并且所有子级都必须实现该方法,但是只要该方法必须是抽象的,您就无法创建父级的对象。

abstract class Parent {
int x = 10;
abstract void print();
}

继续,如果父级有子级,则子级将拥有父级的所有方法,但只要是父级,就不会拥有子级的任何方法。需要进行类型转换。如果 print 方法同时写在子方法和父方法中,则最底层的覆盖方法将被执行(在本例中为子方法)。另外,您可以使用在父级中使用“super”实现的方法(与构造函数中相同)

class Child extends Parent {

void print(){
super.print("Child");
}

int x = 20;
}

关于java - 当子类对象具有父类型的引用并且父类没有相同的子类方法时,无法访问子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416125/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com