黑马程序员技术交流社区
标题:
接口不是不能被实例化嘛?
[打印本页]
作者:
ysdolls
时间:
2014-8-6 17:41
标题:
接口不是不能被实例化嘛?
本帖最后由 ysdolls 于 2014-8-6 18:56 编辑
那为什么会有new FilenameFilter(){}}这种匿名内部类语句呢?
还是实例化的是某个实现该接口的类的实例?
作者:
新语新空
时间:
2014-8-6 18:38
这种匿名内部类实际相当于创建一个接口的匿名实现类。。。
作者:
江祖贇
时间:
2014-8-6 18:39
匿名内部类 其实就是匿名的子类对象
作者:
kakasa
时间:
2014-8-6 20:09
没有名字,引用父类名的子类对象?
作者:
liqi
时间:
2014-8-6 20:10
看视频中讲匿名类,如果内部类 class 子类 extends 父类 (){}
则匿名内部类 new 父类(){} 即这个匿名内部类是父类的实现类
作者:
郭旭辉
时间:
2014-8-6 22:29
匿名子类对象
作者:
黑马_java猿
时间:
2014-8-7 09:22
匿名内部类 用的很少 只做了解
作者:
渴望学习
时间:
2014-8-7 11:47
路过~~~~~
作者:
天黑偷牛
时间:
2014-8-7 16:26
这是创建了一个接口的实现类,匿名内部类常用
作者:
zhouqun
时间:
2014-8-7 23:14
{}内必须要重写接口中的抽象方法,匿名内部类,也是多态的一种体现,父类引用指向子类对象
作者:
曾翀
时间:
2014-8-8 15:05
学习了。。。。
作者:
花花公子
时间:
2014-8-9 02:16
首先得知道内部类是干什么的,
内部类就是在一个类中嵌套了一个类,内部的类可以访问外部类的成员(属性,方法),外部类想要访问内部类,就必须要创建内部类的对象。就像如下:
class Outer{//外部类
int num = 4;//外部类成员
class Inner {//内部类
void show(){//内部类方法
System.out.println("inner show run "+num);//访问了外部类成员
}
}
public void method(){//外部类方法要访问内部类
Inner in = new Inner();//必须创建内部类的对象。
in.show();//调用内部类的方法。
}
}
class InnerClassTest
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method();//inner show run + 4
}
}
复制代码
匿名内部类呢?就是内部类的一种简写方式。一般只用一次,前面说的很对,其实就是一个匿名子类对象。但是用的时候有前提,必须继承一个类或者实现一个接口。代码如下匿名内部类
interface Inner
{
void show();
}
class Outer
{
int num = 4;
public Inner method()
{
return new Inner()
{
public void show()
{
System.out.println("inner show run "+num);
}
};
}
}
class InnerClassTest
{
public static void main(String[] args)
{
Outer out = new Outer();
out.method().show();//inner show run + 4
}
}
复制代码
至于为什么要用它呢?new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }
我想一个方面是简化内部类,另一方面打破继承的局限性,也是一种多态的体现,父类引用子类对象。以前不是创建对象并操作对象么,现在直接操作共性类型做事情即可。
我想这也就是为什么,当函数的参数是接口类型引用时,如果接口中的方法不超过3个。可以通过
匿名内部类来完成参数的传递。
interface Inner
{
void show();
}
class InnerClassTest
{
public static void main(String[] args)
{
final int num = 4;
show(new Inner()//这里用匿名内部类,把父类重写。
{
public void show()
{
System.out.println("inner show run"+num);
}
});
}
public static void show(Inner in)//函数的参数是接口类型的引用,此中方法不超过三个,
{
in.show();
}
}
复制代码
此上只是个人看法,如有错误请指出,共同进步,共同发展。
作者:
黑马黄武先
时间:
2014-8-9 02:33
花花公子的见解挺好:handshake
作者:
花花公子
时间:
2014-8-9 10:23
可以给加分么:#
作者:
小洁呵呵
时间:
2014-8-9 11:05
创建的是子类
作者:
不想飞不到
时间:
2014-8-9 13:40
这个不叫实例化
相当是多态的一种形式
父类 对象名 = new 子类;
这里写为
接口 对象名 = new 子类;
只不过这个子类没有名字
你要想给它起个对象名
便于理解,可以
FilenameFileter fn = new FilenameFilter(){};
相当于implements
这样写的好处是可以调用匿名内部类里的多个方法
fn.f1();
fn.f2();
若不这样写
只能调用一个方法
new FilenameFilter(){}.f1();
作者:
Ezreal
时间:
2014-8-9 16:29
这又不是实例化接口
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2