匿名内部类那点事

来源:互联网 发布:笑气在淘宝怎么搜 编辑:程序博客网 时间:2024/05/17 06:02

1、什么是匿名内部类呀?

答:简单粗暴起来,之前说过内部类有一种是匿名的,就是没有名字的内部类嘛哈哈,然后直接就搞出一个实例对象啦。。


2、匿名内部类(又是偷懒的杰作啦,人总是懒懒的)

答:为什么这么说昵? 抽象类、接口都没有办法直接生成实例对象。单写一个类继承抽象类或者写一个类实现一个接口,而且我们只用一次……感觉大才小用的感觉,因为我们只需要一个实例对象而已啊!!!


a、第一种:被扩展的是抽象类的运用

我们先写一个抽象类Person

public abstract class Person {public abstract void walk();}
再写一个入口类Main(采用匿名内部类)
public class Main {public static void main(String args[]) {justDoit(new Person(){    //这里我们调用justDoit方法,使用匿名内部类直接生成一个继承Person的实例对象@Overridepublic void walk() {System.out.println("just walk()");}});}public static void justDoit(Person person) { //类方法,接受一个Person类型的实例对象(传送引用过来就ok)person.walk();  //马上我们调用了person的walk()方法}}

对比的另外一个Main类(上面匿名内部类的完整形式)加深理解:将匿名内部类看作是简写形式,使用与定义合并在一起,人总是喜欢简洁,所以就有这样的语法。

public class Main {public static void main(String args[]) {justDoit(new MyPerson());        //new一个MyPerson的实例对象(也可以叫匿名对象:<span style="font-family: Arial, Helvetica, sans-serif;">没有将其赋值给引用,记得中文博大精深哦)</span>}                                   private static class MyPerson extends Person {  //这里用的静态内部类,因为上面用在静态方法上(知识点:静态成员比普通成员优先初始化)@Overridepublic void walk() {System.out.println("walk on");}}public static void justDoit(Person person) {person.walk();}}


b、第二种:被扩展的是接口的运用


先写一个接口MyInterface

public interface MyInterface {public abstract String printName();}


匿名内部类(接口版本)

public class Bird {private void smaName(MyInterface who) {System.out.println(who.smallName());}public void init() {smaName(new MyInterface(){   //interface可生成不了实例对象,直接它的实现类搞一个实例对象出来,这里也是匿名内部类的运用哦@Overridepublic String smallName() {  //直接这里重写抽象方法return "小鸟";}});}}

再对比一下完整版本的实现方式

public class Bird {private void smaName(MyInterface who) {System.out.println(who.smallName());}public void init() {smaName(new Name());}class Name implements MyInterface {@Overridepublic String smallName() {return "小鸟";}}}


3、记得这一点:匿名内部类的使用,看似像是new一个抽象类或者接口的实例对象,实际上必然是作为实现(派生)类的实例对象。也就是说,以后你看见一个匿名内部类,你马上要想到,ok,它的基类是个抽象类还是接口?或者说:你可以看看完整的形式嘛,多加练习,你就彻底ok了!这里面涉及到继承与多态多知识,所以嘛,这俩也钻研一下哦!亲!!



0 0
原创粉丝点击