public class b { String s="aaa";
StringBuffer sb=new StringBuffer("bbb");
void f(b b1, b b2) {
b1 = b2;
}
void f(String str){
s+=str;
}
void f(StringBuffer sb1){
sb.append(sb1);
sb1=sb;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2);
t1.f("ccc");
System.out.println(t1.s);
StringBuffer sb=new StringBuffer("ddd");
t1.f(sb);
System.out.println(sb);
}
}
1、调用t1.f(t1, t2);后为什么t1,t2的地址值还是不同?
2、调用t1.f("ccc");后为什么字符串可以打印“aaaccc"?
3、调用t1.f(sb);后为什么打印sb仍然是”ddd"?
StringBuffer sb=new StringBuffer("bbb");
void f(b b1, b b2) {
b1 = b2;
}
void f(String str){
s+=str;
}
void f(StringBuffer sb1){
sb.append(sb1);
sb1=sb;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2);
t1.f("ccc");
System.out.println(t1.s);
StringBuffer sb=new StringBuffer("ddd");
t1.f(sb);
System.out.println(sb);
}
}
1、调用t1.f(t1, t2);后为什么t1,t2的地址值还是不同?
2、调用t1.f("ccc");后为什么字符串可以打印“aaaccc"?
3、调用t1.f(sb);后为什么打印sb仍然是”ddd"?
解决方案 »
- 关于finalize()函数和GC的小问题
- 将JAVA项目打包成exe能运行,但是将其再打包成安装文件,安装后不能运行
- xslt 如何实现累加
- 请问如何用正则限制字符串的长度?
- 我用java写的遗传算法的严重问题,程序没错,但不知道为什么结果总和预想的不同,实在是困惑,请帮忙啊!!!!
- 如何修改tree中指定行或TreePath的Foreground或Background?急..........................................................
- 哪些大师帮帮我吧!1
- repaint的问题
- 一个文件搜索小工具,实用,有源码
- 请教高手:java 如何调用c/c++的动态链接库(dll, so)?
- 如何对付一些本身不懂编程, 但又不停在叫你快, 叫你今日内搞好所有东西的项目经理?
- LINUX下运行jar问题,在线等。。。急!!!急
2.因为s+=str; (s=s+"ccc"或s="aaa"+"ccc")
3.这个问题要吧这三个问题串起来回答。因为一个是局部变量一个是全局变量。问题2输出的是全局变量的值,问题3输出的是局部变量的值。因为名字相同混淆了你的思维。现在做如下改动。
改动1:public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2); t1.f("ccc");
System.out.println(t1.s); StringBuffer sbb = new StringBuffer("ddd");
t1.f(sbb);
System.out.println(sbb);
}这回看,输出的是sbb而不是sb的值,如果还不明白,请看改动2
改动2:public class b { static String s = "aaa";
static StringBuffer sb = new StringBuffer("bbb"); void f(b b1, b b2) {
b1 = b2;
} void f(String str) {
s += str;
} void f(StringBuffer sb1) {
sb.append(sb1);
sb1 = sb;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2); t1.f("ccc");
System.out.println(t1.s); StringBuffer sbb = new StringBuffer("ddd");
t1.f(sb);
System.out.println(sb);
}
}发现什么不同了吗?这次才是输出全局的sb值
public class Test {
public static void main(String[] args) throws Throwable {
// TODO Auto-generated method stub
int i = 0;
A a = new A();
a.test(i);
System.out.println("全局变量:i = " + i);
}}class A {
int j = 0;
public void test(int i){
j++;
i = j;
System.out.println("局部变量:i = " + i);
}
}
2.定义了 String s = "aaa",t1.f("ccc");,相当于s= s + "ccc";
3.在方法中当局部变量和全局变量相同时访问的是局部变量而不是全局变量!
public class b { static void f(StringBuffer sb1,StringBuffer sb2){
sb1.append(sb2);
sb2=sb1;
} public static void main(String args[]) {
StringBuffer sb1=new StringBuffer("ddd");
StringBuffer sb2=new StringBuffer("bbb");
f(sb1,sb2);
System.out.println(sb1+" "+sb2);
}
}
调用f(a)实际上先生成a的副本_a, _a指向那个new object();
你在函数里改变_a是没用的,因为不会改变a的指向
但是你如果改变_a指向的new object()就有效果了,因为a也指向new object()
public class b { String s="aaa";
StringBuffer sb=new StringBuffer("bbb");
void f(b b1, b b2) {
b1 = b2;
} void f(String str){
s+=str;
} void f(StringBuffer sb1){
sb.append(sb1);
sb1=sb;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2);
t1=t2; //在这里用t1修改t2才能其到作用
System.out.println(t1 + " " + t2);
}
第1个和第3个都没有明确指向,所以引用的都是全局变量.
你最好把别人给你改的程序都试试~你就能明白了
public class b { String s="aaa";
StringBuffer sb=new StringBuffer("bbb");
void f(b b1, b b2) {
b1 = b2;
} void f(String str){
s+=str;
} StringBuffer f(StringBuffer sb1){
sb.append(sb1);
sb1=sb;
System.out.println(sb);
return sb1;
} public static void main(String args[]) {
b t1 = new b();
System.out.println(t1);
b t2 = new b();
t1.f(t1, t2);
System.out.println(t1 + " " + t2);
t1=t2;
System.out.println(t1 + " " + t2); t1.f("ccc");
System.out.println(t1.s); StringBuffer sb=new StringBuffer("ddd");
t1.f(sb);
System.out.println(sb);
System.out.println(t1.f(sb));
}
}