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 ,你的
...