引用对象变量和对象间的关系_白小白有女朋友吗

引用对象变量和对象间的关系_白小白有女朋友吗对于刚接触不久面向对象的真小白童鞋来说,类的对象,对象的实例,对象的引用,引用变量的问题以及莫过于没得对象虽然博主也没得对象,本文将逐个逐个讲解!1.何谓对象?在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一。要理解什么是对象,需要跟类一起结合起来理解。下面这段话引自《Java编程思想》中的一段原话:“按照通俗的说法,每个对象都是某个类(class)的…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

对于刚接触不久面向对象的真小白童鞋来说,类的对象,对象的实例,对象的引用,引用变量的问题以及莫过于没得对象虽然博主也没得对象,本文将逐个逐个讲解!

1.何谓对象?

在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一。要理解什么是对象,需要跟类一起结合起来理解。下面这段话引自《Java编程思想》中的一段原话:

“按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词。”

从这一句话就可以理解到对象的本质,简而言之,它就是类的实例,比如所有的人统称为“人类”,这里的“人类”就是一个类(物种的一种类型),而具体到每个人,比如张三这个人,它就是对象,就是“人类”的实例。

2.何谓对象引用?

我们先看一段话,这段话同样来自于《Java编程思想》:

“每种编程语言都有自己的数据处理方式。有些时候,程序员必须注意将要处理的数据是什么类型。你是直接操纵元素,还是用某种基于特殊语法的间接表示(例如C/C++里的指针)来操作对象。所有这些在
Java
里都得到了简化,一切都被视为对象。因此,我们可采用一种统一的语法。尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“引用”(reference)。”

很显然,从这段话可以看出对象和对象引用不是一回事,是两个完全不同的概念。举个例子,我们通常会用下面这一行代码来创建一个对象:

 Person per = new Person("张三");

Jetbrains全家桶1年46,售后保障稳定

有小白童鞋会说,这里的per是一个对象,是Person类的一个实例。也有小白童鞋会说,这里的per并不是真正的对象,而是指向所创建的对象的引用。到底哪种说法是对的?我们先不急着纠结哪种说法是对的,再看两行代码:

 Person person;
  person = new Person("张三");

这两行代码实现的功能和上面的一行代码是完全一样的。大家都知道,在Java中new是用来在堆上创建对象用的,如果per是一个对象的话,那么第二行为何还要通过new来创建对象呢?

由此可见,per并不是所创建的对象,是什么?上面的一段话说的很清楚,“操纵的标识符实际是指向一个对象的引用”,也就是说per是一个引用,是指向一个可以指向Person类的对象的引用。真正创建对象的语句是右边的new Person("张三");因此这里的per是一个引用,是指向一个可以指向Person类的对象的引用。

简单来说,对象的引用意思是定义一个变量,这个变量指向的是一个对象

Object  obj=new Object();
//Object:类
//obj:对象的引用
//new Object():对象

3.何谓对象实例?

首先,没有“对象的实例”这一说法,只有类的实例,而类的实例,指的就是类的对象,说白了就是对象。
但是还是有很多人这样叫,那怎么理解对象实例呢?比如说人类中有个叫宜春的程序员,宜春就是人类的一个实例

String s = new String("YiChun");

s 就是 String类中的一个实例

关于对象实例官方没有给其概念,其实有很多概念官方都没有给的,什么父类声明指向子类对象、方法签名等概念都是没有的 ,只是人们经常这么用这么说就习惯了。因此关于实例对象大体可以理解为对象引用的意思

4.何谓引用变量?

引用变量就是用引用类型声明的变量,这种变量叫引用类型变量。如:

People people;  //其中people就是引用变量,People是一个类属于引用类型

5、对象与对象引用碰撞火花

从对象引用出发:

一个对象引用可以指向零个或一个对象

从对象出发:

一个对象可以被一个或多个对象引用

怎么理解捏?小白童鞋脑壳逐渐变大…

5、1. 从对象引用出发:一个对象引用可以指向零个或一个对象

首先先来理解第一句话:从对象引用出发:一个对象引用可以指向零个或一个对象

public static void main(String[] args) { 
   
      Two t; //一个对象引用可以指向零个对象
      t=new Two();//一个对象引用可以指向一个对象
      t=new String();//一个对象引用不可以指向 >1个对象
    }

试想一下这样的代码会出现啥情况?是的,它会编译失败
在这里插入图片描述
看完上面这个例子就能说明了么?我们接着看下面这个代码:

 public static void main(String[] args) { 
   
        String str;
        str=new String("string1");
        str=new String("string2");
    }

我们知道,凡是new都能创建出一个对象,我们发现上面代码String对象引用str一个new了两次,而且上面代码编译也不报错,的的确确是创建了两个对象,那这怎么说?小白童鞋还没说完,把博主按在马桶盖盖上…

别急,我们再看看上面代码输出啥

  public static void main(String[] args) { 
   
        String str; 
        str=new String("string1");
        str=new String("string2");
        System.out.println(str);
    }
    
 运行结果: string2

这说明啥?说明现在str是下一个对象的引用。上一个对象被垃圾回收了,因为上一个对象(也就是string1)不能被再次使用了。因此上面这个程序可以这样理解:

 public static void main(String[] args) { 
   
   String str;//一个对象引用str指向零个对象
   str=new String("string1");//一个对象引用str指向一个对象string1
   str=new String("string2");//注意:这里对象引用str并不是指向第二个对象string2,而是将之前指向第一个对象string1的引用重新指向了另一个对象string2
}

