this的本质是创建好的对象地址,在构造方法中也可以使用this代表“当前对象”但是this不能用于static方法。this的第一种用法用来区分局部变量和成员变量,第二种通过this调用一个普通的方法,这个this可以写也可以不写,不写的话也是默认调用这个方法,第三个this可以调用构造方法,需要注意构造方法的调用必须放在第一句。
static关键字:用static声明成员变量为静态成员变量,也可以成为类变量,static修饰的成员变量和方法,从属于类,这一点可以从内存方面理解,静态成员变量和方法,存于方法区,方法区主要存的是类信息,而普通的成员变量和方法存于堆中,从属于对象,用对象名来调用。
相关代码:
public class Test1 {
int id;
String name;
static String school="清北";
public Test1(int id,String name){
this.id=id;
this.name=name;//这里的this用于区分局部变量和成员变量
}
public void login(){
System.out.println("登录:"+name );
}
public static void pschool(){
System.out.println(school);
}
public static void main(String[] args) {
Test1 t=new Test1(123,"张三");
Test1.pschool();
Test1.school="清北上不了";
Test1.pschool();
}
}
Java中的参数传值机制,方法中所有的参数都是值传递,也就是传递的是原参数的复印版,而不是原件,因此复印版的改变不会影响原件。
但是引用类型参数的传值,传递的是值的副本但是引用类型指的是对象地址,因此副本和原参数都指向了同一个地址,那么,改变副本指向地址对象的值也意味着原参数指向对象的值发生了改变。
相关代码:
public class Test {
String name;
int id;
public Test(String name,int id){
this.id=id;
this.name=name;
}
public void change01(Test t){
t.name="张三";
}
public void change02(Test t){
t=new Test("李四",123);
}
public static void main(String[] args) {
Test t1=new Test("王二麻子",142);
t1.change01(t1);
System.out.println(t1.name);
t1.change02(t1);
System.out.println(t1.name);
}
}
这段代码中,首先从main函数开始执行,第一句new出对象t1,并将姓名ID赋值,第二句将t1所指代的地址赋给了change01方法中的t,那么现在t和t1所指的地址是一样的,执行change01中的语句改变了t1地址所指代对象的名字为张三,所以main函数中第三句输出张三,第四句又将t1 指的地址赋给change02中的t,然后执行该方法,该方法又new出一个新对象t,然后这个新对象名字为李四,而原t1,并没有发生改变,所以main方法里面最后一句输出的仍然为张三。