Java_习题解答

  遇到的java习题,记录下来。以下是一些题目和较好的解答。

  1.

public class Example{  String str=new String("good");  char[]ch={‘a‘,‘b‘,‘c‘};  public static void main(String args[]){  Example ex=new Example();  ex.change(ex.str,ex.ch);  System.out.print(ex.str+"and");  System.out.print(ex.ch);}public void change(String str,char ch[]){  str="test ok";  ch[0]=‘g‘;}}

输出结果为:good and gbc解答如下: 

public class Example{               // 我来分析一下内存分配情况吧!  
String  str= new String("good");   //String str 时,把str引用放在栈空间,值为null , 当new String 时 ,在堆空间生成一个 good ,并且Str指向它!   
char[]ch={‘a‘,‘b‘,‘c‘};  //char[]ch 时,把ch 引用放在栈空间,在堆空间生成一个数组 a,b,c 并且ch 指向它们
public static void main(String args[]){        
Example ex=new Example(); //Example ex 时,把 ex 引用放在栈空间, 当new Example 时 , 
//在堆空间生成一个对象 并且 ex 指向它 ,没有任何属性值,因为你没有写构造函数
ex.change(ex.str,ex.ch);  // 调用 方法 ,看方法分析!               
System.out.print(ex.str+"and");     
System.out.print(ex.ch);
}   
public void change(String str,char ch[]){      
// 可能这里你会误会 ,这里的str 不同于 外面的 str ,   
// 这里的意思是, String str 在栈空间 ‘新建‘ 一个str , 其实那里已有一个 str ,就是上面那个   
// 他们两个并不一样 ,这个str 是局部变量,依赖于方法 , 只要方法结束,它就自动消亡,而外面那个还在,   
// 所以这里就是 ,把外面的 str 传进来,把值赋给 这个 str ,此时两个都是 ‘‘good‘‘      // 而char [] 分析则不同  ,    
// 请先 记住 ,ch [0],ch[1] ,ch[2] ...都是存在堆空间的 ,即是他们的地址空间,    
// 对于这种引用类型的变量(例如数组,对象),他们其实是把传进来的值直接放在引用地址.   
// 即 ch[0] 始终只有一 个,并且指向堆空间,参数传进来也是在堆空间里面。           
str="test ok";     
// 然后执行这一步时 , 这里面的str值就变化了 ,即变为 test ok , 请记住此时在栈空间是有两个 str 哦      
// 外面依然是 good , 可里面的 变成 test ok , 好的 ,继续 ...
           
ch[0]=‘g‘;

// 据上面分析,很显然 , ch[0] 始终是一个 ,并且存放和修改都是直接在堆空间, 所以这里ch[0]变成 ‘g‘

}
// 好,这个方法终于运行结束 , 重点来了, 到这里 谁 死掉了 , 就是这里面那个 依赖于方法存在的局部变量 str  
 // 那么现在一共就只有一个 str ,并且它的值为 good ,当接下去控制台输出的时候调用 str ,    // 你说还会调用那个死了的 str 吗, 显然 调用 还存在的 str  即是 good

}

// 其实 , 假如想看明白,你可以这样 , 把方法里面的 str , 改为 this.str .   
// 你就能够区分  : 原来他们真是 两个 str ,而使用 this (本类) 调用的才是成员变量!   
// 不依赖方法 ,就是命硬 , 死不了 !  
// 这样分析, 你懂了吗 ?

时间: 2024-11-10 14:26:59

Java_习题解答的相关文章

《C++编程思想》 第十三章 继承和组合 (原书代码+习题+解答)

