他们在java中说“每件事都是一个对象”。真的吗?

时间:2012-08-07 10:31:38

标签: java oop

当我输入

int a = 5;

a是一个对象吗?

有人可以向我解释一下java中的每个东西都是一个对象吗?

10 个答案:

答案 0 :(得分:15)

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

然而,有很多东西不是物体。

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

将一段代码作为对象是Java 8中最令人兴奋的功能之一。以下示例都将是Closures及其对象。

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"); }

e.g。此处的代码块将作为Runnable 对象

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

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

答案 1 :(得分:4)

这在java中是不是 true。例如,int实际上是原始的。在java中,所有内容都是Object扩展Object。其他一切都

所以,例如,你不能像对象那样操纵命名空间(java术语中的包),但是在Erlang或Clojure中你可以。

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

Integer a = 5;

java将5列入Integer引用。如果您想了解自动装箱,请点击此处:autoboxing docs。 java中的对象:Objects

如果您正在寻找一种语言,其中一切在技术上是一个对象,您可以尝试使用Common Lisp。在Lisp中,即使T(代表布尔值为true)也是一个对象。

答案 2 :(得分:3)

,这不是Object.Java不是纯粹的面向对象语言,因为primitivesstatic。为了使原始变量成为Object,java引入了类似IntegerBoolean等的包装器。

答案 3 :(得分:3)

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

答案 4 :(得分:3)

虽然a不是对象而是基本类型的值,但Java会尽一切努力向您隐瞒这一事实。从Java 5开始,primitives are automatically converted to their corresponding object wrappers when necessary,以便您可以将它们存储在容器中,将它们传递给需要对象的方法,等等。

答案 5 :(得分:3)

并非Java中的所有内容都是对象。有些值是原始类型,仅举几例:intfloatdoublebytechar,...有多种方式可以包装将这些原始类型转换为对象(Java也可以自动为您执行此操作)。

现在,可以更准确地说,“在java中,一切都在[对象中定义]”,作为在Java中突出显示它的方法,你不能定义一个不是类或实例的函数或子方法,就像您在C++中可以做的那样。

答案 6 :(得分:2)

他们错了。 a不是对象。

答案 7 :(得分:2)

在java中你有原始类型(int,boolean,char,byte ...),其他一切都扩展了Object类,因此是一个对象。

但是一切都是一个对象这个东西大多意味着你不能拥有一个对象类之外的代码。你可以'制作脚本文件作为例子,它必须包装在一个类中。

答案 8 :(得分:2)

我认为这来自“早期”,当时Java经常被比作C及其结构性质。然而,声明本身并不属实。

答案 9 :(得分:1)

并非Java中的所有内容都是Object。还有以下原语类型可以在对象中使用(来自Oracle Tutorials的定义:

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

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

  •   
  • int :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 :float数据类型是单精度32位IEEE 754   浮点。它的价值范围超出了这个范围   讨论,但在浮点类型,格式和   Java语言规范的值部分。和。一样   对于byte和short的建议,使用float(而不是double)if   你需要在大型浮点数中保存内存。   绝不应将此数据类型用于精确值,例如   货币。为此,您需要使用java.math.BigDecimal   而是改为。数字和字符串涵盖了BigDecimal和其他有用的东西   Java平台提供的类。

  •   
  • double :双数据类型是双精度64位IEEE 754   浮点。它的价值范围超出了这个范围   讨论,但在浮点类型,格式和   Java语言规范的值部分。对于十进制值,   此数据类型通常是默认选择。正如刚才提到的,   永远不要将此数据类型用于精确值,例如   货币。

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

  •   
  • char :char数据类型是一个16位Unicode字符。它有   最小值'\ u0000'(或0)和最大值'\ uffff'(或   65,535(含))。

  •   

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