1、String的引用:

下列代码执行后的结果为:

  1. public class Test {
  2. public static void main(String[] args) {
  3. StringBuffer a = new StringBuffer("A");
  4. StringBuffer b = new StringBuffer("B");
  5. operator(a, b);
  6. System.out.println(a + "," + b);
  7. }
  8. public static void operator(StringBuffer x, StringBuffer y) {
  9. x.append(y); y = x;
  10. }
  11. }

正确答案是:AB,B

解析:

    执行StringBuffer a = newStringBuffer("A");    StringBuffer b = newStringBuffer("B"); 后
内存中的状态如下图所示:
 
执行
publicstaticvoidoperator(StringBuffer x, StringBuffer y) { 
    x.append(y); y = x; 
}
进入如下方法后,内存中的状态为:
 
 x.append(y);
这条语句执行后,内存的状态为:
 
 y = x; 
这条语句执行后,内存的状态为:
 
当operator方法执行完毕后内存中的状态为:因为方法执行完毕,局部变量消除。
 
由内存中的状态,可以知道最后的结果。
 
 
可以这么理解:
 
     a,b是对象的引用,指向堆内存。将a,b两个引用传给x,y,执行x.append(y)方法之后改变了x 引用指向的堆内存的存储内容,变为了AB。y=x,表示引用y指向了引用x指向的存储区域,没有改变引用b指向的存储空间的内容。所以输出为:AB,B
 
 
 
 
 
 
2、String和char数组引用的区别与联系:
 
 
输出正确结果为:
  1. public class Example {
  2. String str = new String("good");
  3. char[] ch = { 'a', 'b', 'c' };
  4. public static void main(String args[]) {
  5. Example ex = new Example();
  6. ex.change(ex.str, ex.ch);
  7. System.out.print(ex.str + " and ");
  8. System.out.print(ex.ch);
  9. }
  10. public void change(String str, char ch[])
  11. {
  12. str = "test ok";
  13. ch[0] = 'g';
  14. }
  15. }
输出为:good and gbc
 
解答:
 
       概念:java传参只有按值传递(也就是把实参的值拷贝给形参,这个值可以是普通的数值,也可以是地址值),java中的对象只能通过指向它的引用来操作,这个引用本身也是变量,不要与C/C++中的传值与传址混淆了,java中没有显式的指针。

      分析:change函数被调用时,第一个形参str接收了类的成员变量str的值(虽然名称都是str,但是却是两个独立的String类型的引用变量),注意这两个str自身都是变量且都指向了堆内存中的String对象"good",当我们在change函数内部将str指向了另一个String对象"test ok"后,类的成员变量str仍然保持指向"good",所以最终打印出来就是"good";对于第二个形参ch,它也是接收了类的成员变量ch的值拷贝,这一点和str没有差别,即两个ch都指向了字符数组{ 'a', 'b', 'c' }的首地址,但是ch[0]表示的是字符数组中'a'的地址,修改了它也就修改了字符数组的第一个元素,这个改变在change函数返回之后也会存在。所以本题中两个形参传参的本质区别在于,修改str只是将形参指向了新的对象,对外部的实参没有任何影响,而修改ch[0]是实实在在的修改了字符数组的首元素。
    
     扩展:
1.可以试验一下,在Example中再定义一个字符数组char[] ch2={'d'};然后在change函数中把ch[0] = 'g';这句改成ch=ch2;,那么就会和str传参一样的,change函数返回后不会对类的成员ch有任何影响。
2.本题和“String类是一个final类,不能被继承”以及“String底层的字符数组被声明为private final char value[];所以其值不能被修改”这些String的特性无关。
 
扩展代码:
  1. public class Example {
  2. String str = new String("good");
  3. char[] ch = { 'a', 'b', 'c' };
  4. char[] ch2={'d'};
  5. public static void main(String args[]) {
  6. Example ex = new Example();
  7. ex.change(ex.str, ex.ch);
  8. System.out.print(ex.str + " and ");
  9. System.out.print(ex.ch);
  10. }
  11. public void change(String str, char ch[])
  12. {
  13. str = "test ok";
  14. ch=ch2;
  15. }
  16. }

输出为:good and abc

 
 
 
3、关于Integer的引用案例:
 
 
下列代码正确输出结果为:
  1. public class Tester{
  2. public static void main(String[] args){
  3. Integer var1=new Integer(1);
  4. Integer var2=var1;
  5. doSomething(var2);
  6. System.out.print(var1.intValue());
  7. System.out.print(var1==var2);
  8. }
  9. public static void doSomething(Integer integer){
  10. integer=new Integer(2);
  11. }
  12. }

正确答案为:1true

 
解析:
来看一张图,
 
