对象与this
一、对象
对象的本质理解为“多个相关数据的统一载体”;
比如一个人,有name、age、height等社会或生理体征,而这些数据是属于一个个体的,如果用数组去存,表现力有所欠缺,无法表达“它们属于同一个个体”的含义。
方法是一份一份的原因:
因为多个个体,属性可能不同,比如我身高180,你身高150,我18岁,你30了。但我们都能跑、能跳、能吃饭,这些技能(method)都是共通的,没必要和属性数据一样单独在堆空间各存一份,所以被抽取出来存放。
但是方法怎么知道自己处理的是哪个对象的数据呢?
Java的this其实就是解决这个问题的。可以理解为对象内部持有一个引用,当你调用某个方法时,必须传递这个对象引用,然后方法根据这个引用就知道当前这套指令是对哪个对象的数据进行操作了。
进而可以理解static:
之所以一个变量或者方法要声明为static,是因为:
- static变量:大家共有的,大家都一样,不是特定的差异化数据
- static方法:这个方法不处理差异化数据
也就是说,static注定与差异化数据无关,即与具体对象的数据无关。
以静态(static)方法为例,当你确定一个方法只提供通用的操作流程,而不会在内部引用具体对象的数据时,你就可以把它定为静态方法。即static方法不处理特定对象数据的。
这或许可以反过来解释,为什么Java中静态方法无法访问非静态数据(实例字段)和非静态方法(实例方法);
因为Java不会在调用静态方法时传递this(因为不处理特定对象数据,所以方法参数里没有this),静态方法内没有this当然无法处理实例相关的一切;
实例:
我们在一个实例方法中调用另一个实例方法或者实例变量时,其实都是通过this调用的,比如
public void test(this){
System.out.println(this.name);
this.show();
}
只不过Java允许我们不显示书写。
public class Demo {
public static void main(String[] args) {
/**
* new一个子类对象
* 我们知道,子类对象实例化时,会隐式调用父类的无参构造
* 所以Father里的System.out.println()会执行
* 猜猜打印的内容是什么?
*/
Son son = new Son();
Daughter daughter = new Daughter();
}
}
class Father{
/**
* 父类构造器
*/
public Father(){
// 打印当前对象所属Class的名字
System.out.println(this.getClass().getName());
}
}
class Son extends Father {
}
class Daughter extends Father {
}
运行结果:
这个例子中传参的过程很特殊:
- new的时候自动传参,不是我们主动调用,所以感知不到
- Java中的this是隐式传递的,所以我们更加注意不到了
学习:
知乎博主:bravo1988