一.两个概念
实际参数(实参):方法调用时被传入的参数
形参:方法定义时声明的参数
二.三种传递方式
1.基本数据类型的值传递:
public static void main(String []args)
{
int i=10,j=5;
tValue(i,j);
System.out.println("i:"+i+"j:"+j);//打印结果:i=10,j=5
}
public static void tValue(int x,int y)
{
x+=y;
y=x;
}
总结:涉及到基本数据类型的传递时,形参接受的是实参的值副本。所以不能改变实参的值
2.复合类型的引用传递
void method1() {
2 StringBuffer x = new StringBuffer("Hello");
3 change1(x);
4 System.out.println(x);
5 }
6
7 void method2() {
8 StringBuffer x = new StringBuffer("Hello");
9 change2(x);
10 System.out.println(x);
11 }
12
13 void change1(StringBuffer sb) {
14 sb.append(" world!");
15 }
16
17 void change2(StringBuffer sb) {
18 sb = new StringBuffer("hi");
19 sb.append(" world!");
20 }
针对以上代码 ......
佟强 http://blog.csdn.net/microtong
OakCMS内容管理系统 http://www.oakcms.cn http://www.oakcms.net
一元二次方程ax2+bx+c=0,输入a,b,c三个系数,求解方程,结果有三种情况:两个实数根、一个实数根、两个复数根。
/**
* Equation.java
*/
package cn.edu.uibe.oop;
/**
* 计算一元二次方程的根
* @author TongQiang
*
*/
public class Equation {
double a,b,c; //方程的系数
double x1,x2; //两个根
double r; //实部
double v; //虚部
int type; //0表示一个根,1表示两个实根,2表示两个复数的根
public Equation(double a,double b,double c){
this.a = a;
this.b = b;
this.c = c;
}
private double delta(){
return b*b-4*a*c;
}
public void calculate(){
double d = delta();
if(Math.abs(d) < 1E-5){
type = 0;
x1 ......
为了实现两个数字进行交换,我们通常可以利用位运算来实现
C++程序 swap(int a ,int b){a^=b^=a^=b;}
JAVA程序 swap(int a, int b){ a^=b;b^=a;a^=b; }或者{ b^=(a^=b) ; a^=b;}
如果JAVA用C++的实现方式则会得到 b得到了a的值,但是a现在的值却不是原来b的值。
这个是因为在C++是编译性语言,JAVA是解释性语言。
在进行处理的时候C++的数是边运算边刷新,保证了中间a ,b的值实时更新,
而JAVA是一次性在我们的表达式中填入了我们原来的值,在中间的运算过程中不能保证本应该改变的数值没有改变,
形成了脏数据。在我们下次要用到a,b的值的时候才进行刷新,但是这个时候已经是脏数据,因此得到的值是错误的。 ......
为了实现两个数字进行交换,我们通常可以利用位运算来实现
C++程序 swap(int a ,int b){a^=b^=a^=b;}
JAVA程序 swap(int a, int b){ a^=b;b^=a;a^=b; }或者{ b^=(a^=b) ; a^=b;}
如果JAVA用C++的实现方式则会得到 b得到了a的值,但是a现在的值却不是原来b的值。
这个是因为在C++是编译性语言,JAVA是解释性语言。
在进行处理的时候C++的数是边运算边刷新,保证了中间a ,b的值实时更新,
而JAVA是一次性在我们的表达式中填入了我们原来的值,在中间的运算过程中不能保证本应该改变的数值没有改变,
形成了脏数据。在我们下次要用到a,b的值的时候才进行刷新,但是这个时候已经是脏数据,因此得到的值是错误的。 ......
常看到很多人讨论java中关于String的问题,我也就有点兴趣了,鉴于网上很多人写的都差别很大,
同样的问题都是不同的说法,我很迷糊,花了一晚上读了Java Virtual Machine Specification和
The Java Language Specification的一些章节,做了很多试验,总结了一下关于String的内容,还
有很多内容我也不确定,在下面也都提出来了,希望高手能指正.
Constant Pool常量池的概念:
在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太
明白Constant Pool到底是个怎么样的东西,运行的时候存储在哪里,所以在这里先说一下Constant Pool的内容.
String Pool是对应于在Constant Pool中存储String常量的区域.习惯称为String Pool,也有人称为
String Constant Pool.好像没有正式的命名??
在java编译好的class文件中,有个区域称为Constant Pool,他是一个由数组组成的表,类型
为cp_info constant_pool[],用来存储程序中使用的各种常量,包括Class/String/Integer等各
种基本Java数据类型,详情参见The Java Virtual Machine Specification 4.4章节.
对于Constant Pool,表的基本通用结构为:
cp_info {
u ......
原文: http://forum.javaeye.com/viewtopic.php?t=17912搂主的问题问的含含糊糊:flyjie给出了非常详细的解释,不过就是没有解释String实例化的特殊方面以及Intern()方法的含义-------------------------------------------------------------------------------------------------------------------------------------------------------------------------java代码: String str ; 这样声明str它只支是一个对象的reference,不会产生实际的对象。如果没有初始化str,编译时便会发生错误。 java代码: String str1=new String("test"); String str2 = "test"; str1是一个新的对象。new关键字的意思就是创建某个新的对象。而str2是一个对象的引用。 它们的内容相同,但内存地址是不一样的。 java中对象的引用存在Stack(栈)中,而对象由Heap(堆)分配空间。 3、引用==变量? 不一定 java代码: public class TestString { public static void main(String[] args) { String s1 = "test"; String s2 = new String("test"); if (s1 == s2) System.out.println("s1 == s2"); else System.out.println("s1 != s2"); ......
在Java中方法参数的传递,都是值传递,对象传递是地址 ,基本数据类型传递的是值。地址和值都值。
下面以一个例子来看内存中的数据变化情况
public class Test{
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public callMethod(Test test){
Test test1 = new Test();
test1.setName("456");
test.setName("123");
test = test1;
System.out.println("test name:"+test.getName());
}
public static void main(String []args){
  ......