zoukankan      html  css  js  c++  java
  • java中的内部类和匿名内部类的使用

    部分内容參考http://www.imooc.com/
    内部类:


    什么是 Java 中的内部类
    问:什么是内部类呢?
    答:内部类( Inner Class )就是定义在另外一个类里面的类。与之相应,包括内部类的类被称为外部类。
    问:那为什么要将一个类定义在还有一个类里面呢?清清爽爽的独立的一个类多好啊!


    答:内部类的主要作用例如以下:
    1. 内部类提供了更好的封装。能够把内部类隐藏在外部类之内,不同意同一个包中的其它类訪问该类
    2. 内部类的方法能够直接訪问外部类的全部数据。包括私有的数据
    3. 内部类所实现的功能使用外部类相同能够实现,仅仅是有时使用内部类更方便,重写外部类的方法
    问:内部类有几种呢?
    答:内部类可分为以下几种:
    1. 成员内部类
    2. 静态内部类
    3. 方法内部类
    4. 匿名内部类

    以下是一个内部类样例

    //外部类HelloWorld
    public class HelloWorld {
    
        // 内部类Inner。类Inner在类HelloWorld的内部
        public class Inner {
    
            // 内部类的方法
            public void show() {
                System.out.println("welcome to imooc!");
            }
        }
    
        public static void main(String[] args) {
    
            // 创建外部类对象
            HelloWorld hello = new HelloWorld();
            // 创建内部类对象
            Inner i = hello.new Inner();
            // 调用内部类对象的方法
            i.show();
        }
    }

    匿名内部类:
    是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。这就要採用还有一种形式的new语句。例如以下所看到的: new <类或接口> <类的主体>
    作用是:
    1.和内部类一样,能够对外部类进行扩展,重写或新添加方法。
    2.用于实现接口
    3.没有类名

    //新建一个接口
    public interface Animal {
        void eat();
    
        void sleep();
    }
    
    //新建一个类,在类里面使用 内部类和内部匿名类去实现接口
    public class Zoo {
        private class Tiger implements Animal {
            public void eat() {
                System.out.println("tiger eat");
            }
    
            public void sleep() {
                System.out.println("tiger sleep");
            }
        }
    
        /**
         *  这里不明确。Animal不是接口么,怎么能够定义方法?
         *  ---答案 接口能够作为返回类型,指定返回的类型必须是实现当前接口的类.
         * @return
         */
    
        /**
         * // 因为接口不是不能实例化的。所以必须通过类来实现,这里使用返回一个(已实现该接口的对象)
         * 详细写法有两种,写法2easy理解
         * @return
         */
        //---------------------------写法1-----匿名内部类--------------------------------
        Animal getAnimal1(){
            return new Animal(){
                public void eat() {
                    System.out.println("---1---animal eat");
                }
    
                public void sleep() {
                    System.out.println("---1---animal sleep");
                }
            };
        }
    
    
        //---------------------------写法2------内部类--------------------------
        Animal getAnimal2(){
            return new TempAnimal();
        }
    
        class TempAnimal implements Animal{
            int a = 0;
            public void eat() {
                System.out.println("---2---animal eat");
            }
    
            public void sleep() {
                System.out.println("---2---animal sleep");
            }   
        }
    
    }
    
    //新建一个測试类
    public class Test {
        public static void main(String[] args) {
            Zoo z = new Zoo();
            Animal an = z.getAnimal1();
            an.eat();
            an.sleep();
    
    
            Animal one = z.getAnimal2();
            one.eat();
            one.sleep();
        }
    }
    匿名内部类是内部类的一种简化写法: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);
            }
        }
    }
  • 相关阅读:
    Python 3学习 ——目录 Json Pickle
    Python 3 学习——函数扩展and迭代器生成器装饰器
    Python 3 学习——深浅拷贝以及函数
    Python 3 学习的第七小节——Linux-Ubuntu
    Python 3 —— 文件操作
    Python 3 学习的第五小节——字符编码与三级菜单实践
    关于PHP代码复用‘traits’的一段代码
    一个将对象彻底冻结的函数
    详解vue-cli脚手架项目-package.json
    关于element-ui日期选择器disabledDate使用心得
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7270813.html
Copyright © 2011-2022 走看看