分享

Java父类使用this.getClass().getName() 获取到的是子类类名

 Mis林桑 2017-03-09

在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来的那个类的实例对象,所以在父类中你可以用this获取到子类的信息!

package com.urthinker.module.test;import org.junit.Test;abstract class BaseDao { public void getType() { System.out.println(this.getClass().getName()); //com.**.test.SubDao }}public class SubDao extends BaseDao { @Test public void test1() { getType(); }}

参考:

http://zhidao.baidu.com/link?url=9t24VdT4G63Z7-p6kNHR_WiBFRxRVYMYdmOmREJ_0F-cSDxPsrq0fgyJsq6Bv3uSpsOTH1QPH1YLV5S5cXJhRoRg8KIBHohw2F3DfcA6TK7

给你写了3个类:

A类:

package cn.test;
public class A {
public void test(){
  System.out.println( this .getClass());
  System.out.println( this .getClass().getSimpleName());
  System.out.println( this .getClass().getName());
}
}



B类:

package cn.test;
public class B extends A{
}


Test类:

package cn.test;
public class Test {
/**
  * @param args
  */
public static void main(String[] args) {
  B b = new B();
  b.test();
}
}


结果:

class cn.test.B
B
cn.test.B
你要知道,在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来时的那个类型的实例对象,所以在父类中你可以中this获取到子类的信息!

不止一层继承关系时,你可以根据下面:

A类:

package cn.test;
public class A {
public void test(){
  System.out.println( this .getClass());
  System.out.println( this .getClass().getSimpleName());
  System.out.println( this .getClass().getName());
  System.out.println( this .getClass().getSuperclass());
  System.out.println( this .getClass().getSuperclass().getSimpleName());
  System.out.println( this .getClass().getSuperclass().getName());
}
}


B类:

package cn.test;
public class B extends A{
B(){
//  System.out.println('B......');
}
}


C类:

package cn.test;
public class C extends B{
C(){
//  System.out.println('C...........');
}
}


Test类:

package cn.test;
public class Test {
/**
  * @param args
  */
public static void main(String[] args) {
  C c = new C();
  c.test();
}
}


结果:

class cn.test.C
C
cn.test.C
class cn.test.B
B
cn.test.B


http://blog.csdn.net/liu_zhen_wei/article/details/6889810

当一个父类的引用指向一个对象的时候,它会调用子类的方法,而不是父类的。


引用在栈内存中存在对象的内存地址。真正的对象(通过 new Student()创建的)存放在堆内存里。

在这块堆内存区域内,存在的是子类的属性(包括自己特有的,以及通过super()构造方法中从父类获得的)

和方法(继承父类但没有覆盖的,以及覆盖父类的方法和自己特有的),尽管引用是声明为父类的引用,

但是它指向的子类的对象,在执行方法的时候,是通过引用指向的堆内存区域内执行的。也就是到底执行父类

方法还是子类方法是由对象决定的,跟引用没有直接关系。


演示代码如下:

Person.java

  1. public class Person{  

  2.    private String name;  

  3.    public Person(){}  

  4.  

  5.    public void setName(String name){  

  6.        this.name = name;      

  7.    }  

  8.    public String getName(){  

  9.        return this.name;      

  10.    }  

  11.      

  12.    public void introduce(){  

  13.        System.out.println('Hello, I'm a Person object, and my name is '  

  14.            +getName());      

  15.    }  

  16. }  

Student.java
  1. public class Student extends Person{  

  2.      

  3.    public Student(){  

  4.        super();      

  5.    }  

  6.      

  7.    public void introduce(){  

  8.        System.out.println('I'm a Student object and my name is '  

  9.            +getName());      

  10.    }  

  11. }  


Test.java
  1. public class Test{  

  2.  

  3.    public static void main(String[] args){  

  4.        Person p = new Student();  

  5.        p.setName('^-^');  

  6.        p.introduce();  

  7.    }  

  8. }  

输出结果为:

I'm a Student object and my name is ^-^



转自:http://happyqing./blog/2228575


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多