【问题标题】:They say in java "every thing is an object". Is that true?他们在java中说“一切都是对象”。真的吗?
【发布时间】:2012-08-07 10:31:37
【问题描述】:

当我输入时

int a = 5;

a 是一个对象吗?

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

【问题讨论】:

  • 你在“a”附近放了一个点吗?有什么弹出来的吗?
  • “他们”是谁?因为“他们”是错误的。
  • 为此java引入了Wrapper类。
  • a 是一个对象吗?那么,也可以问,5 是一个对象吗?
  • 同意。今天,2015 年 5 月 16 日,main page of a well-known online training site 不幸地出现了这些非常错误的词:“Java 是一种面向对象的编程语言。从字面上看,一切都是对象,因此理解它们对您的 Java 基础基础至关重要。”对于我们这些关心这些事情的人来说,这可能是可怕的,它涉及到 OP 的原始问题:为什么人们继续这样说?显然是错的!然而,人类并不关心,或者只是大脑中存在错误信息的不完美生物......

标签: java oop


【解决方案1】:

在 java 中,您有基本类型(int、boolean、char、byte...),其他所有类型都扩展了 Object 类,因此是一个对象。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • “通用类”是与任何其他类一样的对象。泛型是在编译器时通过擦除实现的。代码块是同步的。糖很像anon。类。猜猜,我不太喜欢 lambda 的东西。
    • @bestsss 在 Java 8(或 9)中,您将能够在运行时区分 ArrayList<String>ArrayList<Integer>,即不会完全擦除类型。
    • hmm 我不认为 java8 包含任何类似的东西,java9 可能是 2015 所以我也不知道。您是否拥有该功能的 JCP,或者您的意思是:bugs.sun.com/view_bug.do?bug_id=5098163
    • 我能找到的最接近的是tech.puredanger.com/java7/#reified,这似乎主要是在讨论,而不是说 ti 将被实施。
    • JSR308 只是关于注释,它们可用于跟踪泛型类型,但没什么。尽可能在对象中保留“声明的”类型需要付出很大的努力而没有明显的好处 - 例如在对象头中使用额外的位来保持泛型类型 - 但是对于泛型类型来说,这不会很好可能具有“无限”泛型类型,例如 Class class X<A extends java.util.List, B extends java.util.Comparator, C extends java.math.BigDecimal, etc, etc>
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        并非 Java 中的所有内容都是对象。一些值是原始类型,仅举几例:intfloatdoublebytechar、... 有一些方法可以将这些原始类型包装到对象中(Java 也可以这会自动为您服务)。

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

        【讨论】:

          【解决方案6】:

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

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

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

          Integer a = 5;
          

          java 将 5 放入 Integer 引用中。如果您想阅读有关自动装箱的信息,请单击此处:autoboxing docs。 java中的对象:Objects

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              他们错了。 a 不是对象。

              【讨论】:

                【解决方案9】:

                我认为这源于 Java 经常与 C 相比较的“早期”及其结构性质。然而,这句话本身是不正确的。

                【讨论】:

                  【解决方案10】:

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

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

                  • short:short 数据类型是 16 位有符号二进制补码 整数。它的最小值为 -32,768,最大值为 32,767(含)。与字节一样,适用相同的准则:您可以 在大型数组中使用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 语言规范的值部分。与 字节和短的建议,如果使用浮点数(而不是双精度数) 您需要在大型浮点数数组中节省内存。 此数据类型绝不应用于精确值,例如 货币。为此,您需要使用 java.math.BigDecimal 而是上课。数字和字符串涵盖 BigDecimal 和其他有用的 Java平台提供的类。

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

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

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

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

                  【讨论】:

                    猜你喜欢
                    • 2014-06-07
                    • 1970-01-01
                    • 2010-09-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-26
                    • 1970-01-01
                    相关资源
                    最近更新 更多