0.1
* this 是一个关键字,翻译为:这个; * this是一个引用,是一个变量,this变量中保存了内存地址,指向了自己; * this存储在JVM堆内存Java对象内部;生成多少个对象(每个对象都有一个this)就有多少个this; 当使用c1去访问Customer,整个过程中出现的this就是c1;当使用c2去访问Customer,整个过程中出现的this就是c2。
0.2
图1实现了这条语句:Customer c1 = new Customer();(c1就是一个引用) c1是一块栈内存,存着Customer对象的地址,c1被new出来后,this也随之产生了,this如图,也指向Customer(自身)。图1的this就是c1。
图2中new了两个对象c1和c2,各自有自己的实例变量name,一个为“zhangsan”一个为“lisi”
0.3
* 没有static关键字的方法被称为“实例方法”;没有static关键字的变量被称为“实例变量”
* 实例方法: 访问时用 “引用.方法名”的方式。
* 实例变量: 访问时采用“引用.实参”的方式。 (在堆内存的对象内部存储,所以访问该数据的时候必须先创建对象)
* 当一个行为 / 动作执行的过程中需要对象参与,则该方法一定要定义为“实例方法”,不要带“static”关键字;当一个行为 / 动作执行的过程中不需要对象参与,则该方法则要定义为“静态方法”
0.4
this只能由实例方法调用,不能在静态环境中使用,谁(对象)调用这个方法,方法里提到的this就是谁。即this指向当前正在执行实例方法的动作的对象。在某个类的方法里出现了实例变量,前面没有“引用.”时,其实是将“this.”省略了。因为这个实例变量不能写成固定的,应该是随调用这个方法的对象变化而变化。
0.5
总结一下:static方法不能“直接”访问实例变量和实例方法,因为实例方法需要具体对象访问,调用的时候用对象引用变量.方法名,而static的方法里不存在this,也就不能用实例方法。
例:一个实例变量,不能在静态方法中调用,因为访问实例变量时必须用“引用.”的方式,而静态方法执行过程中不需要对象(引用);static的方法调用不需要对象,直接使用类名,所以执行过程中没有当前对象,所以也不能使用this
1. 什么情况下“this. ”不能省略?
1) 用来区分局部变量和实例变量的时候"this."不能省略
package thistest3;
//用户类
public class User {
//属性
private int id; //实例变量
private String name; //实例变量
//(无参)构造函数
public User() {
}
//(有参)构造函数
public User(int id, String name) {
this.id = id;
this.name = name;
}
/*
public void setID1(int a) {
id = a; //省略了this.
}
根据就近原则,以下代码的id和实例变量id无关,不能采用这种方式
public void setID2(int id) {
id = id;
}*/
public void setID(int id) {
//等号左边的id是实例变量id
//等号右边的id是局部变量id
this.id = id;
}
public void setName(String name) {
//等号左边的name是实例变量name
//等号右边的name是局部变量name
this.name = name;
}
public int getID() {
return id;
}
public String getName() {
return name;
}
//为什么在已有构造函数赋值的情况下,还要设置一个setID方法?
//当我想修改某个对象的名字时,不是重新new一个对象,而应该是用user的set方法修改
}
public class UserTest {
public static void main(String[] args) {
User u1 = new User(100,"张三");
System.out.println(u1.getID());
System.out.println(u1.getName());
//想修改名字时,不能重新new一个对象(其他值又不都改)
u1.setID(12138);
System.out.println(u1.getID() + " " + u1.getName());
}
}
this用法:
1. 可以使用在实例方法中,代表当前对象【语法格式:this. 】
2. 可以使用在构造方法当中,通过当前构造方法调用其它的构造方法【语法格式:this(实参) 】
***注:这个语句要想生效,只能出现在当前构造方法的第一行,即第一条语句(由此也可知,在一个构造方法中 调用别的构造方法只能调用一次/一个)。
总结练习:
package Test;
public class Test {
//带有static的方法
public static void method1() {
//调用dosome
//完整方式调用
Test.dosome();
//省略方式调用
dosome();
//调用doother
Test t2 = new Test();
//完整方式调用
t2.doother(); //这个方法是静态方法,没有this,只能现new一个对象
//省略方式调用
/***/
//访问i
//完整方式访问
System.out.println(t2.i);
//省略方式访问
/***/
}
//没有static的方法
public void method2() {
//调用dosome
//完整方式调用
Test.dosome();
//省略方式调用
dosome(); //???
//调用doother
//完整方式调用
this.doother(); //因为当前方法时实例方法,有对象,有this
//省略方式调用
doother();
//访问i
//完整方式访问
System.out.println(this.i);
//省略方式访问
System.out.println(i);
}
//主方法
public static void main(String[] args) {
//要求在这里编写程序调用method1
//使用完整方式调用
Test.method1();
//使用省略方式调用
method1();//同一个类里
//要求在这里编写程序调用method2
Test t1 = new Test();
//使用完整方式调用
t1.method2();
//使用省略方式调用
/***/
}
//实例变量
int i = 10;
//静态方法
public static void dosome() {
System.out.println("do some!");
}
//实例方法
public void doother() {
System.out.println("do other!");
}
}
***自定义一个类之后,右键单击点击源码-setter and getter,可自动生成方法