黑马程序员技术交流社区
标题:
关于匿名内部类的问题
[打印本页]
作者:
黄陂酷歌
时间:
2014-3-18 17:23
标题:
关于匿名内部类的问题
abstract class AbsDemo{
abstract void show();
}
class Outer{
int x = 3 ;
public void function(){
new AbsDemo(){
void show(){
System.out.println("inner"+x);
}
}.show();//.show()怎么理解,前面一大堆是个对象吗?//是的话有怎么理解
}
}
class NoNameInnerClassDemo{
public static void main(String[] args) {
new Outer().function();
}
}
复制代码
作者:
→★稻草人☆
时间:
2014-3-18 17:54
前面是相当于创建了一个对象,而.show()是调用这个对象中的方法。
作者:
darkpiece
时间:
2014-3-18 18:05
那一大堆可以理解为一个对象,是说有一个类继承了AbsDemo,复写了show方法并调用。
作者:
目标
时间:
2014-3-18 18:14
从new 开始到末尾就相当于定义了一个匿名内部类对象,并覆写了抽象类中的抽象方法, 并调用了show()方法。
作者:
李猛
时间:
2014-3-18 18:58
匿名内部类的定义规则是:使用该类继承的接口或者是父类,new 接口/父类( ){主体程序(包含成员变量与成员方法)};一般情况下成员方法不超过三个。这种方法new出来的整体就可以看做是匿名内部类的实例,花括号后面可以跟上该类所属的方法表示调用(匿名内部类.方法)
作者:
sgs_gzy
时间:
2014-3-18 19:08
new Outer().function(),为了调用function方法,而要调用function就得新建个匿名对象new Outer()
而function()方法中有个show()方法,由于show()方法是在抽象类中,所以要调用抽象类中的方法就必须继承它并且复写,可以新建个类名,并继承Abstract,但该函数并未新建类来继承,而是可以直接新建个父类对象,来带代表匿名子类对象而这个方式父类引用指向子类对象,就是属于匿名内部类
作者:
孟茹
时间:
2014-3-18 20:14
new AbsDemo(){ void show(){ System.out.println("inner"+x); } }这个是匿名内部类的格式创建对象的格式,不过这个是复写了父类(抽象类AbsDemo)show方法,毕老师说这就是个格式,记住就好。如果不想那样调用show方法的话,也可以这样:Inter in=new AbsDemo(){viod show();} in.show;
作者:
孟茹
时间:
2014-3-18 20:19
new AbsDemo(){
void show(){
System.out.println("inner"+x);
}
}
这个是匿名内部类的格式创建对象的格式,不过这个是复写了父类(抽象类AbsDemo)show方法,毕老师说这就是个格式,记住就好。如果不想那样调用show方法的话,也可以这样:
Inter in=new AbsDemo(){
viod show(); }
in.show;
作者:
刘一博
时间:
2014-3-18 20:44
new AbsDemo(){
void show(){
System.out.println("inner"+x);
}
}
复制代码
这块相当于创建了一个匿名内部类对象,之后调用其show方法,可以看成
AbsDemo absDemo = new AbsDemo(){
void show(){
System.out.println("inner"+x);
}
};
absDemo.show();
复制代码
作者:
Alexander
时间:
2014-3-18 22:11
new AbsDemo(){
void show(){
System.out.println("inner"+x);
}
}.show();
首先,AbsDemo是个抽象类,根据Java的定义,抽象类是要被继承并重写里面的抽象方才能实例化的
所以,要实例化AbsDemo不行,就要先定义其一个子类,并重写show方法
通过实例化其子类,来创建对象
于是上面的代码可以分为三部分理解:
1.new AbsDemo():这部分等于是创建了继承AbsDemo的对象,虽然是new的AbsDemo本身,但内部是作为其子类看的
2.void show() {}:上面已经继承了
AbsDemo,
那么下面就应该实现父类的抽象方法了,要将方法体具体实现
3.{}.show():这是在用新建的AbsDemo的子类对象调用其重写的show()方法,既然子类对象已经创建,就可以调用方法了
通过上面你可以发现,虽然实例化的是AbsDemo的子类,但并没有出现子类的名称,所以也就是为什么叫匿名内部类的原因了
作者:
tangxiaobo1991
时间:
2014-3-18 22:27
其实匿名内部类就相当于一个子类的实例(或者叫做对象),在这个实例中重写了父类的抽象方法,其格式是: new AbsDemo(){重写接口或者接口的方法}.function。老毕老师也讲过,这只是一种格式,记住就好。但注意:一般重写的方法要少于等于三个才使用内部类的格式,否则会显得格式臃肿,不便于阅读。
作者:
三丶胖子
时间:
2014-3-19 15:47
可以理解为 void show().show()
void show(){} 大括号中的内容() “System.out.println("inner"+x)”
是实现了抽象类 AbsDemo 的show()方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2