使用 superclass 的变量访问派生 class 的 object
Using a variable of a superclass to access an object of a derived class
我正在尝试解决这个问题。当使用 parent class 引用引用 child class 时,我们调用 parent class 的方法。
class Programmer {
void print() {
System.out.println("Programmer - Mala Gupta");
}
}
class Author extends Programmer {
void print() {
System.out.println("Author - Mala Gupta");
}
}
class TestEJava {
Programmer a = new Programmer();
Programmer b = new Author();
b.print();
}
按照这段代码,我得到了这样的输出'Author - Mala Gupta';尽管如此,我还是应该执行 parent 的方法。
你能给我解释一下幕后发生的事情吗?
你不应该得到 'Programmer - Mala Gupta' 输出,因为你正在创建 Author
对象:
new Author();
Programmer
在这种情况下只是对对象的 引用 。并且这个引用可以指向 Programmer
及其子类的任何对象。
但是,当您调用一个方法时,您是在引用指向的对象上调用它。那就是 Author
.
Programmer
是父级 class,Author
是 Programmer
的子级。父 class 包含子 class 对象的引用,但您只能调用父 class.
中的那些方法
在Programmer b
里面居然有Author
class的引用。这就是它调用 Author
class 函数的原因。它叫做 Polymorphism
.
当通过超类引用调用重写的方法时,Java 根据调用发生时所引用对象的类型来确定执行该方法的哪个版本。因此,该确定是在 运行 时间做出的。
被引用对象的类型(而不是引用变量的类型)决定了哪个版本的重写方法将被执行。
因此,如果超类包含一个被子类覆盖的方法,那么当通过超类引用变量引用不同类型的对象时,会执行不同版本的方法。这就是您获得输出的原因:作者 - Mala Gupta
这个概念与运行时多态性相关联。这里,引用变量"b"属于parentclass(程序员),object属于childclass(作者)。
现在,引用变量 "b" 指向 child(作者)class。
print() 方法有两种定义,一种属于程序员,一种属于作者 class.The 要调用的方法的确定是基于 object 所引用的参考变量。调用函数的过程将在 运行 时间解决。
因此,无论何时调用 b.print(),您都会得到如下输出:
我正在尝试解决这个问题。当使用 parent class 引用引用 child class 时,我们调用 parent class 的方法。
class Programmer {
void print() {
System.out.println("Programmer - Mala Gupta");
}
}
class Author extends Programmer {
void print() {
System.out.println("Author - Mala Gupta");
}
}
class TestEJava {
Programmer a = new Programmer();
Programmer b = new Author();
b.print();
}
按照这段代码,我得到了这样的输出'Author - Mala Gupta';尽管如此,我还是应该执行 parent 的方法。 你能给我解释一下幕后发生的事情吗?
你不应该得到 'Programmer - Mala Gupta' 输出,因为你正在创建 Author
对象:
new Author();
Programmer
在这种情况下只是对对象的 引用 。并且这个引用可以指向 Programmer
及其子类的任何对象。
但是,当您调用一个方法时,您是在引用指向的对象上调用它。那就是 Author
.
Programmer
是父级 class,Author
是 Programmer
的子级。父 class 包含子 class 对象的引用,但您只能调用父 class.
在Programmer b
里面居然有Author
class的引用。这就是它调用 Author
class 函数的原因。它叫做 Polymorphism
.
当通过超类引用调用重写的方法时,Java 根据调用发生时所引用对象的类型来确定执行该方法的哪个版本。因此,该确定是在 运行 时间做出的。
被引用对象的类型(而不是引用变量的类型)决定了哪个版本的重写方法将被执行。
因此,如果超类包含一个被子类覆盖的方法,那么当通过超类引用变量引用不同类型的对象时,会执行不同版本的方法。这就是您获得输出的原因:作者 - Mala Gupta
这个概念与运行时多态性相关联。这里,引用变量"b"属于parentclass(程序员),object属于childclass(作者)。
现在,引用变量 "b" 指向 child(作者)class。
print() 方法有两种定义,一种属于程序员,一种属于作者 class.The 要调用的方法的确定是基于 object 所引用的参考变量。调用函数的过程将在 运行 时间解决。
因此,无论何时调用 b.print(),您都会得到如下输出: