一 this关键字总是指向调用该方法的对象,根据this出现的位置不同,this作为对象的默认引用有2种情形。 (this关键字最大的作用就是让类中的一个方法,访问该类里的另一个方法或实例变量)
1 构造器中引用该构造器正在初始化的对象
2 在方法中引用调用该方法的对象
pubic class Dog{
public void jump() {
System.out.println("jump");
}
public void run(){
1 Dog d=new Dog();//产生一个对象,这意味着一个Dog对象的方法需要依赖另一个Dog对象。不符合逻辑
d.jump();
2 this.jump();
3 jump();//java允许对象的一个成员直接调用另一个成员,省略this
System.out.pritnln("run")
}
}
public class DogTest{
public static void main(String[]args){
Dog dog=new Dog();
d.run();
}
}
二 this 不能用static修饰 ,java语法规定静态成员不能直接访问非静态成员
public class staticAccessNonStatic{
public void info(){
}
public static void main(String[] args){
info();//main方法是静态方法 ,info()是非静态。main方法是该类本身,不是类的实例。因此无法指向info();
new StaticAccessNonStatic().info;可以访问到
}
}
注意 java编程时不要使用对象去调用static修饰的成员变量,而是用类调用。
三 this引用用于构造器作为默认引用
public class ThisInConstructor{
public int foo;
public ThisInConstructor(){
int foo=0;
this.foo=6;//下面的代码将会把构造器正在初始化的对象的foo成员变量设为6;
}
public static void main(String[]args){
System.out.println(new ThisInConstrutor().foo);//都输出6;
}
}
四 方法的参数传递机制 (值传递)
1 基本类型
public class PrimitiveTransferTest{
public static void swap(int a,int b){
int tmp=a;
a=b;
b=tmp;
// a=9;b=6
}
public static void main(String[]args){
int a=6;
int b=9;
swap(a,b);
//a=6,b=9
}
}
交换结束后a和b的值不变,说明swap的a和b是main方法中a和b的复制品。系统在main栈区产生2个变量,swap栈区产生2个变量。即4个变量。
值传递实质:当系统开始执行方法时,系统为形参执行初始化,就是把实参变量的值赋给方法的形参变量,方法里操作的并不是实际的实参变量;
2 引用类型
public class ReferenceTransferTest{
public static void swap(DataWrap dw){
int tmp=dw.a;
dw.a=dw.b;
dw.b=tmp;
//a=9,b=6
}
public static void main(Stirng []args){
DataWrap dw=new DataWrap();
dw.a=6;
dw.b=9;
swap(dw);
//a=9,b=6
}
}
创建 DataWrap对象时, dw(main栈区)引用指向对象(保存在堆内存) ,把该对象a,b两个成员变量分别赋值为6,9。
接下来main方法开始调用swap()方法,系统再为swap开辟出栈区。main把dw作为实参赋给swap中dw形参。
因为dw是一个引用变量,所以系统复制了dw变量,但并未复制DataWrap对象。所以dw实际操作的是同一对象,swap相当于把对象的a,b值重新赋值。
五 形参个数可变的方法
public class Varargs{
public static void test(int a,String...books){
//作为数组处理
for(String tmp:books){
System.out.println(tmp)
}
}
public static void main (String []args){
test(5,"aaaaa","bbbbb","ccccc")
}
}
一个方法中最多只能有一个个数可变的形参。