首页 > 解决方案 > 如果类是类型,它们可以保存什么类型的数据?

问题描述

根据 Coursera 上的一个讲座,类是类型,例如,如果我们有一个名为 Book 的类,我们可以编写一行代码-

Book book = new Book("Java",100);

这将在我们称为对象的堆中创建一些数据,并且“Book”类型的变量“book”指向该对象。现在我的问题是,变量“book”可以具有什么样的值?我尝试使用打印它

System.out.println(book);

它打印了这个-

eclipsetest.Book@24d46ca6

('eclipsetest' 是我的包的名称,'Book' 是类)那么这里到底发生了什么?

编辑:不是这个的副本,因为我知道如何使用对象打印数据而不会出现乱码,但我无法理解数据类型可以包含哪些类型的数据类。我还尝试进一步查找它,发现类是“引用”数据类型并持有对对象的“引用”。但是,我不明白他们是如何做到的,因为 Java 没有任何方法可以像 C 那样打印内存地址。

澄清:为了进一步澄清,假设我们写int a;,现在,我们知道变量'a'可以保存整数值。那么如果我们Book b;为一个类'Book'编写,变量'b'保存什么样的数据呢?

[已解决]:阅读答案后,我了解到变量 'b' 可以保存对用作 'b' 类型的任何类的对象的引用。而且由于 Java 使用垃圾收集,我们并不真正知道引用在底层是如何工作的。我们所知道的是它们“指向”某物。

标签: javaclassoop

解决方案


实际上,类是类型,类可以在其中包含其他类型的实例作为其定义的一部分。此类用户定义类型可以包含其他用户定义类型(类、枚举)或内置类型 ( int, boolean)。

鉴于您发布的示例构造函数,该特定类可能定义如下:

public class Book
{
    private String title;
    private int numberOfPages;

    public Book(String title, int numberOfPages)
    {
        this.title = title;
        this.numberOfPages = numberOfPages;
    }
}

它包含用户定义的类型String(作为标准库的一部分为您定义的类)和int.

在您尝试获取已声明的对象的内容时,您正在尝试打印它。但是,您的打印语句正在将有关引用的信息 , 写入book输出,而不是转到实际对象的位置(引用指向的内容)并打印有关该对象的信息 - 无法自动执行此操作爪哇。

相反,您将需要重写内置java.lang.toString()方法,正如@bkbb 所暗示的那样,以便获取存储在对象中的实际信息。尝试打印时,您要么需要显式调用此方法

System.out.println(book.toString());

或使其作为字符串操作的一部分自动调用

System.out.println("My book is: " + book);

推荐阅读