当前位置: 首页 > 工具软件 > super-bbs > 使用案例 >

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

叶恩
2023-12-01

题外话:
最近看多线程方面的东西,看到可重入锁的时候,当中有个父类方法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()

 类似资料: