java 怎样获取父类和所有域_Java父类使用this.getClass().getName() 获取到的是子类类名...

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

2019-03-19 19:56|来源: 网路

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

}

}

参考:

给你写了3个类:

A类:

B类:

Test类:

结果:

class cn.test.B

B

cn.test.B

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

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

A类:

B类:

C类:

Test类:

结果:

class cn.test.C

C

cn.test.C

class cn.test.B

B

cn.test.B

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

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

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

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

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

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

演示代码如下:

Person.java

publicclassPerson{

privateString name;

publicPerson(){}

publicvoidsetName(String name){

this.name = name;

}

publicString getName(){

returnthis.name;

}

publicvoidintroduce(){

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

+getName());

}

}

Student.java

publicclassStudentextendsPerson{

publicStudent(){

super();

}

publicvoidintroduce(){

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

+getName());

}

}

Test.java

publicclassTest{

publicstaticvoidmain(String[] args){

Person p = newStudent();

p.setName("^-^");

p.introduce();

}

}

输出结果为:

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

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

相关问答

Java的每个类都带有一个运行时类对象,该Class对象中保存了创建对象所需的所有信息。 可以用.class返回此 Object 的运行时类Class对象,也可以用getClass()获得。 获得此对象后可以利用此Class对象的一些反射特性进行操作, 例如: this.getClass().newInstance(); //用缺省构造函数创建一个该类的对象 this.getClass().getInterfaces(); //获得此类实现的接口信息 this.getClass().getMeth

...

使用时 this.getClass().getResource("myFile.ext")

getResource将尝试找到相对于该包的资源。 如果你使用: this.getClass().getResource("/myFile.ext")

getResource将它视为绝对路径,只需像您所做的那样调用类加载器。 this.getClass().getClassLoader().getResource("myFile.ext")

您不能使用ClassLoader路径中的前导/ ClassL

...

“$ 1”不是“无用的无意义”。 如果你的班级是匿名的,那么会附加一个数字。 如果你不想要类本身,而是声明类,那么你可以使用getEnclosingClass() 。 例如: Class> enclosingClass = getClass().getEnclosingClass();

if (enclosingClass != null) {

System.out.println(enclosingClass.getName());

} else {

System.out.print

...

简单:您重复实例化相同的内部类。 您的代码只包含一个内部类! 如果你要做新的Integer() 20次,你会认为每次创建一个新的Integer类吗? 当然不是。 该类保持不变,您只需获得同一类的不同对象。 为了创建多个匿名内部类,您必须在源代码中重复添加定义! 要解决您的问题,您需要一个使用对象“身份”的注册表,而不是他们的类! Simple: you are instantiating the same inner class repeatedly. Your code only contain

...

getClass()返回表示“Card”类的Class对象 ; 因此代码不是指Card#getName方法,而是引用Class#getName ,它尽职地返回“Card”。 只需删除getClass() : public String toString()

{

return getName();

}

上一个错误(wrt“static”)使用的是Card.getName() - 不要为类型添加前缀来调用实例方法。 getClass() returns the Class object re

...

new ElementModel(){};

创建一个扩展ElementModel的匿名内部类。 ElementModel的构造ElementModel打印实际类的名称,而不是ElementModel本身的名称。 你应该写 new ElementModel();

编辑匿名内部类的名称是BaseModel$1因为它是BaseModel的匿名内部类。 new ElementModel(){};

creates an anonymous inner class extending

...

请查看以下代码段,以回答您的问题。 对象O可以包含任何对象。 o.getClass()将返回对象的运行时类 public class Main {

void method(Object o) {

System.out.println(this.getClass() == o.getClass());

}

public static void main(String[] args) {

new Main().method(new Object()); // false

...

丑陋? 是 import java.lang.reflect.ParameterizedType;

public class GenericClass {

public GenericClass() {

System.out.println(getClass().getGenericSuperclass()); //output: GenericClass

System.out.println(((ParameterizedType)g

...

在您的代码中,两个getClass.getName返回相同的值。 但是,格式化输出消息时,记录器只是使用源类(通过检查堆栈可以知道)而不是记录器的名称(在您的情况下对应于getClass.getName )。 因此,输出日志记录头的记录器实际上是使用完成log调用的类的名称,而日志消息的内容是实例的名称运行时类。 所以这就像静态与运行时类型问题。 如果你想知道Loggable$class来自哪里,那么恰好名为T的特征中的方法实现位于名为T$class的JVM T$class 。 现在进行说明。 在

...

这段代码 Foo obj = new Foo(){

@Override

public void dispaly() {System.out.println("msg");}

};

创建一个实现接口Foo的匿名类。 生成的匿名类与com.Foo ,并且没有它的名称。 在编译期间,匿名类被赋予名称,具体取决于它们的包含类。 格式为$ 。 你的包含类是ClassWithMainMethod ,你的

...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值