在继承关系中,不管父类还是子类,这些类里面的this都代表了最终new出来的那个类的实例对象,所以在父类中你可以用this获取到子类的信息!
package com.urthinker.module.test; import org.junit.Test; abstract class BaseDao<T> { public void getType() { System.out.println(this.getClass().getName()); //com.**.test.SubDao } } public class SubDao extends BaseDao<String> { @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
public class Person{
private String name;
public Person(){}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void introduce(){
System.out.println("Hello, I'm a Person object, and my name is "
+getName());
}
}
public class Student extends Person{
public Student(){
super();
}
public void introduce(){
System.out.println("I'm a Student object and my name is "
+getName());
}
}
Test.java
public class Test{
public static void main(String[] args){
Person p = new Student();
p.setName("^-^");
p.introduce();
}
}
I'm a Student object and my name is ^-^
转自:http://happyqing.iteye.com/blog/2228575