他们说在Java中“一切皆为对象”。这是真的吗?

13
抱歉,我只能接受英文输入并提供中文输出。如果您提供的英文内容需要翻译为中文,请重新输入。
int a = 5;

a 是一个对象吗?

有人能向我解释一下在Java中为什么每个东西都是对象吗?


1
你在 "a" 附近放了一个点吗?有什么弹出来了吗? - huseyin tugrul buyukisik
5
“他们”是谁?因为“他们”是错误的。 - Romain
3
a是一个对象吗?那么也可以问,5是一个对象吗? - Lee Taylor
2
同意。今天(2015年5月16日),一家知名在线培训网站的主页上不幸出现了以下极其错误的话语:“Java是一种面向对象的编程语言。基本上所有都是对象,因此理解它们对于您的Java基础至关重要。” 尽管这对于那些关心这些事情的人来说可能很可怕,但它确实涵盖了原帖作者的问题:为什么人们继续这样说呢?显然这是错误的!但是人类并不在乎,或者只是大脑中有错误信息的不完美生物... - Ray Toal
所有的类都是“Object”,并不是所有的东西都是。“int”、“byte”、“long”、“boolean”等原始类型不是对象,关键字也不是对象。没有继承任何内容的类隐式地扩展了“Object”。 - user5395084
显示剩余3条评论
10个回答

17
每个对象都是一个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


1
"泛型类"就像其他类一样是对象。泛型在编译时通过擦除来实现。代码块是一种语法糖,类似于匿名类。我猜,我并不是lambda的忠实粉丝。 - bestsss
@bestsss 在Java 8(或9)中,您将能够在运行时区分ArrayList<String>ArrayList<Integer>之间的差异,即类型不会完全被擦除。 - Peter Lawrey
嗯,我不认为Java8包含类似的内容,Java9可能是在2015年发布的,所以我也不清楚。你有该功能的JCP吗?或者你指的是:http://bugs.sun.com/view_bug.do?bug_id=5098163 - bestsss
我能找到的最接近的是http://tech.puredanger.com/java7/#reified,它似乎主要是讨论而不是声明它将被实现。 - Peter Lawrey
JSR308主要是关于注释,它们可以用来跟踪泛型类型但没什么实际意义。保留对象的“声明”类型虽然可能可行,但为了没有明显好处需要付出巨大的努力 - 例如在对象头中使用额外的位来保留通用类型 - 但这样不会很好地工作,因为通用类型可能具有“无限”的通用类型,例如类class X<A extends java.util.List, B extends java.util.Comparator, C extends java.math.BigDecimal, etc, etc> - bestsss

4

在Java中,这是不正确的。例如,int 实际上是一种原始数据类型。在Java中,所有东西都是继承了 ObjectObject。其他所有东西都不是

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

尽管Java提供了自动装箱功能,可以将原始数据类型转换为对象。在你的情况下,如果你说

Integer a = 5;

Java将数字5装箱到Integer引用中。如果您想了解自动装箱,请单击此处:自动装箱文档。Java中的对象:对象
如果您正在寻找一种语言,其中所有都是对象,可以尝试使用Common Lisp等语言。在Lisp中,甚至T(代表布尔值true)也是一个对象。

4
没有,Java不是纯粹的面向对象语言,因为它有原始类型和静态变量。为了将原始类型变量转换为对象,Java引入了包装类,如IntegerBoolean等。

4

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

但是“一切皆为对象”的概念主要意味着你不能在对象类之外编写代码。例如,你不能编写脚本文件,必须将其封装在类中。


4

3

a 这里是原始类型。Java有原始类型和对象。


3
并非所有Java中的值都是对象。其中一些值属于原始类型,例如:int、float、double、byte、char等。可以将这些原始类型封装成对象(Java也可以自动完成此操作)。
更准确地说,在Java中,“所有东西都在对象中被定义”,这样可以强调在Java中,不能定义一个函数或子程序,除非它是类或实例方法,就像在C++中那样。

2
他们错了,a不是一个对象。

2

我认为这源于Java早期常与C进行比较,因为它们都属于结构化的语言。然而,这个说法本身并不正确。


1

Java 中并非所有东西都是对象。还有以下可以在对象内部使用的原始类型(定义来自Oracle Tutorials):

字节(byte)数据类型是一个8位的有符号二进制补码整数, 最小值为-128,最大值为127(包括)。 在需要保存大型数组时,使用byte数据类型可以有助于节省内存。 短(short)数据类型是一个16位的有符号二进制补码整数,最小值为-32,768,最大值为32,767(包括), 与byte相同,可以在需要节省内存的大型数组中使用。 int数据类型是一个32位的有符号二进制补码整数,最小值为-2,147,483,648,最大值为2,147,483,647(包括)。 通常情况下,对于整数值,除非有其他原因(例如上述情况),否则应选择此数据类型。 long数据类型是一个64位的有符号二进制补码整数,最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(包括)。 当需要比int提供的范围更广的值范围时,请使用此数据类型。 float数据类型是单精度32位IEEE 754浮点数。建议在需要节省浮点数的大型数组时使用它,而不是double。 但是,此数据类型不应用于货币等精确值。这种情况需要使用java.math.BigDecimal类。 double数据类型是双精度64位IEEE 754浮点数。对于十进制值,通常应选择此数据类型。 布尔(boolean)数据类型只有两个可能的值:true和false。用这种数据类型来跟踪真/假条件的简单标志。 char数据类型是一个16位Unicode字符。最小值为'\u0000'(或0),最大值为'\uffff'(或65,535包括)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接