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

标签 java jvm

所以我在这里写了一个简单的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/

相关文章:

java - 如何声明和实例化一个新的通用数组?

java - Android Studio 多个 dex 文件定义

scala - finally block 如何以及何时执行?

java - jvm运行垃圾收集时Kubernetes Pod内存使用率不下降

java - JVM按函数管理类代码吗?拆分大型决策函数对内存使用有效吗?

java - NetworkSecurityConfig : No Network Security Config specified, 使用平台默认错误响应代码:400

java - 外部类可以调用其内部类的方法吗?

java - 嵌套同步块(synchronized block)

java - Intellij 无法设置 VM 选项

Java char 数组似乎每个 char 需要超过 2 个字节