本来想测试一下子类中调用父类方法,如果都是同步方法,锁对象是否相同。后来还发现很多理解不够深入的地方,一起写代码测试了一下。
//测试锁对象
class Father {
int a = 1;
synchronized void doX() {
System.out.println(this.toString());
System.out.println(super.toString());//Object的toString输出
this.doY();//如果this是Son,调用Son的方法,多态后期绑定
System.out.println(this.getClass());
System.out.println(this.a);//对域属性的调用时候,通过this区别域内属性或者方法中传入的参数
//*** 理解为,面向对象的每个方法,是隐含了一个this,向this发送消息。
//*** 而域没有这种说法,所以this.a引用class Father 类中的域
//*** 方法可以多态,域没有多态
}
synchronized void doY(){
System.out.println("do Father");
}
@Override
public String toString() {
return "Father";
}
}
public class Son extends Father {
int a = 2;
synchronized void doX() {
System.out.println(this);
System.out.println(super.toString());
//不能直接输出super,必须用super.xx();
//因为super可能是一个抽象类,无法被new出来,所以只能调用具体的方法。或者可以理解为super根本不是一个实例化的对象,只是让你调用父类方法的一个介质
super.doX();//子类调用父类的方法,调用者还是子类
};
synchronized void doY(){
System.out.println("do Son");
}
@Override
public String toString() {
return "Son";
}
public static void main(String[] args) {
Father f = new Son();
f.doX();
}
}
输出:
Son
Father
Son
Son@37f2ae62
do Son
class Son
1
注释写了一下,自以为是的解释~