这个一个匿名内部类代码,对15行new Inter()有两个疑问。
其一,学接口时说接口是不可以new对象的,这里为什么可以?
其二,这段代码开始做了一个接口用来给内部类来实现的,可是通篇都没有implements语句,15行是怎样实现的呢?作者: 王冰 时间: 2012-7-2 16:06
因为匿名内部类就是内部类的简写,匿名内部类也就是一个匿名的带内容的子类对象,匿名内部类必须继承一个类或者实现接口,定义匿名内部类时new出来的必须是父类或者接口,如:
new Inter()//new出来的就是子类对象
{
public void show()//实现了父接口的方法,即定义的就是子类的内容
{
System.out.println("show:"+x);
}
}.show();//new出来的对象直接调用子类实现的方法作者: 黄丽慧 时间: 2012-7-2 16:37
楼主应该好好看看匿名内部类的视频,
new Inter()//??
{
public void show()//该方法其实就是匿名内部类对inner接口的实现了
{
System.out.println("show:"+x);
}
}.show();
这段代码是创建一个匿名内部类的对象,inner是这个匿名内部类继承的接口,既然是匿名内部类了当然是看不到内部类的名字。如果按你说的new创建的是inner类的对象,那inner不就成了类名了,这就和匿名内部类相悖了。
new Inter()//??
{
public void show()//这是实现接口的方法
{
System.out.println("show:"+x);
}
public void play()//这是内部类自身的方法
{
System.out.println("play"+x);
}
}.show();作者: 何旭栋 时间: 2012-7-2 16:51
这种方式实际上是一种简写形式,相当于:
class Inner implements Inter {
public void show(){
System.out.println("show:"+x);
}
}
Inter in = new Inner();
in.show();
这样主要是为了简化代码书写,一般成员方法调用一次时候这样用,用到gui图形界面时候这样用的就比较多作者: 余清兰 时间: 2012-7-2 17:15
你的代码中的15行new Inter(){}这实际是在隐式继承Inter接口,所以就相当于返回的是一个匿名子类对象,()指的是构造函数,如果父类里有特殊的构造函数,可以往()里传参数。{}这个大括号里就是在定义内部类的内容,.show()就是在用这个对象调用子类方法
下面是匿名内部类的具体特点
匿名内部类:
1、 匿名内部类其实就是内部类的简写格式。
2、 定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
3、 匿名内部类的格式:new 父类或者接口(){定义子类的内容}; 这个地方的()指的是构造函数,如果父类里有特殊的构造函数,可以往()里传参数。
4、 其实匿名内部类就是一个匿名子类对象。匿名子类对象只能调用一次。
5、 匿名内部类中定义的方法最好不要超过三个。
interface Inter
{
void method();
}
class Test
{
static Inter funcation()
{
return new Inter()
{
public void method()
{
System.out.println("method run!");
}
};
}
}
class InterTest
{
public static void main(String[] args)
{
Test.funcation().method();
}
}
复制代码
作者: 尹善波 时间: 2012-7-2 18:23
interface Inter
{
public void show();
}
class Outer
{
int x = 3;
public void method()
{
new Inter()// class Inner implements Inter 这其实就是内部类的简写格式,就是一个匿名子类对象;
{
public void show()//实现父类接口方法
{
System.out.println("show:"+x);//定义子类内容,对父类方法的覆盖
}
}.show();//创建的对象直接调用匿名子类实现方法
}// Inter in = new Inner(); in.show();
}
class InnerClassDemo3
{
public static void main(String[] args)
{