一.相关知识 使用其他人已经创建并调试过的类: 关键是使用类而不是更改已存在的代码.这一章将介绍两种完成这件事的方法.第一种方法是很直接的:简单地创建一个包含已存在的类对象的新类,这称为组合,因为这个新类是由已存在类的对象组合的. 第二种方法更巧妙,创建一个新类作为一个已存在类的类型,采取这个已存在类的形式,对它增加代码,但不修改它.这个有趣的活动被称为继承,其中大量的工作由编译器完成.继承是面向对象程序设计的基石,并且还有另外的含义,将在下一章中探讨. 对于组合和继承(感觉上,它们都是由已存在

《C++编程思想》 第十一章 运算符重载 (习题+解答)

一.相关代码 1. /*运算符重载语法*/ /*OPOVER.cpp*/ /*这两个重载的运算符被定义为内联成员函数.对于二元运算符,单个参数是出现在运算符 右侧的那个.当一元运算符被定义为成员函数时,没有参数.成员函数被运算符左侧的对象调 用. 对于非条件运算符(条件运算符通常返回一个布尔值),如果两个参数是相同的类型,希 望返回和运算相同类型的对象或引用.如果它们不是相同类型,它作什么样的解释就取决于程 序设计者.用这种方法可以组合复杂的表达式: K += I + J ; 运算符+号产生一个

Accelerated C++习题解答

前言 <Accerlerated C++:Practical Programming by Example> 作者:(美)Andrew Koenig Barbara E. Moo 这是一本非常经典的C++书籍,大牛刘伟鹏(http://blog.csdn.net/pongba/article/details/1930150)也在其博客对其给了很高的评价,豆瓣以及各大论坛都将此书列为C++经典书籍.但是大多数人在学习此书的时候只看正文内容二忽略了其课后的练习题,或者虽然注意到练习题,但是苦于没有

孟道骥《代数学基础》2.1&quot;分式域&quot;习题解答

1.试问一个域$\mathbb F$的分式域是什么? 解答    由于$\mathbb F$的分式域是包含他的最小的域,而$\mathbb F$本身已是域,所以说$\mathbb F$的分式域就是自己. 2.证明Gsuss整数环$\mathbb Z[\sqrt{-1}]$是交换整环,并求其分式域? 证明    由于$\mathbb Z[\sqrt{-1}]=\{a+b\sqrt{-1}|a,b\in\mathbb Z\}\subset\mathbb C$,容易验证其满足子环的两个条件,因此$\m

C和指针 (pointers on C)——第四章:语句(下)习题解答

题目请见 http://download.csdn.net/download/wangpegasus/5701765 第四章以下通过VS2012 1. #include "stdafx.h" double sqrt(double temp) { double before, after; before = 1.0; after = 1.0; do { before = after; after = (before + temp/before)/2; } while (before !=

《C++编程思想》 第十二章 动态对象创建 (习题+解答)

一.相关知识点 重载new和delete 当创建一个new表达式时有两件事发生.首先,使用运算符new分配内存,然后调用构造函数.在delete表达式里,调用析构函数,然后使用运算符delete释放内存.我们永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配函数运算符new和delete. 被new和delete使用的内存分配系统是为通用目的而设计的.但在特殊的情形下,它不能满足我们的需要.改变分配系统的原因是考虑效率:我们也许要创建和销毁一个特定的类的非常多

《C++编程思想》第八章 内 联 函 数 (知识点+习题+解答)

一.相关知识点 任何在类中定义的函数自动地成为内联函数,但也可以使用inline关键字放在类外定义的函数前面使之成为内联函数.但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待.因此 inline int PlusOne(int x); 没有任何效果,仅仅只是声明函数(这不一定能够在稍后某个时候得到一个内联定义).成功的方法如下: inline int PlusOne(int x) { return ++x ;} 在头文件里,内联函数默认为内部连接--即它是 stat

《C++编程思想》 第七章 常 量 (习题+解答)

一.相关知识点        在 C语言中可以选择这样书写: const bufsize:        这样写在C++中是不对的,而 C编译器则把它作为一个声明,这个声明指明在别的地方有存储分配.因为C默认const是外部连接的, C++默认const是内部连接的,这样,如果在 C++中想完成与C中同样的事情,必须用extern把连接改成外部连接: extern const bufsize;//declaration only 这种方法也可用在C语言中. 指向const的指针 使用指针定义的技

《C++编程思想》第四章 初始化与清除(习题+解答)

相关代码: 1. #include <stdio.h> class tree { int height; public: tree(int initialHeight); ~tree(); void grow(int years); void printsize(); }; tree::tree(int initialHeight) { height = initialHeight; } tree::~tree() { puts("inside tree destructor&quo