一,值传递
Java中进行方法调用中传递参数时,参数传递有两种:
●
值传递
:(形参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应
的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同
的存储单元,
所以方法执行中形式参数值的改变不影响实际参数的值
。
●
引用传递
:(形参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参
数是对象,这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的
操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,
所以方法
执行中形式参数的改变将会影响实际参数。
基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身 。
但是无论是值传递还是引用传递
,
其本质都是传值
,
所以也都统称值传递
.
其实,不属于八种基本类型的引用类型,调用方法带入引用类型的值就算是引用传递。
就像这里的car1.name就是一个引用类型。
二,this关键字
在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的
格式来引用成员变量名,常常用来区分同名的成员变量和局部变量。
public class Demo{
int name;
public Demo(int name){
this.name = name;
}
}
当我们写一个含参构造方法时,如果参数名与成员变量的变量名相同的话,我们在main方法中new一个对象后输入参数值,然后调用方法导入对应变量,看似导入成功也没有报错,但实际上因为成员变量名与构造方法的参数名相同导致计算机分不清这两者,也就导致了后续含参方法的参数值没有成功传入,我们来看一段代码来认识:
package csdn;
public class thisshow {
int num;
String name;
public thisshow(int num,String name)
{
num=num;//这里的num和name分别是成员变量名和构造方法的参数,二者使用了相同名称
name=name;//这里计算机并没有报错,但是后续的方法以及main函数内运行会出问题
}
public void show(int num,String name)//这是一个传入学号和姓名打印学号姓名的方法
{
System.out.println("姓名:"+name+" 学号:"+num);
}
public static void main(String[] args) {
thisshow a=new thisshow(12,"张三");//thisshow类型声明了一个a变量 new出一个新对象
a.show(a.num,a.name);//调用方法,传入a.num和a.name
}
}
我们运行后的理想结果是:
但实际上:
这里的原因就是构造方法参数名与成员对象名相同,导致了计算机无法区别二者,所以具体传入的信息没有传进去,所以最后就打印出了初始值。
当我们使用了this关键字后:
可以看到我们成功打印出了我们的名字和学号。
除此之外:
this关键字还可以引用成员方法或构造方法。
package csdn;
public class thisshow {
int num;
String name;
public thisshow(int num,String name)
{
this.num=num;
this.name=name;
}
public void show(int num,String name)//方法一
{
System.out.println("姓名:"+name+" 学号:"+num);
}
public void say()//方法二
{
this.show(num,name);//方法二的功能区内使用this关键字调用了方法一,
//使得方法一成为方法二的一部分
System.out.println("说话");
}
public static void main(String[] args) {
thisshow a=new thisshow(12,"张三");
a.show(a.num,a.name);//调用方法一
a.say();//调用方法二
}
}
运行结果:
可以看到执行方法二时执行了方法二中的方法一。
三,static 关键字
●
概念
static被称为静态,可以用来修饰类的成员变量,成员方法,代码块,内部类
。
静态成员不依赖于类的实例,被类的所有实例共享,就是说 static 修饰的
方法或者变量不需要依赖于对象来进行访问,只要这个类被加载,静态成员
就会被加载创建。
特点:
•
随着类的加载而加载
•
优先于对象存在
•
修饰的成员,被所有对象所共享
•
可不创建对象,直接使用类名调用
●
static属性
静态属性是类的所有对象共享的,即不管创建了多少个对象,静态属性在内存中
只有一个。
•
静态变量在类被加载时由系统默认初始化。
•
静态变量值是所有对象共享。
•
静态变量可以在任意方法、代码块、构造器中直接使用。
•
可以通过类名.静态变量直接访问,也可以通过对象.静态变量的方式访问(但
是更推荐使用类名.静态变量的方式)。
public class Chinese{
String name ;//姓名
static String country=”中国”;//国家
}
●
用static修饰的成员方法就是静态方法。
●
静态方法在本类的任意方法、代码块、构造器中都可以直接被调用。
●
静态方法在其他类中可以通过类名.静态方法的方式调用。也可以通过对
象.静态方法的方式调用(但是更推荐使用类名.静态方法的方式)。
●
在static方法内部只能访问类的static修饰的属性或方法,不能访问类的
非static的成员。
●
因为不需要实例就可以访问static方法,因此static方法内部不能有this,
也不能有super。
首先呢,当我们在一个类中声明成员变量时,如果在最终的main方法中会创建多个实例,若这几个实例的某个成员变量的值相同,则我们可以使用static关键字修饰后直接在类中赋值,因为static修饰的变量或方法不会随具体对象的生成而生成,而是在类加载时便会生成
package csdn;
public class guanjianstatic {
static int day=1;
String name="共";
public guanjianstatic(){}
static void fangfa()
{
System.out.println("你好");
}
public static void main(String[] args) {
System.out.println(guanjianstatic.day);
guanjianstatic.fangfa();
}
}
可见这段代码中他的guanjianstatic类中给变量day,name赋了值,但在main函数中我们并没有创建具体对象,而是直接使用了类名+变量名和类名+方法名进行了调用,我们来看结果
可以看到成功打印出了内容。