之前老师在课堂上讲过关于Java的引用,但是很遗憾,木有认真听啊,所以就在学习Java的过程中迷惑迷惑。。。最近好像明白一点Java的引用是怎么回事了。以下仅是我个人的理解,如果不对,还请不吝赐教。

一、String

  String创建的String对象会放入到一个String池子里,对于一些可以共享的字符串对象,会先在String池子中查找是否存在相同的String内容(字符相同),如果有就直接返回,而不是直接创建一个新的String对象,以减少内存的耗用。

  

	String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1==s2); //true
System.out.println(s1==s3); //false

  s1、s2、s3都是变量,他们只是引用了String池子里的对象(除了8中基本数据类型,其他都是引用!),对于s2,因为检测到“Hello”已经在池子中存在,所以直接指向之前创建的“Hello”,而s3是强制在池子中创建了一个新的String对象。。。在Java中,除了8种基本数据类型,使用“==”是用于比较对象在内存中的地址,通过“s1==s2”、“s1==s3”?即可看到s1和s2都指向了同一个String对象,而s3则与s1、s2没有任何关系!

  还有一个应该注意的问题就是:一个字符串对象一旦被配置,他的内容就会固定不变。之前我还在想,既然s1和s2都指向同一个对象,那么改变s1的值,s2的值是否也会跟着改变呢?试一下吧:

    String s1 = "Hello";
    String s2 = "Hello";
    s1="HelloWorld";
    System.out.println(s1);    //Hello
    System.out.println(s2);    //HelloWorld

  结果显示改变s1的值s2并没有改变啊,并没有什么卵用,哈哈,转而一想还是那句话的问题啊,”一个字符串对象一旦被配置,他的内容就会固定不变“!!!!!s1指向的”Hello“对象本身并没有发生任何根本性的改变,s1只是引用了另一个新的”HelloWorld“对象,放弃了原来的"Hello"而已!通俗一点,我只是和原来的女朋友(”Hello“)分手了,从新找了一个女朋友(“HelloWorld”),所以呢,"Hello"变成了前女友,从此陌路没有交集,她的其他事情自然管不着了吧,所以呢对s2一点影响都没有!

  然而,对于其他的自定义对象,那就不像String对象那样啦。。

二、对象

  先上代码:

public class Person {
private String name;
private String gender; public Person(){ }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Person(String name,String gender){
this.name = name;
this.gender = gender;
}
@Override
public String toString() {
return "姓名:"+name+" 性别:"+gender;
}
public static void main(String[] args){
Person p1 = new Person("王凯","男");
Person p2 = p1;
System.out.println(p1); // 姓名:王凯 性别:男
System.out.println(p2); // 姓名:王凯 性别:男
System.out.println(p1==p2); // true
p2.setName("王可爱");
System.out.println(p1); // 姓名:王可爱 性别:男
System.out.println(p2); // 姓名:王可爱 性别:男
	}
}

 

  p1和p2变量都指向了Person对象,改变p2的属性,从结果可以看到,p1也跟着被改变了耶,所以用户自定义对象与String对象不同,String对象创建后值便不可变,所谓的改变,只是更改了变量的引用,无非是指向了一个新创建的String对象,但是用户自定义对象可以改变,p1与p2在代码中目前为止都是引用同一个对象,改变其中一个,就会对对象有所改变,所以另一个也会跟着改变啦!(理解Java的引用非常重要,慢慢体会吧!)

关于Java 里的String和对象的更多相关文章

  1. JAVA里的String、Timestamp、Date相互转换(转)

    转自:http://blog.sina.com.cn/s/blog_6675493d0100lbfl.html Timestamp转化为String: SimpleDateFormat df = ne ...

  2. JAVA里的String、Timestamp、Date相互转换

    Timestamp转化为String: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义 ...

  3. Java里的String类为什么是final的

    今天在看<图解设计模式>,里面出了一个问题“String类用final修饰,导致它无法被继承(扩展),这样做违反了开闭原则,这么做有什么正当理由?” 答案是效率和安全性  首先是效率,由于 ...

  4. 你真的了解JAVA里的String么

    Java中String类细节问题 (考察点Java内存分配问题) 1. String str1 = "abc";   System.out.println(str1 == &quo ...

  5. java 里面的string 和byte[] 怎么互转

    public class TestBytes { private static String FORMAT = "UTF-8"; public static void main(S ...

  6. Java编程里的类和对象

    像我们搞计算机这块的,都知道这么一件事,当前的计算机编程语言主要分为两大块,一为面向过程,二为面向对象.Java就是一门纯面向对象的语言.学习了一个月左右的Java,在下对于Java当中的类和对象有了 ...

  7. java里String类为何被设计为final

    前些天面试遇到一个非常难的关于String的问题,"String为何被设计为不可变的"?类似的问题也有"String为何被设计为final?"个人认为还是前面一 ...

  8. Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!

    写在前面 最近小伙伴加群时,我总是问一个问题:Java中的String类占用多大的内存空间?很多小伙伴的回答着实让我哭笑不得,有说不占空间的,有说1个字节的,有说2个字节的,有说3个字节的,有说不知道 ...

  9. java里的基本数据类型

    java里一共有八大数据类型 boolean(未定) char(2字节) byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节), ...

随机推荐

  1. string类里find的用法

    #include<bits/stdc++.h> using namespace std; typedef long long ll; //int INF=(1<<31)-1; ...

  2. Android -- 启动另外一个Activity的方式(2s自动启动)

    1.  使用Handler  并且可以设置进入和退出的动画效果 Class < ? > activityClass; Class [ ] paramTypes = { Integer.TY ...

  3. 简单说说call 与apply

    Function.call() 将函数作为对象的方法调用,例如:function.call(thisobj,args,........); thisobj  调用function的对象.在函数主体中, ...

  4. 启动mysql服务 报1067 错误

    启动mysql 报1067 错误         一般报1067错误,先看一下data/my.ini配置文件 中的路径 datadir ,log-bin ,log-error 报1067错误原因 多种 ...

  5. ZeroMQ接口函数之 :zmq_msg_data - 返回消息内容的指针

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_data zmq_msg_data(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq ...

  6. 最小生成树のprim算法

    Problem A Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  7. Android 双卡双待识别

    简介 Android双卡双待已经越来越普及了,解决双卡双待管理是广大手机开发人员必须得面对的问题,为实现Android平台的双卡双待操作,笔者研究了Android 应用层操作双卡双待的机制. 机制 获 ...

  8. 普通用户ssh无密码登录设置

    这段时间在做Hadoop的环境配置,用root用户只需要按照一定的步骤进行操作就可以直接实现无密码登录,但如果使用新建用户,怎么尝试都不行. 本帖大部分都是其他人帖子的内容.如果按照下面的步骤还是不能 ...

  9. Python之路第一课Day1--随堂笔记

    课堂大纲: 一.Python介绍 二.发展史 三.Python 2 or 3? 四.安装 五.Hello World程序 六.变量 七.用户输入 八.模块初识 九..pyc是个什么鬼? 十.数据类型初 ...

  10. ccf模板生成

    问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的.例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 而当用户为 Jerr ...