java中,实例化一个类,并进行操作,其中有些细节模糊不清。
实例化一个类,包括2部分
声明1个对象变量,如VendingMachine vm; 它将在栈内存中声明一个变量vm,初始值为null
创建1个对象,如 vm = new VendingMachine(); 在堆内存中开辟一个内存空间,并赋值给对象变量,即vm指向了那个new出来的内存空间的首地址。
new出来的内存空间,包含了各自独立的成员变量。
通过vm.method()对成员变量进行访问
那么成员方法如何知道对那个对象的成员变量进行访问?即切换访问的上下文。
首先成员方法是所有对象公共的,每个成员方法中有一个特殊的变量this,它并不显示可见,也不为用户所定义,this用来接收对象变量的值,从而建立了方法和变量的联系,即方法知道对那些变量进行加工。并且可以传入的对象变量不同,而进行切换。
对不同的对象而言,方法是公共的,而成员变量是独立的,方法通过this接收传入的对象,实现对特定对象的访问。
public class VendingMachine {
int price = 80;
int total;
void setPrice(int price) {
this.price = price;
}
void showPrompt() {
System.out.println("Welcome");
}
void showBalance() {
System.out.println(balance);
// return balance;
}
void insertMoney(int amount) {
balance += amount;
}
void getFood() {
if (balance >= price) {
System.out.println("Here you are");
balance -= price;
total += price;
} else {
System.out.println("not enough money!");
}
}
int balance; //注,成员变量balance定义在成员方法引用之后,仍然可以被访问到。
public static void main(String[] args) {
VendingMachine vm = new VendingMachine();
vm.showPrompt();
vm.showBalance();
vm.insertMoney(100);
vm.getFood();
vm.showBalance();
// showBalance();
VendingMachine vm1 = new VendingMachine();
vm1.insertMoney(200);
vm.showBalance();
vm1.showBalance();
}
}
参考上面的例子,实例化2个对象vm,vm1,可见他们各自有自己的成员变量。
调用方法时,this根据传入的对象变量切换到不同的对象上下文,如下,这是vm调用的截图,标记@483
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201128120417148.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ2MjY4MQ==,size_16,color_FFFFFF,t_70#pic_ce
nter)
这是vm1调用方法的截图,@482,可见this已经切换到vm1,可以对vm1指向的编码进行操作了。
所以在java中通过this实现访问上下文的切换。