首页 > 编程知识 正文

java内部类与异常类,匿名类和内部类的区别

时间:2023-05-04 19:09:33 阅读:62807 作者:2594

Java匿名类(匿名内部类)学习参考博文:无怨之都

1 .初识匿名系标准说法: 内部类包括:成员类、局部类、匿名类(匿名内部类)。

匿名类概念:

匿名类可以使你的代码更加简洁(JDK8或更高版本http://www.Sina.com/)更简洁。 与Lambda本地类非常相似,不同的是定义一个类的同时对其进行实例化,即没有类名。 匿名类为表达式,非经常性类某个局部类你只需要使用一次,就可以使用匿名类代替局部类

如果只使用一个本地类,则匿名类也称为匿名内部类,因为匿名类没有类名,所以除了定义它的位置之外不能调用它

2 .通过示例分析本地类和匿名类来区分sayHello方法,有本地类和匿名类分别实现HelloWorld接口的方法

publicclasshelloworldanonymousclasses {接口hello world { public void greet (; publicvoidgreetsomeone (字符串形式); }publicvoidsayHello((/***1,本地类:EnglishGreeting是HelloWorld接口)/classenglishgreetingimplementshelloworord } @ overridepublicvoidgreetsomeone (string someone ) { name=someone; System.out.println (本地类) name; }//helloworldenglishgreeting=newenglishgreeting (使用接收的接口类型创建本地类的Englishgreeting的实例化对象; //本地类:无参与方法englishGreeting.greet (; //本地类:带参数的方法englishGreeting.greetSomeone ('带参数); /** * 2,匿名类实现了HelloWorld接口并创建了实例化对象: French greeting */helloworldfrenchgreeting=new hello world () @ override公共语音网格() greetsomeone ) ) name; } @ overridepublicvoidgreetsomeone (string someone ) { name=someone; 系统. out.println (匿名类: ' name ); }; //匿名类:无参与方法frenchGreeting.greet (; //匿名类:带引用的方法frenchGreeting.greetSomeone ('带引用); } publicstaticvoidmain (string . args ) helloworldanonymousclassesmyapp=newhelloworldanonymousclasses ); myApp.sayHello (; } 匿名类的使用场景:

局部系:无参局部系:带参匿名系:无参匿名系:带参【输出】

代码中的本地类和匿名类实现的功能相同,内部方法实现的代码也相同,区别只是实现了HelloWorld接口

【分析】

创建本地类并实现接口: classenglishgreetingimplementsHelloworld { . }创建并按接口类型接收本地类的实例化对象: hel

loWorld englishGreeting = new EnglishGreeting();调用实例化对象的方法

匿名类的格式是:

创建匿名类实现接口同时对其进行实例化:HelloWorld frenchGreeting = new HelloWorld() {...}调用实例化对象的方法

【区别】

局部类EnglishGreeting实现HelloWorld接口,有自己的类名:EnglishGreeting,定义完成后需要再对其实例化对象:englishGreeting才能可以使用方法匿名类在定义时就已经实例化成对象:frenchGreeting,定义完了就可以直接使用方法匿名类是一个表达式,因此在定义的最后用分号结束
3. 匿名内部类的语法 3.1 匿名类实现接口

其实上面的示例中的匿名类就是实现接口的方式,这个示例将实现更复杂的功能

public class InterfaceTest { public static void main(String[] args) { TomInterface tif = new TomInterface() { String name = "ngdxb"; @Override public void getName() { System.out.println(name); } TomInterface setName(String name){ this.name = name; return this; } }.setName("杰瑞"); tif.getName(); }}interface TomInterface{ void getName();}

【结果】

杰瑞

【分析】

main方法创建匿名类实现TomInterface接口并实例化:new TomInterface{...}调用匿名类对象的setName方法,将杰瑞赋值给匿名类的成员变量name,并返回当前实例this给接口变量tifmain方法调用匿名类对象的方法tif.getName(),而此时的匿名类的成员变量name的值已经被替换成杰瑞,所以最后输出杰瑞而不是ngdxb
3.2 匿名类继承父类 (匿名子类)

匿名类继承父类,调用父类构造,重写父类方法

public class ExtendTest { public static void main(String[] args) { String name = "cxddp"; // 创建父类对象,打印原始name值 PartherClass partherClass = new PartherClass(); System.out.println("父类的getName方法=" + partherClass.getName()); // 使用匿名类继承父类,并打印name值 PartherClass pc = new PartherClass(name){ @Override public String getName(){ return "匿名类 - "+super.getName(); } }; System.out.println(pc.getName()); }}class PartherClass{ private String name = "mmdqq"; public PartherClass(){} public PartherClass(String name){ this.name = name; } public String getName(){ return this.name; }}

【结果】

父类的getName方法=mmdqq匿名类 - cxddp

【分析】

创建父类对象并调用getName方法,这个不用细说创建匿名类继承父类并实例化对象:pc,本次匿名类调用的是父类的带参构造,将参数赋值给了父类的name调用匿名类重写的getName方法,得到新的name值 3.3 区别 Demo demo = new Demo(xxx){...} 操作符:new一个要实现的接口或要继承的类,示例3.1 是实现接口,示例3.2 是继承类一对括号,如果是匿名子类,那么父类有构造参数就填,不带参就空着;如果匿名类是实现接口,那么括号里需要空着{...},括号里括着的是匿名类的声明主体末尾的;号,因为匿名类的声明是一个表达式,是语句的一部分,所以需要分号结尾表面上看匿名类没有类名,没有构造参数。但其实在编译的时候,编译器会给匿名类分配类名和构造器,只是我们无法操作也不能复用。如需验证,可以看编译后的class文件,多出一个命名格式:匿名类定义类$?.class的文件。例如示例3.2,匿名类的class文件就是:ExtendTest$1.class

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。