`
_大端
  • 浏览: 3256 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

对象引用和对象 String s = new String()

    博客分类:
  • J2se
阅读更多
属于个人收藏

本文出自:http://blog.163.com/luyufen_luise/blog/static/5777392520086230367627/

对象引用与对象的区别

       初学Java时,在很长一段时间里,总觉得基本概念很模糊。后来才知道,在许多Java书中,把对象和对象的引用混为一谈。可是,如果我分不清对象与对象引用,那实在没法很好地理解下面的面向对象技术。把自己的一点认识写下来,或许能让初学Java的朋友们少走一点弯路。
       为便于说明,我们先定义一个简单的类:
Java代码  收藏代码
class Vehicle { 
    int passengers;        
    int fuelcap; 
    int mpg; 

有了这个模板,就可以用它来创建对象:
       Vehicle veh1 = new Vehicle();
通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。
      1)右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。
      2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。
      3)左边的“Vehicle veh1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。
      4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。
我们可以把这条语句拆成两部分:
       Vehicle veh1;
       veh1 = new Vehicle();
效果是一样的。这样写,就比较清楚了,有两个实体:一是对象引用变量,一是对象本身。
       在堆空间里创建的实体,与在数据段以及栈空间里创建的实体不同。尽管它们也是确确实实存在的实体,但是,我们看不见,也摸不着。不仅如此,我们仔细研究一下第二句,找找刚创建的对象叫什么名字?有人说,它叫“Vehicle”。不对,“Vehicle”是类(对象的创建模板)的名字。一个Vehicle类可以据此创建出无数个对象,这些对象不可能全叫“Vehicle”。
       对象连名都没有,没法直接访问它。我们只能通过对象引用来间接访问对象。
       为了形象地说明对象、引用及它们之间的关系,可以做一个或许不很妥当的比喻。对象好比是一只很大的气球,大到我们抓不住它。引用变量是一根绳,可以用来系汽球。
       如果只执行了第一条语句,还没执行第二条,此时创建的引用变量veh1还没指向任何一个对象,它的值是null。引用变量可以指向某个对象,或者为null。它是一根绳,一根还没有系上任何一个汽球的绳。执行了第二句后,一只新汽球做出来了,并被系在veh1这根绳上。我们抓住这根绳,就等于抓住了那只汽球。
      再来一句:
      Vehicle veh2;
就又做了一根绳,还没系上汽球。如果再加一句:
      veh2 = veh1;
系上了。这里,发生了复制行为。但是,要说明的是,对象本身并没有被复制,被复制的只是对象引用。结果是,veh2也指向了veh1所指向的对象。两根绳系的是同一只汽球。
       如果用下句再创建一个对象:
       veh2 = new Vehicle();
则引用变量veh2改指向第二个对象。
       从以上叙述再推演下去,我们可以获得以下结论:(1)一个对象引用可以指向0个或1个对象(一根绳子可以不系汽球,也可以系一个汽球);(2)一个对象可以有N个引用指向它(可以有N条绳子系住一个汽球)。
       如果再来下面语句:
       veh1 = veh2;
按上面的推断,veh1也指向了第二个对象。这个没问题。问题是第一个对象呢?没有一条绳子系住它,它飞了。多数书里说,它被Java的垃圾回收机制回收了。这不确切。正确地说,它已成为垃圾回收机制的处理对象。至于什么时候真正被回收,那要看垃圾回收机制的心情了。
       由此看来,下面的语句应该不合法吧?至少是没用的吧?
       new Vehicle();
不对。它是合法的,而且可用的。譬如,如果我们仅仅为了打印而生成一个对象,就不需要用引用变量来系住它。最常见的就是打印字符串:
       System.out.println(“I am Java!”);
字符串对象“I am Java!”在打印后即被丢弃。有人把这种对象称之为临时对象。
       对象与引用的关系将持续到对象回收。但是,关于这一点,打算在下文“简述Java回收机制”再说。
分享到:
评论

相关推荐

    Java问题宝典2012版

    33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? ...

    跟我学Java-day13-String和StringBuilder.pdf

    day13-String和StringBuilder 1.String类 1.1字符串的比较【理解】 1.1.1==号的作用 比较基本数据类型:比较的是具体的值 比较引用数据类型:比较的是对象地址值 1.1.2equals方法的作用 方法介绍 示例代码 ...

    U8...API...DEMO

    String sPassword = xmlLongin.SelectSingleNode("/LoginInfo/Password").InnerText; String sServer = xmlLongin.SelectSingleNode("/LoginInfo/Server").InnerText; if (!u8Login.Login(ref sSubId, ref sAccID...

    java六大必须理解的问题-来自网络少许有误(非常适合初学者).doc

    我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。 问题二:"=="和equals方法究竟有什么区别? ==操作符专门用来...

    jsp九大内置对象

    如果要动态改变这换个属性值来响应客户,就需要使用Response对象的setContentType(String s)方法来改变contentType的属性值。  格式:response.setContentType(String s);  参数s可取text/html,application/x-ms...

    Java初学者都必须理解的六大问题

     我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。  问题二:"=="和equals方法究竟有什么区别?  ==操作符专门...

    Java当中的String数据类型

     对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理–视String对象为常量(final) 所以对传进来的引用地址所引用的string对象比能直接进行修改,而是...

    java字符串操作大全

     String s=new String(chars);  int len=s.length(); 2、charAt() 截取一个字符  例:char ch;  ch="abc".charAt(1); 返回'b' 3、getChars() 截取多个字符  void getChars(int sourceStart,int sourceEnd...

    对String的深入理解

    语句声明一个类A的引用变量aa[我常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。[ref 句柄、引用与对象] 二、Java中所有的字符串文字[字符串常量]都是一个String的对象。有...

    Java的六大问题你都懂了吗

     所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null.对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。...

    [java]读书笔记整理:一切都是对象

    [后续在说,在程序执行过程中,怎样传递和赋值对象引用]。 事实证明,由new创建的对象,只要你需要,就会一直保留下去。这样。许多C++编程问题在java中就完全消失了,在C++中,最难的问题似乎在于:程序员并不能从...

    corejava-day01-am.zip_Windows编程_Java_

    String 字符串 String 字符串 = char[] + 操作(toUpperCase() 类: 数据+相关的操作... String s = new String("abc") 4 String 的比较 5 String API (字符串的常用方法) 这些方法如果返回String 一般是一个新String对象

    java 面试常问的问题 如何回答

    33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? ...

    DWR开发包常规客户端服务器端面向对象编程

    public String dwrtest(String a, String b, List<String> s,Map<String,String>map) { StringBuilder strbui = new StringBuilder(); strbui.append(a).append(",").append(b).append(","); for (String str ...

    Java面试宝典2011版

    一. Java基础部分 1、一个".java"源文件中是否可以包括多个类(不是内部类)?...33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23

    Java面向对象程序设计.doc

    《Java面向对象程序设计》模拟试题(A卷)赞赞 " " " " "《Java面向对象程序设计》模拟试题(A卷) " "专业年级:学号: 姓名: 日期: " "一、判断题(15') " "1.Java程序里,创建新的类对象用关键字new,回收无用的...

    【05-面向对象(下)】

    •==和equals比较运算符:==要求两个引用变量指向同一个对象才会返回true。equals方法则允许用户提供自 定义的相等规则。 •Object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要...

    C# for CSDN 乱七八糟的看不懂

    C#(WINFORM)学习 一、 C#基础 基础 类型和变量 类型和变量 类型 C# 支持两种类型:“值类型”和“引用类型”。值类型包括简单类型(如 char、int 和 float 等)、枚举类型和结构类型。引用类型包括类 (Class)类 ...

    跨项目调用webservice接口

    Service s=new ObjectServiceFactory().create(ReleaseService.class); XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire()); System.out.println("url="+url); try { ...

Global site tag (gtag.js) - Google Analytics