下边按照每行来写出注释:
(1)新建了一个引用变量var,指向了堆内存中的1。
(2)将引用变量var1复制给var2,使var2也指向了堆内存中的1。
(3)调用doSomething方法,则新建了一个引用变量integer,也指向了堆内存中的1。
(4)然后执行方法体内容,将integer指向了堆内存中的2。
 
则输出必然为1true。
 
可以看下扩展例子:
 
      当引用对象的内部做了修改,才会影响原对象,如果直接将引用修改了,则对原对象没有影响,唯一的影响就是:这个被修改的引用,现在不是原来对象的引用,而是新对象的引用。
      引用传递指的是传递的时候,传递的是对象的引用。如果对引用的内部成员进行操作,则会直接影响到原对象,但是如果直接把此引用指向了其他对象,那对不起,这个引用从此以后,便与之前的对象没有任何关系,当前代表的仅仅是新指向的对象。

Java基础之引用(String,char[],Integer)总结的更多相关文章

  1. Java基础-字符串(String)常用方法

    Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...

  2. Java基础之引用(String,char[],Integer)总结于牛客网的专项练习题

    1.String的引用: 下列代码执行后的结果为: public class Test { public static void main(String[] args) { StringBuffer ...

  3. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  4. java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别

    在平常工作中使用到char和byte的场景不多,但是如果项目中使用到IO流操作时,则必定会涉及到这两个类型,下面让我们一起来回顾一下这两个类型吧. char和byte的对比 byte byte 字节, ...

  5. 【JAVA - 基础】之String存储机制浅析

    本文主要解决以下几个问题 String源码解析? String和new String的区别? String通过"+"或concat累加时的对象创建机制? StringBuilder ...

  6. java基础学习日志--String、StringBuffer方法案例

    package StringDemo; import java.util.Arrays; /* * 常用String.StringBufer类的方法 */ public class Demo1 { p ...

  7. Java基础笔记之String相关知识

    (二)String Sring 被声明为 final ,因此不可被继承. String的不可变性: 看String的定义(java9版本): public final class String imp ...

  8. Java 基础 - 如何理解String不可变

    ref: https://www.zhihu.com/question/20618891 第一个答案. 扩展“ Java 基础 - System.arraycopy() 浅拷贝 深拷贝

  9. Java基础拾遗(一) — 忽略的 Integer 类

    学习前我们先看一个笔者之前项目踩过的坑 public static void main(String[] args) { Integer a = 127; Integer b = 127; Syste ...

随机推荐

  1. Web Mining and Big Data 公开课学习笔记 ---lecture1

    1.1  LOOK Finding "stuff" on the web or computer or room or hidden in data Finding documen ...

  2. POJ3083 Children of the Candy Corn(Bfs + Dfs)

    题意:给一个w*h的迷宫,其中矩阵里面 S是起点,E是终点,“#”不可走,“.”可走,而且,S.E都只会在边界并且,不会在角落,例如(0,0),输出的话,每组数据就输出三个整数,第一个整数,指的是,以 ...

  3. SQL Server 2016 快照代理过程分析

    概述 快照代理准备已发布表的架构和初始数据文件以及其他对象.存储快照文件并记录分发数据库中的同步信息. 快照代理在分发服务器上运行:SQLServer2016版本对快照代理做了一些比较好的优化,接下来 ...

  4. ThreadLocal中的WeakReference

    在一般的网站开发中,基于Java的Web 框架都使用了ThreadLocal来存储一些全局的参数,在拦截器\Filter中设置变量,让变量可以在任意地方被获取. 一早就了解到里面有用到WeakRefe ...

  5. PHPstorm 函数时间注释的修改

    正常的PHPstorm里面函数方法的注释是没有动态时间设置的,但是看了PHP file里面有时间日期的注释,而PHP Function Doc Comment 却没有,让很多PHPer很头疼,今天在搜 ...

  6. java变量和作用域以及成员变量的默认初始化

    Java中的变量有成员变量和局部变量,定义在类中方法之外的变量成为成员变量或者成员字段(域),表示一个类所具有的属性,定义为类的成员变量的变量的作用于是整个类,该变量在定义的时候不需要初始化,在使用前 ...

  7. ios7 以后准确获取iphone设备的MAC(物理地址)

    通过参考 钉钉 项目,知道是通过wifi拿到路由的MAC地址.那么可不可以拿到iphone 设备的MAC 地址呢? 经过一番搜索,发现所有文章都是针对 ios 7 以前 可以拿到. 而且方法也都是同一 ...

  8. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

  9. WAS集群系列(2):数据库连接低级错误——网络连接问题

    环境 项目点 指标 WAS版本号 7.0 应用server操作系统 Windows 2008 应用server系统位数 64bit 数据库server操作系统 CentOS 5.6 数据库版本号 Or ...

  10. git for c#,子文件的加入

    private static void SubDirFile() { string wkDir = @"E:\DotNet2010\单位project\Git.Client\lib2Test ...