所以我在这里写了一个简单的java代码,如下所示。
package com.example.aakash;
public abstract class Book {
String title;
String author;
Book(String t,String a){
title=t;
author=a;
}
abstract void display();
}
所以 Book 是一个抽象类,它将由两个不同的类(称为 MyBook 和 ABook 类)扩展,如下所示。
package com.example.aakash;
public class MyBook extends Book {
private int price;
MyBook(String t, String a,int p) {
super(t, a);
price = p;
}
@Override
public void display(){
System.out.println("Title: "+title);
System.out.println("Author: "+author);
System.out.println("Price: "+price);
}
}
package com.example.aakash;
public class ABook extends Book {
private int price;
ABook(String t, String a,int p) {
super(t, a);
price = p;
}
@Override
public void display(){
System.out.println("Title: "+title);
System.out.println("Author: "+author);
System.out.println("Price: "+price);
}
}
package com.example.aakash;
import java.util.ArrayList;
public class Main {
public static void main(String[] args){
ArrayList<Book> myArray = new ArrayList<Book>();
String bookName = "Book";
for(int i=1;i<=10;i++){
if(i%2==0){
String tempBook = bookName + i;
String author = "Author2";
Book temp = new MyBook(tempBook,author,i*50);
myArray.add(temp);
}else{
String tempBook = bookName + i;
String author = "Author1";
Book temp = new ABook(tempBook,author,i*50);
myArray.add(temp);
}
}
for(int i=0;i<10;i++){
Book temp = myArray.get(i);
temp.display();
System.out.println("--------------------------------------------------");
}
myArray.get(5).display();
}
}
好的,当我运行这个程序时,显示方法每次都会打印正确的书籍、作者和价格。就像它们的存储方式一样。然而,在运行时,JVM 不知道数组列表中的 Book 对象是否属于 MyBook 或 ABook 类型。所以我的问题是如何调用显示方法每次都打印正确的书。 Book对象的ArrayList如何存储在堆上? (即所有对象都存储在 Java 中的堆中)是否将其存储为向上转换的 Book 对象。或者它是否将其存储为实际的 MyBook 和 ABook 类型的对象,以便在调用显示方法时,JVM 明确知道是否要调用 MyBook 或 ABook 上的方法?
附注是的,这个例子有点糟糕,但假设我在 MyBook 和 ABook 上甚至没有类似的显示方法。即使如此,JVM 仍然执行正确的显示方法。因此,请解释一下向上转换完成后 JVM 中发生了什么。
最佳答案
具体对象是一个声明为 Book
的 ABook
。
哪种显示
方法选择是在运行时解析的,而不是编译时解析的。
来自JLS :
If the method that is to be invoked is an instance method, the actual method to be invoked will be determined at run time, using dynamic method lookup (§15.12.4).
基本上,这意味着在运行时获取真实的实例类型。如果该方法在该类中被覆盖,则执行该方法,如果未被覆盖,则调用父类(super class)的方法。
关于java - Java中Upcasted对象如何存储在Heap中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34771361/