真的是一切都是对象?

首先得明确java中的对象存储位置:

1)  寄存器:最快的存储区,在处理器内部,暂时忽略。

2)  堆栈:速度仅次于寄存器,但是得明确规定数据的大小和生命周期,对象的引用存储于其中(java对象不存在此)。

3)  堆:java对象的存储区,无需知道数据大小,生命周期。

4)  静态存储:static来标识的对象存储区。

5)  常量存储:常量值通常直接存放在程序代码内部,他们永远不会被改变。

6)  非RAM,忽略。

StringBuffer stringBuffer=new StringBuffer(“hello, world”),见惯不惯的一个代码段。实际java的操作机制:new StringBuffer(“hello, world”)创建了一个对象,该对象被存储到堆中,其实这个对象我们看不见摸不到。为了能够操作该对象,就有了StringBuffer stringBuffer这样一个引用,这个引用存储在堆栈中,”=”将两者联系在了一起。既然stringBuffer是指向new StringBuffer(“hello,world”)这个对象的,再来个StringBuffer stringBuffer1=stringBuffer,这里其实是引用的赋值而非对象本身的赋值,同理若有stringBuffer1==stringBuffer这样一个语句,也是引用的事。以上都好理解,直到看到Bruce Eckel说:java中的任何传递对象的场合,这里的传递实际上是引用,这不是c中的形参实参的关系么。于是立马敲下代码:

package com.cedric.thinkingInJava.test;class Person{String name;int age;
}public class ReferenceAndArgs {public static void main(String[] args) {Person person=new Person();Person personBeforeChangeAge;setPersonInfo(person);personBeforeChangeAge=person;System.out.println("Before the change:");printPersonInfo(personBeforeChangeAge);System.out.println("After the change:");changeTheAge(person);printPersonInfo(person);printPersonInfo(personBeforeChangeAge);//这里可以认为所有的引用都指向了最初的new Person()这个对象
    }static void setPersonInfo(Person person) {person.name="nerd";person.age=22;}static void printPersonInfo(Person person) {System.out.println(person.name+" "+person.age);}static void changeTheAge(Person person) {person.age++;printPersonInfo(person);}
}

运行结果:

Before the change:

nerd 22

After the change:

nerd 23

nerd 23

nerd 23

从结果上看,的确所有的引用都指向了一个对象。再试一次:

package com.cedric.thinkingInJava.test;
public class test {static void numberIncreaseByOne(String number){number=new String("2");printNumber(number);}static void printNumber(String number) {System.out.println(number);}public static void main(String[] args) {String integer=new String("1");numberIncreaseByOne(integer);printNumber(integer);        }
}

结果是:

2

1

