package com.study.thisTest;
public class Test {
public static void main(String[] args) {
Father test = new Son();
test.f1();
System.out.println("----------------------");
System.out.println(test);
}
}
class Father {
public void f1(){
System.out.println("我是父类的f1方法");
System.out.println(this);
this.f2();
}
private void f2(){
System.out.println("我是父类的f2方法(私有的)");
}
}
class Son extends Father{
public void f2(){
System.out.println("我是儿子的f2方法");
}
}
//输出
我是父类的f1方法
com.study.thisTest.Son@2542880d
我是父类的f2方法(私有的)
----------------------
com.study.thisTest.Son@2542880d
当时的困惑在于,我这个this明明代表的是Son的对象,而我Son的对象里面也有个f2(),为什么执行的却是f2()方法。
现在的理解
private关键字,修饰的方式是私有的。
看上面这个例子,我在Father类定义了一个私有的方法f2(),那么我如何访问这个方法呢?我以前试想 Father father = new Father(); father.f2();
这样是错误的,因为private修饰的方法是属于这个类的,对象是访问不到的。
如果我想调用Father类中的f2(),只能在这个Father类里面,this.f2();
看到这里会发现, this.f2()这一句代码,一定是会去调用Father这个私有的方法f2(),不然这个方法就无法使用了,这样this.f2()的执行不可能还有其他情况了。
也就是说,只要你执行这一句,无论你这个this代表什么对象,我都是调用这个私有的f2();
有两个概念,静态绑定和动态绑定。
调用一个方法和运行一个方法是不同的。调用并不代表真正的执行 , 而运行一个方法是需要找这个方法的内存地址的,然后真正是运行指令执行的。
静态绑定就是在编译的时候就已经知道所调用方法的 内存地址了。
动态绑定需要在 运行的时候,才能确定调用方法的 内存地址。
java中,final,static,private修饰的 方法,会在编译期间就确定运行时的内存地址,是静态绑定。
然后看我的例子,我在main方法里面, test.f1() ,这一句代码不能在编译期间就确定方法的内存地址。
需要在运行的时候,根据实际对象的地址来确定。
至于为什么是这样设计的,我也不明白。
既然说了到静态绑定,那么就再说一下static把
它也是静态绑定的,我们知道static修饰的方法,是独立于对象存在的。他不用对象,直接用类就可以调用。
也就是说,在编译期间。就已经得到了static方法的内存地址。
当遇到有调用这个static方法的语句时,直接就可以拿到这个内存地址执行。
这是static方法在编译期间就已经确定好了内存地址,并且在以后执行时,再不会改变。
除非你重新编译一次