【问题标题】:integers are not objects in Java, just because they are not instances of a class?整数不是Java中的对象,只是因为它们不是类的实例?
【发布时间】:2014-06-23 17:13:08
【问题描述】:

已经有一些类似的问题(例如Why Data type in java are not object?)但我还是不清楚。

这是objectsoracle's document的定义:

对象是相关状态和行为的软件包。

考虑:

int nnn = 3;

我认为nnn 具有int 类型和my value is 3 状态,尽管没有任何行为。为什么它不是一个对象?

然后看下面iii是一个对象:

Integer iii = new Integer(3);

我发现了一些其他解释,上面写着“对象是 Java 中某个类的实例”。 (对不起,我找不到我在哪里读的)

所以nnn的值在Java中不是对象,最重要的原因是它不是某个类的实例?

所以object在Java中的定义应该是:一个对象是一个包含相关状态和行为的软件包,而在Java中,它应该是某个类的一个实例。对吧?


更新:

感谢您回答我的问题。我发现我需要把这个问题说清楚,因为当人们评论“它不是一个对象,因为它没有行为”时,我发现很多人没有在 cmets 中通知我的解释。

我们知道Object 有一些内置方法,例如toStringequals 等。所以当我定义一个类时,说:

class User extends Object {
  // empty body
}

User 的实例也会有这些方法(行为)。但是如果Object 没有提供所有这些方法呢?在这种情况下,new User()这里不会有任何方法(行为),那么我们不应该认为它是一个对象吗?

对不起各位,我现在真的很困惑:(

【问题讨论】:

  • [...] although has no behavior. Why it's not an object? 你正在回答你自己的问题。
  • 如果Object没有提供内置方法,那么class User extends Object {}没有行为,那么new User也不是对象?
  • User 继承了Object 的所有行为。
  • @Freewind Object 有很多方法,比如user.getClass(); user.toString(), user.hashCode(), synchronized(user) 你不能用一个原语做任何这些事情。
  • Freewind 提出了一种假设情况,即您有一个名为 Object 的类,但没有任何方法;如果你实例化它,它会突然有自己的行为吗? OP 可能会被继承注释弄糊涂。

标签: java class object integer primitive


【解决方案1】:

来自Java Language Specification. Chapter 4. Types, Values, and Variables.

4.1。类型和值的种类

Java 编程语言中有两种类型:原始类型(§4.2)和引用类型(§4.3)。相应地,有两种数据值可以存储在变量中、作为参数传递、由方法返回和操作:原始值(§4.2)和引用值(§4.3)。

4.2。原始类型和值

原始类型由 Java 编程语言预定义并由其保留关键字 (§3.9) 命名:

原始类型

{Annotation} NumericType
{Annotation} 布尔值

数字类型

IntegralType
FloatingPointType

IntegralType:
byteshortintlongchar

FloatingPointType
floatdouble

4.3。引用类型和值

引用类型有四种:类类型(§8.1)、接口类型(§9.1)、类型变量(§4.4)和数组类型(§10.1)。

4.3.1。对象

一个对象是一个类实例或一个数组
引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。

因此,对象基本上是一个变量,它不是原始类型。原始类型有:byte、short、int、long、char、float、double 和 boolean。您不应将这些原始类型与其类包装器混淆:分别为 Byte、Short、Integer、Long、Character、Float、Double 和 Boolean。

如果Object类根本没有定义任何方法,那么创建一个没有方法的类根本不会有任何行为,但是在Java中,根据对象的定义,或者更好的术语:reference value,是一个引用类或数组实例的变量,基本上是任何非原始类型。请注意,引用值可能根本不需要任何行为,该行为在中定义,并且引用值可以使用或不使用它。

【讨论】:

  • 这里的潜在问题似乎是:为什么 Java 需要原语?为什么 Java 的创造者没有把 Java 中的所有东西都变成对象?我相信这样做是为了实现更小的内存占用、更直观的代码和更快的实现。
  • @PM77-1 我认为这根本不是问题。
【解决方案2】:

您展示的示例是引用类型与原始类型。还有一些其他的,例如char vs. CharacterLong vs long

这些原语的类变体包含方法、字段和您的其他标准类组件。另一方面,原语只是价值。例如,如果我想要一个数字的字符串表示。

3 没有方法。它是一个值。但是,Integer 类有一个 toString 方法,可以打印它的值。通过创建一个值为 3 (new Integer(3)) 的 Integer 实例,您可以创建一个类并填充其中一个字段。

这有它自己的用途,就像用int 输入参数或变量一样。这只是通知解释器该值属于某种类型。

【讨论】:

  • 字符串文字是一个对象。你可以做synchronized("one"),但这是个坏主意;)
【解决方案3】:

一个对象就像一个类的快照。所以它可以随时间变化。换句话说,它可以在状态上有所不同,并且可以在不同的状态下表现不同。一个对象也可以容纳其他对象。在您的示例中, nnn 有一个状态,但它没有显示任何行为

【讨论】:

  • 然而,java.lang.Integer 类的对象没有变化的状态,因为它们是不可变的......
  • @Vwin 这不是真的。不可变根据定义意味着您无法更改状态/值。在您的示例中,改变状态的不是不可变对象。更改对象!= 更改对象的状态。
  • 我认为你是对的,它不会改变状态而是指向不同的位置。好!
【解决方案4】:

Java 背后的逻辑非常简单。对象可以被称为从其层次结构中的 java.lang.Object 类派生的类的实例。

如果是 char int 或 long 等原语,则不会发生继承。

这样做的结果是,您可以在任何 java 对象上调用方法 toString()。这背后的关键是你告诉一个对象执行一些动作。你不能告诉原始人做某事。

但是,对象的概念不是由任何语言定义的。这更像是一个范式方面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2022-06-13
    • 2013-05-17
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2012-08-14
    相关资源
    最近更新 更多