9

当我输入

int a = 5;

a对象吗?

谁能向我解释一下在java中每件事都是一个对象吗?

4

10 回答 10

16

每个对象都是一个java.lang.Object(注意:java.lang.Object没有超类。;))

但是,有很多东西不是对象。

  • 原语和参考。
  • 字段(字段本身不是内容)
  • 局部变量和参数。
  • 泛型类(在 Java 8 中可能会改变)
  • 方法(将在 Java 8 中更改)
  • 代码块(将在 Java 8 中更改)

将代码块作为对象是 Java 8 中最令人兴奋的特性之一。以下示例都是闭包,因此都是对象。

x => x + 1
(x) => x + 1
(int x) => x + 1
(int x, int y) => x + y
(x, y) => x + y
(x, y) => { System.out.printf("%d + %d = %d%n", x, y, x+y); }
() => { System.out.println("I am a Runnable"); }

例如这里的代码块将作为Runnable 对象传递

new Thread(() => { System.out.println("I am a Runnable"); }).start();

http://mail.openjdk.java.net/pipermail/lambda-dev/2011-September/003936.html

于 2012-08-07T10:36:30.723 回答
4

这在java中是不正确的。例如,int实际上是一个原语。在 java 中,一切都是Object扩展的Object。其他一切都不

因此,例如,您不能像对象一样操作名称空间(Java 术语中的包),但在 Erlang 或 Clojure 中您可以。

尽管 java 提供了一个自动装箱功能,可以将原语转换为对象。在你的情况下,如果你说

Integer a = 5;

java 将 5 放入Integer参考中。如果您想阅读有关自动装箱的信息,请单击此处:自动装箱文档。java中的对象:对象

如果你正在寻找一种在技术上一切都是对象的语言,你可以试试 Common Lisp。在 Lisp 中,甚至T(代表布尔真) 也是一个对象。

于 2012-08-07T10:35:01.850 回答
3

,这不是一个对象。Java 不是纯粹的面向对象语言,因为primitivesand static。为了将原始变量作为 Object,java 引入了IntegerBoolean等包装器类。

于 2012-08-07T10:33:58.790 回答
3

在 Java 中,您有原始类型(int、boolean、char、byte...),其他所有内容都扩展了Object该类,因此是一个对象。

但是一切都是对象的事情主要意味着您不能在对象类之外拥有代码。您可以为示例制作脚本文件,它必须包装在一个类中。

于 2012-08-07T10:34:44.440 回答
3

a这是一个原始的。Java既有原语也有对象。

于 2012-08-07T10:35:03.097 回答
3

尽管a不是对象而是原始类型的值,Java 尽一切努力向您隐藏这一事实。从 Java 5 开始,原语会在必要时自动转换为相应的对象包装器,以便您可以将它们存储在容器中,将它们传递给需要对象的方法等等。

于 2012-08-07T10:37:19.943 回答
3

并非 Java 中的所有内容都是对象。一些值是原始类型,仅举几例:int, float, double, byte, char, ... 有一些方法可以将这些原始类型包装到 Objects 中(Java 也可以自动为您执行此操作)。

现在,可以更准确地说,“在 Java 中,一切都 [定义] 在一个对象中”,作为强调在 Java 中的一种方式,您不能定义一个既不是类也不是实例方法的函数或子函数,例如例如,您可以这样做C++

于 2012-08-07T10:38:12.533 回答
2

他们错了。a 不是对象。

于 2012-08-07T10:34:00.647 回答
2

我认为这来自于 Java 经常被比作 C 的“早期”,以及它的结构性质。然而,这句话本身是不正确的。

于 2012-08-07T10:35:53.723 回答
1

并非 Java 中的所有内容都是对象。还有以下可以在对象中使用的原始类型(取自Oracle 教程的定义:

  • byte : byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。

  • short:short 数据类型是一个 16 位有符号二进制补码整数。它的最小值为 -32,768,最大值为 32,767(含)。与 byte 一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用 short 来节省大型数组中的内存。

  • int:int 数据类型是一个 32 位有符号二进制补码整数。它的最小值为 -2,147,483,648,最大值为 2,147,483,647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上述)选择其他内容。这种数据类型很可能对于您的程序将使用的数字足够大,但如果您需要更广泛的值,请改用 long。

  • long:long 数据类型是一个 64 位有符号二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。当您需要比 int 提供的值范围更广的值时,请使用此数据类型。

  • float:float 数据类型是单精度 32 位 IEEE 754 浮点数。它的值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。与 byte 和 short 的建议一样,如果您需要在大型浮点数数组中节省内存,请使用浮点数(而不是双精度数)。此数据类型绝不应用于精确值,例如货币。为此,您需要改用 java.math.BigDecimal 类。Numbers and Strings 涵盖了 Java 平台提供的 BigDecimal 和其他有用的类。

  • double:双精度数据类型是双精度 64 位 IEEE 754 浮点数。它的值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选择。如上所述,这种数据类型不应该用于精确值,例如货币。

  • boolean:布尔数据类型只有两个可能的值:true 和 false。将此数据类型用于跟踪真/假条件的简单标志。这种数据类型代表一点信息,但它的“大小”并不是精确定义的。

  • char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535,包括在内)。

Java中的大多数其他东西都是一个对象(它继承自Object类),并且该main()方法是从类的实例中运行的。为了允许在主要基于对象的系统中使用原语,Java 提供了包装类,它们是表示原语值的对象(例如,Integer该类表示与 相同类型的数据int)。Java 还做了一些称为自动装箱的事情,它会在其对象包装器中自动包装一个原始类型,例如,当您想要将一个存储int在一个ArrayList<Integer>. 同样,您可以执行类似的操作int x = intArrayList.get(0);,Java 将取消装箱Integer存储在数组中。请注意,这些自动装箱操作并非完全免费,因为它们具有与之相关的性能成本,因此如果性能对您的系统确实很重要,请注意这一点。

于 2012-08-07T10:56:57.947 回答