Java 实例、子类和类型转换
如果我有一个类myClass1,另一个类MyClassExtended是第一个类的扩展,那么我有以下源代码:Java 实例、子类和类型转换,java,Java,如果我有一个类myClass1,另一个类MyClassExtended是第一个类的扩展,那么我有以下源代码: myClass1 c1 = something(); // line 1 myClass1Extended c1ex = somethingElse(); // line 2 if (c1ex instanceof myClass1) { // line 3 (myClass1)c1ex.doSomething(); // line 4 } 我有几个问题:
myClass1 c1 = something(); // line 1
myClass1Extended c1ex = somethingElse(); // line 2
if (c1ex instanceof myClass1) { // line 3
(myClass1)c1ex.doSomething(); // line 4
}
我有几个问题:
在第3行中,运算符instanceof是否返回true?
在第4行中,假设第一个答案是肯定的,那么如果doSomething没有在MyClass中被覆盖,将会发生什么?
如果doSomething被覆盖会发生什么?
在第4行中,是否需要myClass1?
非常感谢为什么不试试代码看看呢 对 它将调用父类中的一个 它将调用子类中的一个 不 鉴于:
class Parent
{
public void foo()
{
System.out.ptintln("parent::foo");
bar();
}
public void bar()
{
System.out.println("parent::bar");
}
}
class Child
extends Parent
{
public void foo()
{
super.foo();
System.out.ptintln("child::foo");
}
}
可以在使用父类的任何位置使用子类,因为所有子类都是父类的类型
当编译器查看此代码时:
Parent p = new Child();
p.foo();
它验证子级是否扩展或实现父级
当编译器查看此代码时:
Parent p = new Child();
p.foo();
它验证p声明为父类型的类型是否具有foo方法
在运行时,当执行p.foo行时,虚拟机将查看p实际指向的类型Child,并在那里查找foo方法。假设在子类中找到foo方法,它将运行它,否则它将查看父类
在父类中,当foo方法调用bar时,编译器再次检查以确保父类具有bar方法。在运行时,VM再次查看子类以查找bar方法,因为它没有调用父类中的子类
如果这些方法不存在于父类中,那么它们必须存在于父类的父类中,一直到java.lang.Object。要回答您的问题,请在这里举一个例子:
package test;
public class Parent
{
public void printFoo()
{
System.out.println("foo");
}
public void printBar()
{
System.out.println("bar");
}
}
package test;
public class Child extends Parent
{
@Override
public void printFoo()
{
System.out.println("myFoo");
}
}
package test;
public class Main
{
public static void main(String ... args)
{
Parent test = new Child();
Parent test2 = new Parent();
print(test);
print(test2);
}
public static void print(Parent parent)
{
if (parent instanceof Parent)
{
System.out.println(parent.getClass().getName()+" is Parent");
parent.printFoo();
parent.printBar();
}
}
}
正如您所看到的,子对象从父对象继承并重写printFoo方法。打印这些父对象时,您将获得以下输出:
test.Child is Parent
myFoo
bar
test.Parent is Parent
foo
bar
因此,要回答您的问题:
1是的
2它将调用父类的方法
3它将调用重写的方法-如果此方法包含超级调用,则父方法也将执行
4否-如果您指定f.e.Parent o=new Child并在Child中实现一个在Parent中不存在的方法,并且您希望调用Child对象的方法,则必须将其强制转换回Child Childo。invokeYourMethod此问题未显示任何研究成果。请先尝试,然后再问。我认为这是一个有趣的问题,人们给了我很好的答案,不幸的是,我将删除它,因为有其他人认为我应该为此得到一个负号。因为我认为这是这里缺少的知识的一部分,因为我实际上已经测试过了,但我想确定我没有犯错误。最后,因为这是深入理解语言的好方法。非常感谢你。