问题出现:String是个对象,那定义的integer和number应该指向同一个对象才对,实际并非如此,它是值传递。这里就回到了最开始的问题:真的是一切都是对象?其实在java里有基本变量,也就是常见的int char,long ,float,double等,他们不用new来创建,他们的值存储在堆栈中,这样可以更高效的运行,说白了他们不是对象。既然不是对象,他们在函数的参数传递时就是值的传递,和c中的实参传递一样。再来看String,google后知道它是封装类,看看它的源码:

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence
{/** The value is used for character storage. */private final char value[];/** The offset is the first index of the storage that is used. */private final int offset;/** The count is the number of characters in the String. */private final int count;
……

里面的final char value[]就可以说明一切了:首先它其实是对char的一个封装而已,char就是基本类型,此外又是final类型,final类型网上看来是存储在常量存储区的。常量存储区的数据时永远不会变的,没有像其他对象一样的引用,所以就有了虽然是对象,但是还是值传递。那么Integer,Float等就可以解释为什么也是值传递了。至于StringBuffer,它的源代码继承了AbstractStringBuffer:

abstract class AbstractStringBuilder implements Appendable, CharSequence {/*** The value is used for character storage.*/char value[];/** * The count is the number of characters used.*/int count;/** * This no-arg constructor is necessary for serialization of subclasses.*/AbstractStringBuilder() {
}

这里的char并非final类型,和String的实现方法并不相同。

虽然知道了类似String这种封装类,但是里面真正的实现机制还是模糊的,下次带着这个问题去看final。

总结:了解了引用,第一次特意去了解StringBuffer stringBuffer=new StringBuffer(“hello, world”)的运行机制,知道了封转类。

转载于:https://www.cnblogs.com/cedric/archive/2012/06/11/2544607.html

对于java引用的总结相关推荐

  1. java回收类_Java的内存回收——Java引用的种类

    1.Java引用的种类 Java是面向对象的编程语言,一个Java程序往往需要创建大量的Java类,然后对各Java类创建大量的Java对象,再调用这些Java对象的属性和方法来操作它们. 程序员需要 ...

  2. java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

    十分钟理解Java中的弱引用,十分钟java引用 本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,帮助大家理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限 ...

  3. java引用 弱引用_了解Java弱引用

    java引用 弱引用 我最近没来得及关注这个博客,最重要的是,我没有为与技术界的所有人保持联系而致歉. 最近,我偶然发现了自Java 1.2起可用的java.lang.ref软件包,但具有讽刺意味的是 ...

  4. Java引用和C++引用

    Java引用和C++引用区别: public class Tester{ public static void main(String[] args){Integer var1=new Integer ...

  5. 4种Java引用浅解

    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型 ...

  6. 多线程与高并发 笔记,非面向初学者 二:java引用,高并发多线程容器,线程池

    网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容 如果右边没有就找找左边 上一节:JUC锁,一些面试题和源码讲解 1.引用 java引用共4种,强软弱虚 强引用:我们普通的new一个对象,就 ...

  7. java引用和指针的区别

    Java的引用和C++的指针的区别 Java的引用和C++的指针都是指向一块内存地址的,通过引用或指针来完成对内存数据的操作,就好像风筝的线轴一样,通过线轴总是能够找到风筝,但是它们在实现,原理作用等 ...

  8. 什么是java引用?

    Java属于入门容易,天花板却极高的编程语言.什么是java引用?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了什么是java引用?等相关问题,希 ...

  9. Java引用数据类型String详解

    Java引用数据类型(String) 引用数据类型概述 引用数据类型与基本数据类型的差别(举例说明) 引用数据类型概述 说到引用数据类型,那么何为引用数据类型? 引用类型,都可以用null值作为值,也 ...

  10. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

最新文章

  1. 计算机事业单位专技岗考什么区别,事业单位管理和专技岗位有什么区别?哪个有前途?...
  2. 虚拟化:IT技术的第三次革命
  3. 将军令:数据安全平台建设实践
  4. python numpy中arange()和linspace()区别
  5. RH413-测试文件的a属性
  6. 虚拟机 搭建LVS + DR + keepalived 高可用负载均衡
  7. LeetCode—37. 解数独(困难)
  8. 【大数据】通过女票的淘宝历程,大白话讲解大数据各个方向的分工
  9. 实现Fragment在ViewPager中滑动
  10. nginx css 304 导致图片丢失_Nginx面试三连问:如何工作?负载均衡策略有哪些?如何限流?...
  11. python-excel 批量输出文件名字与打开excel文件
  12. lol游戏挂机软件_“本不想挂机,但系统不让重连!”LOL成“挂机联盟”,5局3挂机...
  13. atitit.查看预编译sql问号 本质and原理and查看原生sql语句
  14. 互联网晚报 | 7月27日 星期三 | 微信安装包11年膨胀575倍;阿里申请香港纽约双重主要上市;苹果应用商店被曝大量色情应用...
  15. 手动解析App dSYM示例
  16. 轩小陌的Python笔记-Pandas时间序列与日期
  17. 【Linux云计算架构:第三阶段-Linux高级运维架构】第26章——tcp三次握手四次挥手及在局域网中使用 awl伪装MAC地址进行多线程SYN攻击
  18. 照片墙(3D立体几何)
  19. Word另存为PDF时出现“错误!未找到引用源”的解决
  20. H5实现APP下载功能

热门文章

  1. SQL允许你用EXECUTE执行一个变量中定义的SQL语句,并且允许你在被执行的SQL语句中,再次嵌套入一个变量定义的语句,并且再次在其中用EXECUTE执行它...
  2. select元素javascript常用操作(转载)
  3. 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三2-转
  4. mysql 删除 修改密码_MySQL新建用户,授权,删除用户,修改密码
  5. Mysql utf8 和utf8mb4 的区别
  6. [Java] 蓝桥杯ADV-135 算法提高 三角形面积
  7. 简单的busybox创建_用busybox构建一个最小根文件系统
  8. android 4.2 camera gallery2,Android Gallery2 修改双击、手势放大的最大倍数
  9. linux中开启snmp协议
  10. 中国平安云桌面的地址