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

在继承关系中,不管父类还是子类,这些类里面的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

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());

}

}

Student.java

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值