gpt4 book ai didi

java - Java中Upcasted对象如何存储在Heap中

转载 作者:行者123 更新时间:2023-12-02 04:02:16 25 4
gpt4 key购买 nike

所以我在这里写了一个简单的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 中发生了什么。

最佳答案

具体对象是一个声明为 BookABook

哪种显示方法选择是在运行时解析的,而不是编译时解析的。

来自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/

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