static与this
static方法中不能去调用非静态方法和非静态属性,是因为静态方法不会在内部引用具体对象的数据,静态方法是不会处理特定对象的数据的。因为Java不会在调用静态方法时传递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是隐式传递的,所以我们更加注意不到了