首页 > 编程知识 正文

匿名类和内部类的区别,java匿名类有什么用

时间:2023-05-06 11:14:30 阅读:62810 作者:4732

如何使用Java内部类和匿名内部类【请尊重原件并注明出处】http://blog.csdn.net/guyue alian/article/details/519811633http://www.Sina.ccom 1(1) ) ) ) ) )如果内部类具有相同名称的方法,则必须以' OuterClass.this.MethodName () '格式调用。 其中,OuterClass和MethodName将被替换为实际的外部类名及其方法。 this是关键字,表示对外部类的引用)如果内部类没有同名的方法,则可以直接调用外部类的方法。

但是,外部类不能直接调用内部类的private方法,外部类也不能直接调用其他类的private方法。 注意:内部类直接使用外部类的方法取决于内部类是否具有相同名称的方法,无论该方法是否为静态。 包内类; publicclassouterclass (私有语音识别器) ) system.out.println (it ' smethodofouterclass ' ); } publicstaticvoidmain (string [ ] args ) {OuterClass t=new OuterClass ); outer class.inner class in=t.new inner class (; in.innerMethod (; } class inner class { publicvoidinnermethod (} { outer class.this.outer method ); //如果内部类成员方法与外部类成员方法同名,请使用this将外部类的方法outerMethod (; //在内部类没有同名方法时执行外部类方法(}private void outerMethod ) (system.out.println ) (' it'smethodofinnerclass ' ) }}输出结果来自it ' smethodofouterclassit ' smethodofinnerclass 3358 www.Sina.com/http://www.Sina.com /

方法中的局部变量在方法结束时释放此变量。 final确保此变量始终指向一个对象。

首先,内部类和外部类实际上处于同一级别,内部类在方法中定义,方法执行完成后不会被凶光丢弃。 问题是,如果外部类的方法中的变量未定义final,则在执行外部类的方法时,也会GC此局部变量。 但是,当有内部类的方法还没有运行时,就再也找不到他引用的外部变量了。 定义为final时,java会复制此变量并将其作为成员变量包含在内部类中。 这样,final限定的值始终不能更改,因此该变量指向的内存空间不会改变。 请注意,使用JDK1.8时,方法中内部类的方法是可以直接访问外部类方法的局部变量,不需要声明为final类型。 publicclassouterclass { intnum1=0; //成员变量private void outerMethod () {int num2=0; //方法中的局部变量class inner class _1(publicvoidinnermethod ) ) system.out.println (num1); //方法中的内部类的方法在//JDK1.8之前,该方法中的内部类的方法可以成功访问外部类的成员变量system.out.println(num2),而外部类的方法在本地变量中使用JDK1.8或更低版本时,Eclipse显示错误消息,指出一、内部类: 内部类的实例化与普通类不同,可以在需要时实例化

因此,在外部类的非静态方法中,内部类对象private void outerMethod () system.out.println ) ' it'smethodofouterclass ' ); Innerclass in=new Innerclass (; //用外部类的outerMethod方法实例化内部类很好哦}但是静态方法需要注意! 无法使用静态方法直接new内部类。 发生否关闭I错误

nstance of type OuterClass is accessible. Must qualify the allocation with an enclosing instance of type OuterClass (e.g. x.new A() where x is an instance of OuterClass).      这是因为静态方法是在类实例化之前就可以使用的,通过类名调用,这时动态内部类都还没实例化呢,怎么用,总不能调用一个不存在的东西吧。      如果想在Static方法中new内部类,可以把内部类声明为Static public class OuterClass {private void outerMethod() {System.out.println("It's Method of OuterClass");}public static void main(String[] args) {Innerclass in = new Innerclass();in.innerMethod();}static class Innerclass {//把内部类声明为staticpublic void innerMethod() {System.out.println("It's Method of innerMethod");}}}     当然,一般不使用static的方式,而是推荐这种方法:x.new A() ,其中 x是外部类OuterClass的实例,A是内部类Innerclass package innerclass;public class OuterClass {private void outerMethod() {System.out.println("It's Method of OuterClass");}public static void main(String[] args) {OuterClass.Innerclass in = new OuterClass().new Innerclass();//使用x.new A()的方式in.innerMethod();}class Innerclass {public void innerMethod() {System.out.println("It's Method of innerMethod");}}}      x.new A() ,其中 x是外部类OuterClass的实例,A是类部类Innerclass,当然可以拆分如下,这样就显然很明白啦: public static void main(String[] args) {OuterClass out = new OuterClass();//外部实例OuterClass.Innerclass in = out.new Innerclass();//外部实例.new 外部类in.innerMethod();}
    (4)什么情况下使用内部类
     典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外层类的对象。所以你可以认为内部类提供了某种进
入其外层类的窗口。
    使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外层类是否已经继承了某个(接口的)实
现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角
度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。    (5)在静态方法中实例化内部类例子:(内部类放在静态方法中) package javatest2;public class JavaTest2 {public static void main(String[] args) {class Boy implements Person {public void say() {// 匿名内部类自定义的方法saySystem.out.println("say方法调用");}@Overridepublic void speak() {// 实现接口的的方法speakSystem.out.println("speak方法调用");}}Person per = new Boy();per.speak();// 可调用per.say();// 不能调用}}interface Person {public void speak();}        per.speak()可调用,而per.say()不能调用,这时因为per是Person对象,要想调用子类的方法,可以强制向下转型为:((Boy) per).say();或者直接改为Boy per = new Boy();。 从中可发现,要想调用内部类的自定义的方法,必须通过内部类的对象来调用。那么,匿名内部类连名字都没有,怎么调用内部类自定义的方法? (二)匿名内部类       匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。
关于匿名内部类还有如下两条规则:
    1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。
    2)匿名内部类不等定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块,     怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类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() ;}      先看一个例子,体会一下匿名内部类的用法:
    运行结果:eat something
    可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写。并且,匿名内部类还能用于接口上 public class JavaTest2 {public static void main(String[] args) {Person per = new Person() {public void say() {// 匿名内部类自定义的方法saySystem.out.println("say方法调用");}@Overridepublic void speak() {// 实现接口的的方法speakSystem.out.println("speak方法调用");}};per.speak();// 可调用per.say();// 出错,不能调用}}interface Person {public void speak();}        这里per.speak()是可以正常调用的,但per.say()不能调用,为什么呢?注意Person per = new Person()创建的是Person的对象,而非匿名内部类的对象。其实匿名内部类连名字都没有,你咋实例对象去调用它的方法呢?但继承父类的方法和实现的方法是可以正常调用的,本例子中,匿名内部类实现了接口Person的speak方法,因此可以借助Person的对象去调用。         若你确实想调用匿名内部类的自定义的方法say(),当然也有方法:       (1)类似于speak方法的使用,先在Person接口中声明say()方法,再在匿名内部类中覆写此方法。       (2)其实匿名内部类中隐含一个匿名对象,通过该方法可以直接调用say()和speak()方法;代码修改如下:
public class JavaTest2 {public static void main(String[] args) {new Person() {public void say() {// 匿名内部类自定义的方法saySystem.out.println("say方法调用");}@Overridepublic void speak() {// 实现接口的的方法speakSystem.out.println("speak方法调用");}}.say();// 直接调用匿名内部类的方法}}interface Person {public void speak();}










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