接口是不能分配内存内间的,即Interface I1=new I1();会出现编译错误,抽象类也如此,但下面这段代码谁能解释一下?
abstract class I1{
private int i;
public void seti(int val){
i=val;
}
public int geti(){
return i;
}
abstract void p();
}
public class Test {
public static I1 getI1(){
return new I1(){ // ??
public void p(){
System.out.println("hello,pattern"); //没有执行??
}
};
}
public static void main(String[] args){
Test test=new Test();
I1 i1=test.getI1();
}
}
难道是java内部申请了一段内存空间,然后做了一个伪reference,用这段内存空间指向它?
abstract class I1{
private int i;
public void seti(int val){
i=val;
}
public int geti(){
return i;
}
abstract void p();
}
public class Test {
public static I1 getI1(){
return new I1(){ // ??
public void p(){
System.out.println("hello,pattern"); //没有执行??
}
};
}
public static void main(String[] args){
Test test=new Test();
I1 i1=test.getI1();
}
}
难道是java内部申请了一段内存空间,然后做了一个伪reference,用这段内存空间指向它?
的问题,其实你根本就没有调用p这个函数.
public void p(){
System.out.println("hello,pattern"); //没有执行??
}
};
这里定义了一个匿名的类,并且生成了一个该类的实例.
{
private int i;
public void seti(int val)
{
i=val;
}
public int geti()
{
return i;
}
abstract void p();
}
public class Test
{
public static I1 getI1()
{
return new I1()
{ // ??
public void p()
{
System.out.println("hello,pattern"); //没有执行??
}
};
}
public static void main(String[] args)
{
Test test=new Test();
I1 i1=test.getI1();
i1.p();
}
}
这样就执行了
interface I1{
void p();
}public class Test {
public static I1 getI1(){
return new I1(){ // new I1()好像不符合java规范,不能给一个接口分配内存空间
public void p(){
System.out.println("hello,pattern");
}
};
}
public static void main(String[] args){
Test test=new Test();
I1 i1=test.getI1();
}
}
这段程序能编译成功,请问java内部是如何实现的?
实际上,getI1()中创建的就是上述类的一个实例,而不是I1的实例。因为该类是I1的子类,故
可以用I1作为该实例对象的引用类型,仅此而已。
/`***********************************************************************************
public static I1 getI1(){
return new I1(){ // ??
public void p(){
System.out.println("hello,pattern"); //没有执行??
}
};
}
***************************************************************************************/
//这样就是隐式声明一个实现了I1接口的class(该class没有明确的名字,编译的时候,编译器会自动为该类命名为Test$I1),然后返回该class的一个实例
上面的代码相当于
///////////////////////////////////////////////////////////////////////////////////////
public static I1 getI1(){
calss Test$I1 implements I1 {
public void p(){
System.out.println("hello,pattern"); //没有执行??
}
};
return new Test$I1();
}//这样就是显式声明一个实现了I1接口的class,然后返回该class的一个实例
////////////////////////////////////////////////////////////////////////////////////////
public static void main(String[] args){
Test test=new Test();
I1 i1=test.getI1();
}
}
至于System.out.println("hello,pattern"); //没有执行??
那是因为你没有调用接口的 p()方法,这不是构造函数,不调用又怎么会自动执行呢?