Java匿名内部类

作者: 一个有故事的程序员 | 来源:发表于2017-08-31 22:03 被阅读57次

    导语

    学完匿名内部类就懂的情书。

    // 情书
    // 在我的世界你永远18岁
    me.world(new You() {  // 在我的世界只有最初的你
                public void getAge() {  // 你的年龄
                    System.out.println("18岁");  // 永远18岁
                }
            });
    

    主要内容

    • 接口与抽象类和匿名内部类的关系

    具体内容

    匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。
    为什么需要存在有匿名内部类。

    范例:观察如下代码

    interface Message {
        public void print();
    }
    
    class MessageImpl imlements Message {
        public void print() {
            System.out.println("Hello World !");
        }
    }
    
    public class TestDemo {
        public static void main(String args[]) {
             fun(new MessageImpl());
        }
        
        public static void fun(Message msg) {
            msg.print();
        }
    }
    

    输出结果:

    Hello World !
    

    正常的规律就是一个接口或者是抽象类需要有子类,子类要覆写所有的抽象方法。
    可是如果说现在的MessageImpl子类只使用唯一的一次,那么还有必要将其单独定义为一个类吗?所以这个时候,就可以采用匿名内部类的方式进行代码的简化。

    范例:简化后的代码

    interface Message {
        public void print();
    }
    
    public class TestDemo {
        public static void main(String args[]) {
            fun(new Message() {
                public void print() {
                    System.out.println("Hello World !");
                }
            });
        }
        
        public static void fun(Message msg) {
            msg.print();
        }
    }
    

    输出结果:

    Hello World !
    

    下面这个代码块就被称为匿名内部类。

    {
        public void print() {
            System.out.println("Hello World !");
        }
    }
    

    使用匿名内部类的时候,有一个前提:必须要基于接口或抽象类的应用。
    但是需要强烈强调的是,如果匿名内部类定义在了方法里面,方法的参数或者是变量要被匿名内部类所访问,那么必须加上final关键字(JDK 1.8之后此要求被改变了)。

    总结

    匿名内部类是在抽象类和接口的基础上发展的,匿名内部类的最大好处是帮助用户减少了类的定义。

    更多内容戳这里(整理好的各种文集)

    相关文章

      网友评论

      • 知识学者:new Message() {
        public void print() {
        System.out.println("Hello World !");
        }
        }
        这个是匿名内部类吧。
        你好像掉了一点东西。
        知识学者:@一个有故事的程序员 :sweat: 好像是的,是对象,我搞混了。。。。。。
        一个有故事的程序员:@东风冷雪 我看的那个就是这样的,那个代码块就是一个没有名字的类。加上new Message(),一起的话,应该算是一个new了一个对象吧?我是这么认为的。
        知识学者:匿名内部类东西很多,要写一大片,在和静态一起,更麻烦。。

      本文标题:Java匿名内部类

      本文链接:https://www.haomeiwen.com/subject/uqucjxtx.html