创建一个匿名内部类

如题:创建一个匿名内部类... 如题:创建一个匿名内部类 展开
 我来答
Christ_earl
2009-11-17 · TA获得超过1245个赞
知道小有建树答主
回答量:239
采纳率:0%
帮助的人:0
展开全部
很简单的例子:
public class NoneClass {
Peoples man = new Peoples(){public void eat(){System.out.println("吃饭");}};
}

interface Peoples{
public void eat();
}
这里的
new Peoples(){public void eat(){System.out.println("吃饭");}};
就创建了个匿名内部类
本来接口interface是不能new的,但是紧跟new Peoples(){}后跟的大括号,表示这个接口有个实现类,其实new的是Peoples这个接口的实现类,但是这个实现类是匿名内部类的形式。
裔秉耿同
2019-03-22 · TA获得超过3557个赞
知道大有可为答主
回答量:3077
采纳率:28%
帮助的人:192万
展开全部
1、匿名内部类就是没有名字的内部类。这是java为了方便我们编写程序而设计的一个机制。因为有时候有的内部类只需要创建一个它的对象就可以了,以后再不会用到这个类,这时候使用匿名内部类就比较合适,而且也免去了给它取名字的烦恼。
2、如果满足下面的一些条件,使用匿名内部类是比较合适的:
·只用到类的一个实例。
·类在定义后马上用到。
·类非常小(sun推荐是在4行代码以下)
·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
3、用匿名内部类创建多线程有两种方式,和创建一个线程是一样的。
第①种继承thread:
new
thread(){
public
void
run(){
//do
something
};
}.start();
第②种实现
runnable接口:
new
thread(new
runnable()
{
public
void
run()
{
//do
something
};
})
{
}.start();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nirenfu
2009-11-17 · TA获得超过1991个赞
知道小有建树答主
回答量:368
采纳率:0%
帮助的人:628万
展开全部
拷这段给你吧,他说得比较清楚:
匿名内部类
java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:

new interfacename(){......}; 或 new superclassname(){......};

下面接着前面继续举例子:

public class Goods3 {
public Contents cont(){
return new Contents(){
private int i = 11;
public int value() {
return i;
}
};
}
}

这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象,看上去的确十分简洁。

在java的事件处理的匿名适配器中,匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码:

frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:

如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
在这个匿名内部类中使用初始化代码块。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aw_vip/archive/2008/12/01/3419278.aspx
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
w_xiaofeng20xx
2009-11-17 · 超过16用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:44.5万
展开全部
给你一个我开发中遇到的实例,jdbcTemplate的

public List<AddMoneyDesc> getByCondition(String sql) throws Exception{
DefaultTransactionDefinition definition =new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
List<AddMoneyDesc> rlist = null;
rlist = (List<AddMoneyDesc>)jdbcTemplate.execute(sql,
new PreparedStatementCallback(){
public Object doInPreparedStatement(PreparedStatement pst) throws SQLException
{
List<AddMoneyDesc> list = new ArrayList<AddMoneyDesc>();
ResultSet rst = pst.executeQuery();
while(rst.next())
{
AddMoneyDesc amd = new AddMoneyDesc();
amd.setEmp_no(rst.getString("emp_no"));
amd.setAdd_moeny(rst.getString("addmoney"));
amd.setAdd_usr(rst.getString("add_usr"));
amd.setAddmoney_dt(rst.getString("addmoney_dt"));
amd.setCard_no(rst.getString("card_no"));
amd.setLocation(rst.getString("location"));
list.add(amd);
}
return list;
}
});

return rlist;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式