package com.avicit.zq.test;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;/**
 * Created by admin on 2016/9/18.
 */
public class Main extends A{
    public static void main(String[] args) {
        Main t = new Main();
        t.dot();
    }
}
class A {
    private Class t = getClass();//referenced to Class Main  (1)
    protected Log logger = LogFactory.getLog(t);
    B b = new B();
    public void dot(){
        System.out.println(t.getName());
        b.dot();
    }
}class B{
    private Class t = getClass();//referenced to Class B      (2)
    protected Log logger = LogFactory.getLog(t);
    public void dot(){
        System.out.println(t.getName());
    }
}
//output:
com.avicit.zq.test.Main
com.avicit.zq.test.B有谁能告诉我为啥(1)处的getClass()得到的是父类Main的Class对象,(2)处的getClass()得到的是自身的Class对象?
Object中关于getClass()的解释为:返回运行时类的对象。
坐等高手回答。

解决方案 »

  1.   

    有谁能告诉我为啥(1)处的getClass()得到的是父类Main的Class对象你在说什么.. 你自己写的 
    extends A
    你自己写的输出..
    //output:
    com.avicit.zq.test.Main
      

  2.   


    输出不是我自己写的,我只是把运行结果粘贴出来了,我对运行结果有异议。我指的是你的描述有问题..  什么叫父类Main .. 你不是写的 Main继承A么. 
      

  3.   


    输出不是我自己写的,我只是把运行结果粘贴出来了,我对运行结果有异议。我指的是你的描述有问题..  什么叫父类Main .. 你不是写的 Main继承A么. 呃呃,犯二了,那把“父类”两个字去掉~
      

  4.   


    那就更没问题了呀..  这个对象本来就是Main这个类的呀..  只是继承了父类的这个方法...
    你是想要这两个方法的效果吗..  
    t.getSuperclass()
    t.getGenericSuperclass()
      

  5.   


    那就更没问题了呀..  这个对象本来就是Main这个类的呀..  只是继承了父类的这个方法...
    你是想要这两个方法的效果吗..  
    t.getSuperclass()
    t.getGenericSuperclass()我觉得您可能没有明白我的意思,A类和B类同样有一个私有变量,值同样为getClass()[同this.getClass()],为啥getClass()返回的值并不是预期的 A类和B类,而是Main类和B类。
    就是我想的返回结果是:
    com.avicit.zq.test.A
    com.avicit.zq.test.B实际返回结果是:
    com.avicit.zq.test.Main
    com.avicit.zq.test.B
      

  6.   

    因为通过new关键字创建的对象类型是Main,改成new一个A就会输出类型A
      

  7.   

    能解释一下为什么吗?这跟“运行时对象”有什么关联吗?
    getClass方法返回对象的类型,而面向对象语言的多态特性决定对象的类型只能在运行期确定(不同于声明的引用类型)
    在这里就是用new关键字创建的是Main对象,getClass返回的当然也是Main
      

  8.   


    那就更没问题了呀..  这个对象本来就是Main这个类的呀..  只是继承了父类的这个方法...
    你是想要这两个方法的效果吗..  
    t.getSuperclass()
    t.getGenericSuperclass()我觉得您可能没有明白我的意思,A类和B类同样有一个私有变量,值同样为getClass()[同this.getClass()],为啥getClass()返回的值并不是预期的 A类和B类,而是Main类和B类。
    就是我想的返回结果是:
    com.avicit.zq.test.A
    com.avicit.zq.test.B实际返回结果是:
    com.avicit.zq.test.Main
    com.avicit.zq.test.B
    我觉得我已经说清楚了.. 运行时Main对象就是Main的. 如果你 new A()的话 才是A的.
    如果要父(超)类的类型的话,就用我给的那两个. 一个是直接父类,另一个是最顶级的父类
      

  9.   

      你在A调getclass方法 根据多态的特性会执行main的getclass方法(因为new的是main 而main继承A) 
    如果你把main方法里面的Main t = new Main();改成A t = new A();就会得到你想要的结果。    我是菜鸟,不对勿喷