所以我在这里写了一个简单的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类型的对象,以便在调用display方法时,JVM明确知道MyBook或ABook上的方法将被调用?
P.S.是的例子有点不好,但假设我在MyBook和ABook上甚至没有类似的显示方法。即使如此,JVM仍然执行正确的显示方法。所以请在上传完成后解释JVM中发生了什么。
调用哪个方法在编译时定义哪个方法。 – SomeJavaGuy
'但是在运行时,JVM不知道数组列表上的Book对象是MyBook还是ABook类型。“它知道。 – YoungHobbit
@KevinEsche那么在堆中它将被存储为Book对象吗? – StackPointer