对象引用str并不是指向第二个对象string2,而是将之前指向第一个对象string1的引用重新指向了另一个对象string2,因此从对象引用出发:一个对象引用可以指向零个或一个对象!

这个时候,小白童鞋渐渐松开了把博主按在马桶盖盖上的双手…

5、2. 从对象出发:一个对象可以被一个或多个对象引用

我们再来理解一下第二句话:从对象出发,一个对象可以被一个或多个对象引用

小白童鞋同样不解,于是又用双手把博主按在马桶盖盖上…

看下面这个程序:

   Demo demo1,demo2,demo3;
   demo1=new Demo();
   demo2=demo1;
   demo3=demo2;

怎么理解?看的有点晕?会不会感觉后面两句代码就是对象引用=对象引用…

其实要弄清除这个,首先你得弄清楚java虚拟机内存,弄清楚变量(对象引用)和对象是如何存储的,对象引用是存储在栈内存中,而对象是存储在堆内存中。分析如下:

Demo demo1,demo2,demo3;//创建多个对象引用,都存储在栈中
demo1=new Demo();//创建一个Demo对象,存储在堆中,并将demo1指向这个对象,相当于加了一个链
demo2=demo1;//demo2与demo1一样,都指向堆中Demo对象
demo3=demo2;//demo3与demo2一样,都指向堆中Demo对象

首先,每个对象只有一个地址值,new Demo()是创建了一个对象,demo1是这个对象的地址值,用来找到这个对象,demo2=demo1是把new Demo()这个对象的地址值由demo1改为了demo2,后面的demo3=demo2也是只改变了对象的地址值,对象本身的空间大小都没有变化,变的,是这个对象的地址值,也就是c里面所谓的指针。

这个时候,小白童鞋渐渐松开了把博主按在马桶盖盖上的双手…

最后,我们再看看一个网上关于对象与对象引用很流行的程序与分析,代码如下:

UserType ut = new UserType();  // ut是引用,实际的对象在内存里。
ut = new UserType(); /*现在ut是另一个对象的引用,先前的对象被垃圾回收了(因为先前的对象不能被再次使用了)。*/
UserType ut2;  // 定义了一个引用ut2,他不引用任何对象,不能使用。。。。
ut2 = new UserType(); // 然ut2成为一个对象的引用。
UserType ut3 = new UserType();
UserType ut4 = new UserType();
ut3 = ut4;   // 现在ut3引用ut4的对象,这里不是赋值。。。
int a = 5;
int b = 4;
a = b;  // 这里是赋值。 a b 依然引用不同的对象

6、最后要相信的真理

对于面向对象语言,如java,首先,请小白童鞋相信一句话:一切皆为对象。然后相信另一句话:变量只是一个零时的储存地点。引用类型的变量只是一个普通变量,储存了引用类型的地址。对象的创建是直接在内存中分配一个内存。

最后再梳理一下

引用类型变量 就 相当于 电脑上的快捷方式; 对象就相当于 你 磁盘里面 安装的游戏,它 实实在在 占用你的空间内存; 而变量 只是快捷方式

说白了基本数据类型变量就像是直接放在柜子里的东西,而引用数据类型变量就是这个柜子对应编码的钥匙。钥匙号和柜子对应。

到这里文章就结束了喔,小白童鞋,你何识着咩啊~

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!

欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术…

在这里插入图片描述
小白童鞋关注了我的公众号之后,又用双手把博主按在马桶盖盖上…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213595.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab中imfilter函数是什么意思_matlab中bwlabel函数

    matlab中imfilter函数是什么意思_matlab中bwlabel函数Matlab函数imfill简介函数功能:该函数用于填充图像区域和“空洞”。语法格式:BW2=imfill(BW)这种格式将一张二值图像显示在屏幕上,允许用户使用鼠标在图像上点几个点,这几个点围成的区域即要填充的区域。要以这种交互方式操作,BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠…

    2022年9月13日
    1
  • stm32f103c6t6引脚图_74ls163引脚图及功能表

    stm32f103c6t6引脚图_74ls163引脚图及功能表今天准备画一个STM32F103C8T6的最小系统板,就去STM32F103C8的数据手册查看了一下相应的引脚,因为数据手册里面的引脚表有中容量的多种封装描述,看上去比较麻烦,我就单独做了一个LQFP48脚的引脚表。方便后期自己画封装,就图看的省力一点哈。其部分图片如下所示:有需要的朋友可以从我的资源里去下,资源链接:STM32F103C8T6详细引脚表本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~…

    2022年9月25日
    0
  • pycharm 激活吗【2021最新】「建议收藏」

    (pycharm 激活吗)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
    31
  • 「从零单排canal 07」 parser模块源码解析

    「从零单排canal 07」 parser模块源码解析

    2020年11月19日
    208
  • js 后退刷新[通俗易懂]

    js 后退刷新[通俗易懂]history.back()和history.go(-1)都可以实现返回上一页并不刷新向要页面后退刷新使用:window.location.href=document.referrer;即可实现

    2022年7月25日
    3
  • 公有云和私有云哪种成本更低

    公有云和私有云哪种成本更低​最新调查表明:在虚拟机运行数量相同的情况下,企业使用私有云比公有云更加节省成本。随着企业对私有云和公有云、云服务器的使用经验加深,很多企业表示已经通过实践把握私有云的部署和正确使用,并在成本方面超越公有云。据著名互联网调查研究公司对150位IT决策者调查显示,41%的受访者表示每个虚拟机运行在私有云基础架构比公共云成本更低。在某些情况下,节省的费用非常惊人。9%的受访者表示,他们在私有云运行…

    2022年6月16日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号