看这个程序:
interface Destinations{
String readLabel();
}
public class Parcel9 {
public Destinations destiantions(final String dest){
return new Destinations(){
private String label = dest;
public int i = 4;
{
System.out.println(label);
System.out.println(i);
}
public String readLabel(){
return label;
}
public void f(){
System.out.println(i);
}
};
}
public static void main(String[]args){
Parcel9 p = new Parcel9();
Destinations d = p.destiantions("Tasmania");
}
}
其中:
请问:
public int i = 4; 这个i怎么能正确初始化呢 这个匿名内部类并没有构造方法啊 只有当调用构造方法时才会执行对象的初始化的啊 “i” 应该为默认值0啊
谢谢
interface Destinations{
String readLabel();
}
public class Parcel9 {
public Destinations destiantions(final String dest){
return new Destinations(){
private String label = dest;
public int i = 4;
{
System.out.println(label);
System.out.println(i);
}
public String readLabel(){
return label;
}
public void f(){
System.out.println(i);
}
};
}
public static void main(String[]args){
Parcel9 p = new Parcel9();
Destinations d = p.destiantions("Tasmania");
}
}
其中:
请问:
public int i = 4; 这个i怎么能正确初始化呢 这个匿名内部类并没有构造方法啊 只有当调用构造方法时才会执行对象的初始化的啊 “i” 应该为默认值0啊
谢谢
匿名类中的新增成员变量和方法即使访问权限是public的
外部也无法调用。只能在匿名类内部当作私有方法调用。
就像上面程序中的 i和方法f(),在该匿名类外部是无法被访问到的。
如果想初始化的话,只能在外部对象可以访问到的方法 readLabel()里进行初始化。
public int i = 4;lz你这句不就是给i赋值吗? 这还用啥构造方法啊?我声明一个变量int a = 5;你能说这句不写在构造方法里面,a的值就不是5了?不要这么死心眼...
//这里实际上JVM给i分配空间的同时就已经让它指向一个内存地址了
public int i = 4;
{
//当然如果上面写成 public int i;
//这里i=4;
//不就是把上面的一步分成2步而已嘛,实际上JVM还是会分2步执,先初始化,再赋值!
System.out.println(label);
System.out.println(i);
}
public int i = 4; ?//这个i不是初始化了么??
这同等于尼实力化这个匿名类之前已经对这个类的label成员已经初始化了,可以把这个看成 static 的,最先给它初始化,所以会打印出4
这个跟这个格式是不一样的
interface Destinations { String readLabel();
}class DestinationsImpl implements Destinations { private String label; public int i = 4;
{
System.out.println(label);
System.out.println(i);
} public DestinationsImpl(String dest) {
label = dest;
} public String readLabel() {
return label;
} public void f() {
System.out.println(i);
}
}public class E { public Destinations destiantions(final String dest) {
return new DestinationsImpl(dest);
} public static void main(String[] args) {
E p = new E();
Destinations d = p.destiantions("Tasmania");
}
}
这就是匿名内部类模拟构造方法的初始化方式
按常理这里应该是条执行语句,不是定义,应该放在{}中吧,但是直接这样也可以。希望谁解释一下。
是在实例化之前进行初始化,你这里已经创建了一个匿名类的实例 那他自然就初始化了
System.out.println(label);
System.out.println(i);
} 在这个块中加一行代码 System.out.println(this.getClass());控制台会打印出: class sdasda.so.Parcel9$1Parcel9$1 可能就是你起的匿名类的名字吧,注意只是可能是
不是可能,而是肯定。大家可以看看编译好的class文件,就知道了。这个名字是不能被我们的代码访问的而已。