已经有一些类似的问题(例如Why Data type in java are not object?),但我仍然不清楚。
这是oracle's document中objects
的定义:
对象是相关状态和行为的软件包。
考虑:
int nnn = 3;
我认为nnn
的类型为int
,状态为my value is 3
,但没有行为。为什么它不是一个对象?
然后查看以下iii
对象:
Integer iii = new Integer(3);
我发现了一些其他的解释,说“对象是Java中某些类的实例”。 (对不起,我找不到我读到的地方)
因此值nnn
不是Java中的对象,最重要的原因是它不是某个类的实例?
因此,Java中object
的定义应该是:对象是相关状态和行为的软件包,在Java中,它应该是某个类的实例。正确?
更新
感谢您回答我的问题。我发现我需要明确这个问题,因为我发现许多人在评论中没有通知我的解释,当人们评论“它不是一个对象,因为它没有行为”。
我们知道Object
有一些内置方法,例如toString
,equals
等。所以当我定义一个类时,请说:
class User extends Object {
// empty body
}
User
的实例也会有这些方法(行为)。但是如果Object
没有提供所有这些方法呢?在这种情况下,new User()
这里没有任何方法(行为),那么我们不应该认为它是一个对象吗?
答案 0 :(得分:1)
来自Java Language Specification. Chapter 4. Types, Values, and Variables.:
4.1。类型和价值的种类
Java编程语言中有两种类型:基本类型(§4.2)和引用类型(§4.3)。相应地,有两种数据值可以存储在变量中,作为参数传递,由方法返回,并对其进行操作:原始值(§4.2)和参考值(§4.3)。 / p>
4.2。原始类型和值
原始类型由Java编程语言预定义,并以其保留关键字(§3.9)命名:
PrimitiveType :
{Annotation} NumericType
{Annotation}布尔NumericType :
IntegralType
FloatingPointTypeIntegralType :
byte
short
int
long
char
FloatingPointType :
float
double
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中,通过对象的定义,或更好的术语:参考值,是一个引用类或数组实例的变量,它基本上是任何非基本类型。请注意,参考值可能不需要任何行为 ,行为在类中定义,参考值可以使用或不使用。
答案 1 :(得分:0)
您展示的示例是引用类型与基本类型。还有一些其他内容,例如char
与Character
和Long
与long
这些基元的类变体包含方法,字段和其他标准类组件。另一方面,原语只是价值。例如,如果我想要一个数字的字符串表示。
3没有方法。它的价值。但是,类Integer
具有toString
方法,可以打印其值。通过创建值为3(Integer
)的new Integer(3)
实例,您可以创建一个类并填充其中一个字段。
这有自己的用途,用int
键入参数或变量也是如此。这只是告诉解释器该值是某种类型。
答案 2 :(得分:0)
对象就像是类的快照。所以它可以随时间变化。换句话说,它可以在状态上变化并且可以在不同状态下表现不同。对象也可以容纳其他对象。在您的示例中,nnn具有状态,但它不显示任何行为
答案 3 :(得分:0)
Java背后的逻辑非常简单。可以将对象称为类的实例,该类是从其层次结构中的java.lang.Object类派生的。
如果是char int或long等原语,则不会继承继承。
这样做的结果是,在任何java对象上,您都可以调用方法toString()。这背后的关键是你告诉一个对象执行一些动作。你无法告诉原始人做某事。
但是,对象的概念并不是由任何语言定义的。这更像是范式方面。