zoukankan      html  css  js  c++  java
  • Java入门(4)内部类

    为什么需要内部类?

       真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好解决java不支持多继承的问题。

      内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构。

    一、静态内部类

    二、成员内部类

    三、局部内部类

       在方法和作用域内的内部类,称为局部内部类。匿名内部类就是一种局部内部类。

    四、匿名内部类

    匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:

    new<类或接口>()
    {
        //类的主体
    };

    这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。

    匿名类有两种实现方式:

    继承一个类,重写其方法。
    实现一个接口(可以是多个),实现其方法。

    下面通过代码来说明。

    public class Out
    {
        void show()
        {
            System.out.println("调用 Out 类的 show() 方法");
        }
    }
    public class TestAnonymousInterClass
    {
        //在这个方法中构造一个匿名内部类
        private void show()
        {
            Out anonyInter=new Out()
            {
                //获取匿名内部类的实例
                void show()
                {
                    System.out.println("调用匿名类中的 show() 方法");
                }
            };
            anonyInter.show();
        }
        public static void main(String[] args)
        {
            TestAnonymousInterClass test=new TestAnonymousInterClass();
            test.show();
        }
    }

    程序的输出结果如下:

    调用匿名类中的 show() 方法

    从输出结果可以看出,匿名内部类有自己的实现。

    提示:匿名内部类实现一个接口的方式与实现一个类的方式相同,这里不再赘述。

    匿名类有如下特点。

    (1) 匿名类和局部内部类一样,可以访问外部类的所有成员。如果匿名类位于一个方法中,则匿名类只能访问方法中 final 类型的局部变量和参数。

    public static void main(String[] args)
    {
        int a=10;
        final int b=10;
        Out anonyInter=new Out()
        {
            void show()
            {
                //System.out.println("调用了匿名类的 show() 方法"+a);    //编译出错
                System.out.println("调用了匿名类的 show() 方法"+b);    //编译通过
            }
        };
        anonyInter.show();
    }

    (2) 匿名类中允许使用非静态代码块进行成员初始化操作。

    Out anonyInter=new Out()
    {
        int i;
        {    //非静态代码块
            i=10;    //成员初始化
        }
        public void show()
        {
            System.out.println("调用了匿名类的 show() 方法"+i);
        }
    };

    (3) 匿名类的非静态代码块会在父类的构造方法之后被执行。

    资料

    https://www.cnblogs.com/java-chen-hao/p/10412677.html

    https://www.cnblogs.com/yangming1996/p/8869081.html

    Override(重写,覆盖)

    Overload(重载,过载)

  • 相关阅读:
    Wordpress 所有hoor列表
    Redis的PHP操作手册(转)
    thinkphp pathinfo nginx 无法加载模块:Index
    gitlab 创建SSH Keys 报500错
    在docker 中配置hadoop1.2.1 cluser
    docker 配置文件引发的问题
    shell在一个大文件找出想要的一段字符串操作技巧
    php关于金额比较引发的问题(转)
    mac 终端乱码
    Swoole笔记(二)
  • 原文地址:https://www.cnblogs.com/cnki/p/8831664.html
Copyright © 2011-2022 走看看