Java:对象与对象引用的区别

Java对象与Java对象引用的区别

首先,什么是对象

  • 现实世界中,随处可见的一种事物就是对象,对象是事物存在的实体,比如人类,书桌,计算机,旺仔QQ糖。
  • 人类解决问题的方式总是将复杂的事物简单化,于是就会思考这些对象是由哪些部分组成的。通常都会将对象分为两个部分,即动态部分与静态部分。
  • 静态部分,简单来说就是不可动的部分,我们称之为“属性”,任何一个对象都会具备其属性。你比如人,具有身高,体重,年龄等属性。
  • 一个人也可以唱跳RAP篮球,这些是这个对象所具备的行为(动态部分),我们通过观察对象的属性和行为来了解对象。

Java:对象与对象引用

为了便于后面的分析,首先我创建一个Demo类:

public class Demo{//Demo是演示的意思哈
int book;
int pencil;
int ruler;
}

有了这个模板,咱们就可以创建对象了:

Demo example=new Demo();

一般,我们就把这样叫做创建了一个对象,然鹅真相不止这么简单——
这条语句包含了四个动作:
(1)首先,右边的new Demo,是以Demo类做模板,在堆空间里创建了一个Demo类对象
(2)末尾的()意味着,对象创建之后,立即调用Demo类的构造函数,对刚生成的对象进行初始化, (构造函数是一个与类同名的方法,对象的创建就是通过构造函数完成的,每当实例化一个对象时,类都会自动调用构造函数) 构造函数是得有的,如果没有编译器也会自动创建一个不带参数的默认构造函数
(3)左边的Demo example创建了一个Demo类引用变量。所谓Demo类引用,就是以后可以用来指向Demo对象的对象引用。
(4)=运算符则使对象引用指向了刚刚创建的Demo对象
我们当然也可以将这条语句拆成下面这样:

Demo example;//创建对象引用
example=/*将对象引用指向对象*/new Demo();//创建对象
栈内存堆内存
第一步:Demo example;声明对象引用;存储在栈内存第二步:example=new Demo();创建对象,存储在堆内存中

之后,第三步:用等号将对象引用指向对象

并且,我们有以下的结论:
(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);
(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。
你看下面的代码:

Demo example1;
example1=new Demo();
Demo example2;
example2=example1;

这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,example2也指向了example1所指向的对象。
那如果有:

example2=new Demo();//创建了第二个对象

则引用变量example2改指向第二个对象

对象创建:Java与c++的区别

与Java不同,C++中的对象也可以在堆栈上创建。
例如,在C++中,可以编写

Class obj; //在堆栈上创建对象

在Java中,可以编写

Class obj; //obj仅仅是一个用于引用内存中实际对象的标识符(not an object)
obj = new Class();// obj refers to the object
  • 在 Java 中,只有当你使用 new 操作符时,才会真正在内存中申请一块空间,创建一个新对象,并将该对象绑定到你所定义的变量名上。其它情况下,要么是将已有对象绑定到某个变量名上,要么就是定义的变量名是个空引用,没有绑定任何对象。
  • 也就是说,定义变量名只是创建了一个新的标识符,跟创建对象没有关系,创建对象必须通过 new 来完成,只有创建对象时才会申请内存空间。
  • 但在 C++ 中,当你定义了一个变量 s 时,即使你没有给它赋值,也意味着你不但创建了一个新的标识符,同时还在栈中申请了对应的内存空间。因此,C++ 中定义的变量名不仅仅是个标识符,还自动关联着栈中的一块内存空间。
  • 而 C++ 中的 new 操作符表示的是在堆中申请内存,因为栈中的内存在运行时期大小是固定且有限的,因此需要动态内存分配的时候就需要用 new 来实现。这类似于 C 里面的 malloc 函数,只不过 new 操作符还封装了其它的操作。
  • 总结:Java 中的变量名仅仅是一个用于引用内存中实际对象的标识符,如果你没给它关联对象,它就为空引用。而 C++ 中的变量名(非指针类型),虽然也是标识符,但却始终关联着实际的内存空间,当我们看到一个变量(非指针类型)时,就知道它代表着一块实际的内存空间。(这段来自于百度知道,我觉得讲的很受用)

加油鸭!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值