- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我遇到了以下 java 代码,但我不确定它是什么意思。我们可以在实例化一个类之后在'{'中编写代码吗,例如new TestClass { */code goes here */}
但是当我尝试运行代码时,我没有在输出中看到“Z is 10”。谁能给我一些链接,我可以从中获得与 Java 的此功能相关的更多信息。
class TestClass {
int z;
public TestClass(){
z=10;
}
public int getZ(){
return z;
}
public void setZ(int z){
this.z=z;
}
}
class A
{
public static void main (String[] args) throws java.lang.Exception
{
TestClass TC = new TestClass() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
}
}
最佳答案
这是一个匿名内部类。它创建一个对象,该对象是某个类的实例,该类是 TestClass 的子类,您不想在其中为该子类命名(因为您只需要即时创建对象,而无需在任何地方使用该类否则)。
代码仅初始化对象,您实际上并未调用所创建对象的方法,因此您看不到任何输出。您可以在代码中添加一行
public static void main (String[] args) throws java.lang.Exception
{
TestClass TC = new TestClass() {
public void testprint() {
System.out.println("Z is " + getZ());
}
};
// <- call the new method (>_< this won't compile)
TC.testprint();
}
除非这不起作用,因为 testprint 未定义为 TestClass 上的方法,引用对象的局部变量具有 TestClass 类型,因此编译器期望找到在 TestClass 或 TestClass 的父类(super class)上定义的方法。您可以向 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 抽象,我可以向它添加测试打印的实现。但是,因为 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(); // <- call method on object created above
}
testprint 必须更改为调用 Z 的 getter 的父类(super class)版本,因此我们不会有无限递归。现在匿名子类上的 Z getter 调用了 testprint 方法,所以你可以调用 getter 并查看输出:
Z is 10
代码没有为子类分配一个名称,但它仍然分配了一个名称。如果我在 main 的末尾添加一行以查看内部调用的匿名类:
System.out.println(TC.getClass());
它打印
class A$1
在实践中,不能直接调用匿名类中定义的新方法并不是限制。如果您想将一个类的实现传递给某个其他对象的方法,则您提供了一个匿名类,采用匿名类对象的东西不会知道(也不应该知道,请参阅 LSP ) 如何调用新方法。
关于java - 在实例化类时声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23294569/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!