匿名内部类java内部类和匿名内部类的区别
匿名内部类 时间:2021-09-27 阅读:(
)
匿名内部类?
匿名类是不能有名称的类,所以没办法引用它们。
必须在创建时,作为new语句的一部分来声明它们。
这就要采用另一种形式的new语句,如下所示: new <类或接口> <类的主体> 这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。
它还创建那个类的一个新实例,并把它作为语句的结果而返回。
要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。
如果匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。
如果匿名类实现了一个接口,它的主体必须实现接口的方法。
java 代码
interface pr
{
void print1();
}
public class noNameClass
{
public pr dest()
{
return new pr(){
public void print1()
{
System.out.println("Hello world!!");
}
};
}
public static void main(String args[])
{
noNameClass c=new noNameClass();
pr hw=c.dest();
hw.print1();
}
}
pr也可以是一个类但是你外部调用的方法必须在你的这个类或接口中声明外部不能调用匿名类内部的方法
Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧。
如下:
java 代码
import java.awt.*;
import java.awt.event.*;
public class QFrame extends Frame {
public QFrame() {
this.setTitle("my application");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
this.setBounds(10,10,200,200);
}
}
内部匿名类,就是建立一个内部的类,但没有给你命名,也就是没有引用实例的变量。
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
}
new 是建立一个 WindowAdapter对象 ,后面一个 {} 表示这个括号中的操作作用于这个默认的对名象,而上面的Java程序中后面是一个函数体。
这个用法的作用是:创建一个对象的实例,并且 override 它的一个函数。
打开 WindowAdapter 的代码可以发现。
它是一个抽象类。
它是对 WindowListener 接口的一个实现。
Frame.addWindowListner(); 的参数是一个 WindowListner ,而实现上是传一个从WindowAdapter 派生出的一个匿名类。
1.怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。
先看段伪代码
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... } //这里就是有个匿名内部类
}
一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。
但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
其实拆分上面的匿名内部类可为
class SonOne extends Father{
... //这里的代码和上面匿名内部类,大括号中的代码是一样的
}
public class Test{
Father f1 = new SonOne() ;
}
2.匿名内部类的注意事项
注意匿名类的声明是在编译时进行的,实例化在运行时进行。
这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法。
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
·内部类只能访问外部类的静态变量或静态方法。
匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。
当在匿名类中用this时,这个this则指的是匿名类或内部类本身。
这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名
3.匿名内部类的作用
Java的内部类和C++中的嵌套类有本质的不同:C++的嵌套类没有指向包装类的句柄。
仅仅表达一个封装的概念;但是Java的内部类不同,它可以访问包装类的成员(这表示它拥有指向包装类的句柄)。
匿名内部类是内部类的一种简化写法:return new Wrapper {
...
};
等价于:Wrapped extends Wrapper {
...
}
return new Wrapped();
难道匿名内部类就只这一点作用吗?
考虑一下这样的case:
interface ICount {
int count();
}
class Parent {
int i = 0;
int count() {
return i++;
}
}
有一个类Child,它既想继承Parent的count()方法,又想实现ICount接口中的count方法,这个时候怎么办呢?内部类就可以大显身手了:
class Child extends Parent {
ICount getCount() {
return new ICount {
int i = 0;
int count() {
return (i *= 2);
}
}
}
}
至于你说的只有一个方法或者必须有返回值,这个倒是没有在语法上规定 , 所以应该不存在这一说法。
打字不易,如满意,望采纳。
请问JAVA中匿名内部类有什么用,举个例子,谢谢
public class ExamFrame extends JFrame {
public ExamFrame() {
init();
}
public ExamFrame(ClientContext context) {
this();
this.context = context;
}
public void init() {
setSize(600, 500);
setTitle("在线评测");
setContentPane(createContentPane());
//这里就使用了匿名内部类
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
context.exit(ExamFrame.this, "是否离开!");
}
});
}
}
匿名内部类其实也是类的一种,它的使用是减少资源占用的一种方法,他减少了对象的生成,在完成相应功能后会被Java垃圾回收机制直接回收减少内存资源的占用提高系统执行效率,同时使用比较简单,一般情况下,匿名类常用在线程上也就是Thread的声明上.JAVA中匿名内部类有什么用,举个例子
设计模式中的模板方法模式
public?abstract?class?BankTemplateMethod?{//?抽象类
??//?具体方法
??public?void?takeNumber()?{
????System.out.println("取号排队");
??}
??public?abstract?void?transact();?//?办理具体的业务,抽象方法
??public?void?evaluate()?{
????System.out.println("反馈评分");
??}
??public?final?void?process()?{?//?模板方法,用final修饰,子类不能修改
????this.takeNumber();
????this.transact();
????this.evaluate();
??}
}使用一般匿名内部类
lassClient{
??publicstaticvoidmain(String[]args){
????BankTemplateMethodbtm=newDrawMoney();
????btm.process();
????//?采用匿名内部类
????BankTemplateMethodbtm2=newBankTemplateMethod(){
??????publicvoidtransact(){//?重写业务方法
????????System.out.println("我要存钱!");
??????}
????};
????btm2.process();
????//?采用匿名内部类
????BankTemplateMethodbtm3=newBankTemplateMethod(){
??????publicvoidtransact(){//?重写业务方法
????????System.out.println("我要理财!我这里有2000万韩币");
??????}
????};
????btm3.process();
??}
}还有就是GUI中给按钮啊什么什么的添加事件java匿名内部类具体概念是什么,在什么地方用到?
匿名内部类首先是一个类的内部定义的,是用来帮助你这个外部类去更好的实现一些功能,没有那么神密的,主要用在向方法传递一个对象做为参数。
public void fun(new Person{
System.out.println("你好");
});
向方法传了一个person的对象。
Person是外部类,匿名类只是一个类体,这个类体创建的对象上转型为Person的对象了。
java写一个简单的匿名内部类?
public class Test{
JButton jbt = new JButton();
jbt.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){}
});
}
比较简单的一个按钮监听器实现java内部类和匿名内部类的区别
展开全部
内部类包含匿名内部类,
内部类:匿名内部类,成员内部类,方法内部类.
其实只要你区分一下匿名内部类和其他内部类的写法对于他们的区别就很直观了.
匿名内部类:class outer{
Thread t1=new Thread(){//这就是匿名内部类,没有名字的内部类,写于类以内,继承或者实现一个方法,不可以被外部继承(没有名字怎么继承)
//代码
}
}
方法内部类是写于方法内部,可以被继承,但是方法内部类只能引用方法里的常量.
成员内部类,写于类中的,当做成员对待,属于类的内部类,至于继承和实现方面是最常用的.
热网互联怎么样?热网互联(hotiis)是随客云计算(Suike.Cloud)成立于2009年,增值电信业务经营许可证:B1-20203716)旗下平台。热网互联云主机是CN2高速回国线路,香港/日本/洛杉矶/韩国CN2高速线路云主机,最低33元/月;热网互联国内BGP高防服务器,香港服务器,日本服务器全线活动中,大量七五折来袭!点击进入:热网互联官方网站地址热网互联香港/日本/洛杉矶/韩国cn2...
也有在上个月介绍到糖果主机商12周年的促销活动,我有看到不少的朋友还是选择他们家的香港虚拟主机和美国虚拟主机比较多,同时有一个网友有联系到推荐入门的个人网站主机,最后建议他选择糖果主机的迷你主机方案,适合单个站点的。这次商家又推出所谓的秋季活动促销,这里一并整理看看这个服务商在秋季活动中有哪些值得选择的主机方案,比如虚拟主机最低可以享受六折,云服务器可以享受五折优惠。 官网地址:糖果主机秋季活动促...
sharktech怎么样?sharktech (鲨鱼机房)是一家成立于 2003 年的知名美国老牌主机商,又称鲨鱼机房或者SK 机房,一直主打高防系列产品,提供独立服务器租用业务和 VPS 主机,自营机房在美国洛杉矶、丹佛、芝加哥和荷兰阿姆斯特丹,所有产品均提供 DDoS 防护。不知道大家是否注意到sharktech的所有服务器的带宽价格全部跳楼跳水,降幅简直不忍直视了,还没有见过这么便宜的独立服...
匿名内部类为你推荐
在线协同办公在线oa办公系统主要优势有哪些ros驱动电机如何用ros系统控制dynamixel电机网站推广120种方法如何做好一个网络推广?需要掌握一些什么样的技能?请多多指教!计算机网络安全试题计算机网络安全技术华为技术上海华为技术有限公司怎么样?ctf网络安全大赛网上安全知识竞赛怎么进入四川大学教务系统怎样登入四川大学教务处啊,谢谢了象形文字图片象形字有哪些?暴风播酷云暴风影音播放过的在线视频放在哪个文件夹里湖北文理学院地址湖北文理学院怎么样啊
asp虚拟空间 韩国虚拟主机 高防dns 堪萨斯服务器 inmotionhosting sugarsync 2014年感恩节 淘宝双十一2018 服务器怎么绑定域名 网站实时监控 mysql主机 坐公交投2700元 京东商城0元抢购 新天域互联 河南移动网 33456 银盘服务是什么 新世界服务器 免费邮件服务器 双线asp空间 更多