作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用这段代码:
class SuperTest {
SuperTest() { whoAmI(); }
void whoAmI() { System.out.println(getClass().getName()); }
}
class Test extends SuperTest {
Test() { whoAmI(); }
}
new Test()
将打印 "Test"
两次。作为初学者,我期望输出为 "SuperTest/Test"
。我现在明白为什么这是不可能的,以及为什么隐式 this
将仅引用子类型。
但是我找不到 whoAmI()
应该是什么来实际打印输出 SuperTest/Test
。换句话说:whoAmI()
如何访问它“从中调用”的类型的名称?
编辑:我正在将问题的标题更改为一个更好地描述问题的新标题。(旧的是:继承:是否有一个“this-equivalent”构造来引用派生类型的父类(super class)型)。
最佳答案
这是预期的行为,因为在这两种情况下,getType()
都是在 Test
类型的同一对象上调用的。这是因为 JVM 在调用基本构造函数时知道正在创建的对象的类型是派生类 Test
,因此这就是正在打印的类型。
这种行为并不适用于所有编程语言,但它在 Java 中是这样工作的。
如果一个类想要访问它自己的 Class
对象,它可以静态,即使用 SuperTest.class
表达式。
要获得您想要的行为,您可以将类从构造函数传递给 whoAmI
,如下所示:
class SuperTest {
SuperTest() { whoAmI(SuperTest.class); }
void whoAmI(Class c) { System.out.println(c.getName()); }
}
class Test extends SuperTest {
Test() { whoAmI(Test.class); }
}
关于java - 继承:有没有办法发现调用方法的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24846017/
我是一名优秀的程序员,十分优秀!