super.getClass()与this.getClass()的问题

来源:互联网 发布:testv淘宝店搜不到 编辑:程序博客网 时间:2024/05/18 20:52

题外话:
最近看多线程方面的东西,看到可重入锁的时候,当中有个父类方法a加锁,子类的方法b(覆盖了a方法)也加锁。方法b又会调用a,导致会出现死锁问题,因为两个在处理的时候,都会要拿父类的对象锁。可重入锁解决了这个死锁的问题。`
public class Widgt {

public synchronized void doSomething(){    System.out.println("父类的doSomething.....");}

}

public class LoggingWidgt extends Widgt{

public synchronized void doSomething(){     System.out.println("子类的doSomething.....");    System.out.println(toString()+"calling doSomething...");    super.doSomething();}public static void main(String[] args) {    new LoggingWidgt().doSomething();}

}`

当中对这个super感兴趣,就百度了一下(还是用google好一点)。后面看到有个面试题,考的就是super.getClass()。当时自己做实验也觉得很郁闷,怎么不是输出这个父类的class的名字,后面百度了,才知道Object的处理。

先上代码
`父类
public class SuperClass {
//private int a = 5;
SuperClass(){
//a=20;
//System.out.println(a);
System.out.println(super.getClass().getName());
System.out.println(this.getClass().getName());
}

void show(){    System.out.println(super.getClass().getName());    show2();}void show2(){System.out.println("我是父类的show2");}

}

子类
public class SubClass extends SuperClass{

SubClass(){}void show(){    super.show();    System.out.println(super.getClass().getName());}void show2(int a){    System.out.println("我是子类的show2");    System.out.println(super.getClass().getSuperclass().getName());}void show3(){    System.out.println(super.getClass().getSuperclass().getName());}/** *1、子类对象被创建的时候,首先父类对象会有一个默认类对象被创建出来 *2、 super.getClass()或者this.getClass(),这getClass()都是从父类Object当中继承回来的,且是final。实质上调用的也是Object.getClass() * 而Object.getClass()是返回当前运行时对象的class,因此谁在运行就返回谁。这个在Object的API当中有说过。 * 3、父类当中的某个方法show()当中调用show2()的时候,如果子类没有同名方法,就调用自己的,有的话,就调用父类的。 * 4、如果想要输出父类的对象的class,需要用到getClass().getSuperclass() * @param args */public static void main(String[] args) {    SubClass sub = new SubClass();    sub.show();}

}
`
详细的可以看看下面的链接,我是看到别人是这讲的
面试题的帖子:http://bbs.csdn.net/topics/370013271?locationNum=6

释疑的帖子:
http://bbs.csdn.net/topics/370010127

以前在开发中,ctrl+c和ctrl+v的比较多,还是自己私底下多动手,写些原生的代码,了解一些其他的东西好些。

上面注释那些是我自己看别人分析和动手得出的结论,不对的,请大伙指出,多多交流——
再贴上结论如下:
/**
*1、子类对象被创建的时候,首先父类对象会有一个默认类对象被创建出来
*2、 super.getClass()或者this.getClass(),这getClass()都是从父类Object当中继承回来的,且是final。实质上调用的也是Object.getClass()
* 而Object.getClass()是返回当前运行时对象的class,因此谁在运行就返回谁。这个在Object的API当中有说过。
* 3、父类当中的某个方法show()当中调用show2()的时候,如果子类没有同名方法,就调用自己的,有的话,就调用父类的。
* 4、如果想要输出父类的对象的class,需要用到getClass().getSuperclass()

0 0
原创粉丝点击