当我输入
int a = 5;
是a
对象吗?
谁能向我解释一下在java中每件事都是一个对象吗?
每个对象都是一个java.lang.Object
(注意:java.lang.Object
没有超类。;))
但是,有很多东西不是对象。
将代码块作为对象是 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
这在java中是不正确的。例如,int
实际上是一个原语。在 java 中,一切都是Object
扩展的Object
。其他一切都不是。
因此,例如,您不能像对象一样操作名称空间(Java 术语中的包),但在 Erlang 或 Clojure 中您可以。
尽管 java 提供了一个自动装箱功能,可以将原语转换为对象。在你的情况下,如果你说
Integer a = 5;
java 将 5 放入Integer
参考中。如果您想阅读有关自动装箱的信息,请单击此处:自动装箱文档。java中的对象:对象
如果你正在寻找一种在技术上一切都是对象的语言,你可以试试 Common Lisp。在 Lisp 中,甚至T
(代表布尔真) 也是一个对象。
在 Java 中,您有原始类型(int、boolean、char、byte...),其他所有内容都扩展了Object
该类,因此是一个对象。
但是一切都是对象的事情主要意味着您不能在对象类之外拥有代码。您可以为示例制作脚本文件,它必须包装在一个类中。
a
这是一个原始的。Java既有原语也有对象。
尽管a
不是对象而是原始类型的值,Java 尽一切努力向您隐藏这一事实。从 Java 5 开始,原语会在必要时自动转换为相应的对象包装器,以便您可以将它们存储在容器中,将它们传递给需要对象的方法等等。
并非 Java 中的所有内容都是对象。一些值是原始类型,仅举几例:int
, float
, double
, byte
, char
, ... 有一些方法可以将这些原始类型包装到 Objects 中(Java 也可以自动为您执行此操作)。
现在,可以更准确地说,“在 Java 中,一切都 [定义] 在一个对象中”,作为强调在 Java 中的一种方式,您不能定义一个既不是类也不是实例方法的函数或子函数,例如例如,您可以这样做C++
。
他们错了。a 不是对象。
我认为这来自于 Java 经常被比作 C 的“早期”,以及它的结构性质。然而,这句话本身是不正确的。
并非 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
存储在数组中。请注意,这些自动装箱操作并非完全免费,因为它们具有与之相关的性能成本,因此如果性能对您的系统确实很重要,请注意这一点。