2014.2.14日,这一天是一个较为特殊的日子。不仅因为它是西方情人节还因为这是19年才一次的农历元宵节和夏历情人节同一天呢。对于屌丝的程序员来说,当然还是过元宵节更好,因为没有对象,但也会有人想方设法。。。没对象就NEW一个。
程序员眼里的对象和现实生活中的对象是一个概念么?有时候是,有时候不是。
根据汉语词典里的解释:对象,指行动或思考时作为目标的事物或特指恋爱的对方等含义。情人节里的对象毋庸置疑就是特指恋爱的对方。而这个释义的前者可能就和程序员(java OOP)眼里对象颇有些相似。只是在这里就不应该是行动和思考了而应该是引用了吧。
(接下来的对象都是程序员(java OOP)眼里的对象)
首先呢,闲谈一下什么是对象。
对象?什么都可以是对象,但凡是在现实生活中只要是一个具体的物体或者具体的事物就是一个对象。通俗的来说就是只要是你眼睛能看到的,手能感触到的,。。。都是对象。比如一台DELL Inspiron15R笔记本,一辆奥迪 A6L 3.5T轿车,一个一笑满脸酒窝说话大大咧咧的男孩子。。。只要是特定到具体的某一个的实物,便就是对象。然而在生活中我们是如何来描述一个对象的呢?
某一台电脑:
特征:型号,品牌,形状,大小,重量,...
功能,用途,行为:编程,玩游戏,打字,聊天,....
某一个人:
特征:外貌,性格,学历,专业,职业,姓名,年龄,身高,体重,性别,...
行为:走路,思考,吃饭,睡觉,学习,玩,...
也就是说对象不仅有其特征还应该会有他的功能或者行为。(行为就可以转变成功能)
接下来讲一下对象和对象引用的区别。
在某些书上会把这两个概念混为一体,但其实不然。
为便于说明,我们来用一个代码来举例。
// 创建一个学生对象
Student st1 = new Student();
拆开:
Student st1;// 声明一个Student类型的变量st1
st1 = new Student();// 将st1这个变量名指向新建的一个Student对象
// st1这个变量名以后就指代着Student类的具体的一个对象
1.”new Student()”是以Student类为模板,在堆空间里创建一个Student类对象
(也简称为Student对象)。
2.末尾的()意味着,在对象创建后,立即调用Student类的构造函数,对刚生成的对
象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造
函数。
3.左边的“Student st1”创建了一个Student 类引用变量。所谓Studnet类引用,就是以
后可以用来指向Student对象的对象引用。
4.“=”操作符使对象引用指向刚创建的那个Student对象。
也就是说有两个实体:一是对象引用变量,一是对象本身。
为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳,可以用来系汽球。
如果只执行了第一条语句,还没执行第二条,此时创建的引用变量st1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在st1这根绳上。我们抓住这根绳,就等于抓住了那只汽球。
再来一句:
Student st2;
就又做了一根绳,还没系上汽球。如果再加一句:
st2 = st1;
系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,st2也指向了st1所指向的对象。两根绳系的是同一只汽球。
如果用下句再创建一个对象:
st2 = new Student();则引用变量st2改指向第二个对象。
从以上叙述再推演下去,我们可以获得以下结论:(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。
如果再来下面语句:
st1 = st2;
按上面的推断,st1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。(部分内容转载至网易博客)
分享到:
相关推荐
如果构造函数没有返回任何值或者返回的是一个基本数据类型的值(如数字、字符串、布尔值),那么new表达式的结果就是这个新创建的对象。 4. 链接原型(__proto__) 在创建对象之后,JavaScript会自动将这个新对象的_...
例如,如果你有一个类`Person`,你可以使用`new`创建一个`Person`对象: ```cpp Person* p = new Person(); ``` 这段代码会调用`Person`的默认构造函数来初始化新分配的对象。同时,`new`还会自动处理对齐问题,...
在 JVM 的角度看,使用关键字 new 创建一个类的时候,这个类可以没有被加载。但是使用 newInstance() 方法的时候,就必须保证这个类已经加载和连接了。这两个步骤正是 Class 的静态方法 forName() 所完成的。 因此...
这个新对象并没有继承任何已有的属性或方法,它是一个完全空白的对象。 2. 绑定原型:在这个新创建的对象中,有一个非常重要的内部属性叫做[[Prototype]],它指向了构造函数的prototype属性。这意味着通过构造函数...
如果我们声明了一个引用变量但并未给它分配任何对象,那么这个引用变量就称为“空引用”或“未初始化的引用”。 ```java A a2; ``` 在这里,`a2`就是一个空引用,它没有指向任何对象,其值为`null`。尝试访问...
这个过程也被称为对象的构造,因为它调用了类的默认构造函数(如果没有定义,则会提供一个无参数的构造函数)。 2. **调用带参数的构造函数** 类可以有多个构造函数,每个构造函数有不同的参数列表。使用`new`...
构造方法是类的一个特殊方法,它的主要任务是在创建对象时初始化成员变量。在C#中,构造方法的名字必须与类名相同,并且没有返回类型,即使是void也不行。例如: ```csharp public class MyClass { public int ...
上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...
"Java new一个对象的过程实例解析" Java新建对象的过程是一个复杂的过程,涉及到类加载、链接、初始化和对象创建等多个阶段。在这篇文章中,我们将详细介绍Java新建对象的过程,并通过示例代码对每个阶段进行了详细...
`new`关键字用于在运行时为对象分配内存,并返回一个指向该内存的指针。它还会自动调用构造函数来初始化对象。相反,`delete`用于释放由`new`分配的内存,并调用析构函数。在C语言中,我们没有这样的内置机制,但...
当使用`new`关键字创建一个对象时,即使对象引用超出作用域,对象本身仍然存在于内存中,直到没有其他引用指向它。例如: ```java { String s = new String("a string"); // s指向的对象超出作用域后仍存在于内存...
例如,如果我们定义了一个Person构造器,直接调用Person()并不会创建一个新对象,而是执行构造器函数内部的代码,并且因为没有返回值或者返回值是undefined,所以不能得到一个对象实例。 ```javascript function ...
在Java编程语言中,对象克隆是一种创建一个与原对象具有相同数据的新对象的过程。对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现...
- **New** 建立的是一个对象,可以直接通过对象的方式来访问其成员变量和方法,而不仅仅是通过指针访问内存。 - **Malloc** 分配的只是一块内存区域,通常需要通过指针来访问这块内存,并且可以在内存中移动指针。 ...
例如,一个String类型的句柄s,可以用来操作字符串对象,但仅持有句柄而不创建对应的对象会导致运行时错误,因为句柄没有连接到任何实际的对象。初始化句柄时,通常需要使用`new`关键字创建一个新的对象,如`String ...
在上述代码中,`MyClass`是一个简单的类,包含一个私有属性`name`和一个构造器用于初始化`name`,以及一个`display`方法用于展示对象的状态。 **实例化过程**: 1. **声明对象**:首先,你需要声明一个对象变量,...
在这个例子中,`MyClass` 是一个类,`new MyClass()` 创建了一个`MyClass`的实例,但由于我们没有将其赋值给任何变量,这个实例就成了一个匿名对象。匿名对象一旦创建,就无法再次引用,因为它没有名字。 匿名对象...
元对象系统的关键组件是`QMetaObject`类,它存储了关于一个类的元数据,如类名、父类名、方法、信号和槽等。 要实现动态创建对象,我们通常会遵循以下步骤: 1. **注册类**:首先,你的类需要继承自`QObject`或者...