黑马程序员技术交流社区

标题: 这是为什么? [打印本页]

作者: 思绪    时间: 2014-4-22 22:50
标题: 这是为什么?
public class A
{
        String str = new String("good");
        char[] ch = {'a','b','c'};
        public static void main(String[] args){
                A a = new A();
                a.change(a.str,a.ch);
                System.out.print(a.str + "and");
                System.out.print(a.ch);
        }

        public void change(String str, char[] ch){
                str = "test ok";
                ch[0] = 'g';
        }
}
为什么最后的结果会是 good and gbc
为什么字符数组不是打印成[@12345455的形式


作者: 爱翚    时间: 2014-4-22 23:08
System.out.print(char[]);这个是System.out.print中自带的,输出时本身就支持直接打印字符数组。
但System.out.print中没有System.out.print(int[]);这个函数,所以打印System.out.print(int[]);时会输出地址值。
作者: 今生无憾    时间: 2014-4-22 23:23
第一个问题,是关于参数的值传递和引用传递问题,建议你去回顾一下;
第二问题,print方法调用的不是char.toString,也就不是hashcode;这是print方法的机制,你可以去看看源代码,print输出时,把里面所有类型的对象都转换为String类型来进行输出。print源代码针对八大基本数据类型和String类型进行的方法重载。也就是写了九个print方法;源代码有针对 char数组的输出作处理,其实就是当输出参数为char数组时,把它写入输出流输出;看起来就是转成了String类型输出了;
      因为print方法没有针对对象的输出方式,这就是为什么当输出对象时,调用的的是该对象的toString 方法了。
作者: 官珺伟    时间: 2014-4-23 00:11
  1. public class A
  2. {
  3.         String str = new String("good");
  4.         char[] ch = {'a','b','c'};
  5.         public static void main(String[] args){
  6.                 A a = new A();
  7.                 a.change(a.str,a.ch);
  8.                 System.out.print(a.str + "and"); //a.str的值是good
  9.                 System.out.print(a.ch);
  10.         }

  11.         public void change(String str, char[] ch){
  12.                 str = "test ok";
  13.                 ch[0] = 'g';  //原来是abc,改变0角标元素,就变成gba了
  14.         }
  15. }
复制代码


为什么字符数组不是打印成[@12345455的形式?
[@12345455的形式是 数组的哈希地址值。System.out.print(char[]);这个是System.out.print中自带的,输出时本身就支持直接打印字符数组。
但System.out.print中没有System.out.print(int[]);这个函数,所以打印System.out.print(int[]);时会输出地址值。



作者: 四川男人    时间: 2014-4-23 00:13

public class A
{
         String str = new String("good");
         char[] ch = {'a','b','c'};
         public static void main(String[] args){
                 A a = new A();
                 a.change(a.str,a.ch);
                 System.out.print(a.str + "and");
                 System.out.print(a.ch);
         }

         public void change(String str, char[] ch){  //关键在这里:
                 str = "test ok";
                 ch[0] = 'g';
         }
}

首先在堆内存中开辟空间给对象a,对象a中又开辟一块空间放着str和ch数组。
然后change方法进如栈内存,在栈内存中修改str变量的值,ch[0]通过脚标访问到了堆内存,将0脚标的字符改成g。
只要栈内存改动没有访问到堆,堆内存中的数据不会改变,str是作为变量值被修改,ch[0]是被访问了堆内存。
当后面输出的时候,str对象和ch数组指向堆内存的地址不变,通过a对象调用堆中的数据,所以输出是这样
String很特别,当new的时候,它保存的是一个对象的地址,调用的时候是作为变量,并不改变堆中的数据
ch【0】修改的是char数组在堆内存中0脚标的值,change方法过后堆内存中也改变了。所以输出的时候,内容是gbc

作者: 田富丰    时间: 2014-4-23 00:18
第一个问题:String字符串一旦被创建就无法改变,这个字符串是放在常量池中,而你那个函数中是在常量池中新建了一个字符串,并没有引用指向,因此打印的还是good
第二个问题:应该和楼上说的一样!!
作者: 清风夜独醉    时间: 2014-4-23 00:57
简单的说就是java对print方法进行了重载,也就是说java中本来就有print(char[] )和print(String)这两个方法。

入参为字符数组时返回值就是字符数组的内容,而不是字符数组的地址。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2