我是靠谱客的博主 称心白昼,最近开发中收集的这篇文章主要介绍Java声明类时实例化,java – 在实例化类时声明函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是一个匿名的内部类.它创建了一个对象,它是一个子类的实例,它是子类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 – 在实例化类时声明函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部