概述
这是一个匿名的内部类.它创建了一个对象,它是一个子类的实例,它是子类TestClass,你不想给那个子类命名(因为你只需要动态创建对象而不需要在任何地方使用该类)其他).
代码只初始化对象,你实际上并没有在你正在创建的对象上调用方法,所以这就是你没有看到任何输出的原因.您可以在代码中添加一行
public static void main (String[] args) throws java.lang.Exception
{
TestClass TC = new TestClass() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
// _< this won't compile)
TC.testprint();
}
除了这不起作用,因为testprint没有被定义为TestClass上的方法,引用该对象的局部变量的类型为TestClass,因此编译器期望找到在TestClass或TestClass的超类上定义的方法.您可以向TestClass添加某种方法,如下所示:
abstract class TestClass {
int z;
public TestClass(){
z=10;
}
public int getZ(){
return z;
}
public void setZ(int z){
this.z=z;
}
// add new method
public abstract void testprint();
}
现在编译器知道期望TestClass类型的对象将有一个名为testprint的方法.我没有必要使TestClass抽象,我可以添加一个testprint的impelmentation.但是,因为TestClass是抽象的,很明显新对象不是TestClass,而是它的一些子类.
或者,通过TestClass的另一个已公开方法调用此方法.使用您的TestClass不变,但将主方法更改为:
public static void main (String[] args) throws java.lang.Exception
{
TestClass TC = new TestClass() {
public void testprint() {
System.out.println("Z is " + super.getZ());
}
// override Z getter to call testprint
@Override public int getZ(){
testprint();
return z;
}
};
TC.getZ(); //
}
testprint必须改为调用Z的getter的超类’版本,所以我们不会有无限递归.现在,匿名子类上的Z getter调用了testprint方法,因此您可以调用getter并查看输出:
Z is 10
代码不会为子类分配名称,但仍然会为其分配一个名称.如果我在main的末尾添加一行来查看内部调用的匿名类:
System.out.println(TC.getClass());
它打印
class A$1
实际上,无法直接调用匿名类中定义的新方法不是限制.如果要将类的实现传递给某个其他对象的方法,则提供匿名类,获取匿名类对象的东西不会知道(并且不应该知道,参见LSP)无论如何要调用新方法.
最后
以上就是称心白昼为你收集整理的Java声明类时实例化,java – 在实例化类时声明函数的全部内容,希望文章能够帮你解决Java声明类时实例化,java – 在实例化类时声明函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复