zoukankan      html  css  js  c++  java
  • 关于Java 里的String和对象

      之前老师在课堂上讲过关于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的引用非常重要,慢慢体会吧!)

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/FancyLian/p/5713107.html
Copyright © 2011-2022 走看看