zoukankan      html  css  js  c++  java
  • Java Inner class

    2016-03-27

    内部类:就是把一个类的定义放在另外一个外围类定义的里面。

    class OutterClass{
              class InnerClass {
            }
    }
    

     1. 内部类主要有四种:成员内部类(member)、静态内部类(static)、局部内部类(local)、匿名内部类(anonymous)

    (1)成员内部类:这种内部类的方法可以直接使用外部类实例变量和实例方法,包括private。

                            不能含有static方法,不能有static变量,static final除外;可以继承有static方法的类。

                            成员内部类如果有与外部类同名的成员变量和方法,默认情况访问成员内部类成员,如果访问外部类变量和方法,

    OuterClass.this.variable
    OuterClass.this.method
    View Code

                           外部类要访问内部类成员,需要先new一个内部类对象,再通过指向这个对象的引用来访问。

    (2)静态内部类:将内部类声明为static,也叫作嵌套类。

                            与静态方法类似,只能访问外部类的static成员,不能直接访问实例变量和实例方法,需要通过对象引用。

                            静态内部类中可以包括static成员和方法。

    public class Outer{
          private static class Inner{
              //name of this class is Outer.Inner
         }
         private Inner x;
         public Outer(){
             x=new Inner();}
         public static void main(String[] a) {
                 Inner x = new Inner();
                 new Outer();
    }
    }
    View Code

    (3)局部内部类:在method或者statement中定义的类。

                            局部内部类与局部变量类型,不能使用private、public等访问修饰符,也不能使用static,可以使用final和abstract

                            局部内部类只在这个方法之内有效。

                            局部内部类可以访问外部类成员。                 

    (4) 匿名内部类:就是没有名字的局部内部类,不用关键字class、extend、implement,没有constructor。其根本是把类的定义和创建放在了一起,一般格式是

    new ClassOrInterfaceName() {    } 

                              匿名内部类可以继承一个类或者实现一个接口。

                              匿名内部类使用的参数必须是final。

    在生成的class文件中,匿名类会生成 类名$1.class 的文件,数字根据是第几个内部类而以此类推。

    2. 内部类的继承

    普通类extend内部类。因为内部类的constructor必须连接到指向外部类对象的引用,所以当一个类继承这个内部类的时候,那个连接到外部类的引用也要初始化。

    class WithInner{
        class Inner{}
    }
    
    public class InheritInner extends WithInner.Inner {
         InheritInner(WithInner wi){
             wi.super();
        }
        public static void main(String[] args){
             WithInner wi = new WithInner();
             InheritInner ii = new InheritInner(wi);
    }
    } 
    View Code

    每一个内部类可以独立的继承一个接口或者类,无论外围类是否继承了某个接口或者类,对内部类都没有影响。再加上java提出了一个类可以实现多个接口,所以内部类和接口解决了java不能多重继承的问题。这也是java和C++的区别之一,C++可以多重继承。

    资料来源:感谢各位的分享,希望慢慢能了解透彻

    http://www.tuicool.com/articles/n2aYra7

    http://www.cnblogs.com/dolphin0520/p/3811445.html

    http://android.blog.51cto.com/268543/384844/

    http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html

  • 相关阅读:
    主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
    Dubbo 分布式事务一致性实现
    微服务实现事务一致性实例
    微服务间保持事务一致性
    海量积分数据实时排名处理方式介绍二
    Java两种方法实现循环报数
    MySQL 千万级 数据库或大表优化
    Linux 中 Nginx 重启关闭
    Linux 中 Oracle dmp 文件导入导出
    Linux 中 Oracle 数据库启动和关闭
  • 原文地址:https://www.cnblogs.com/amberdata/p/5327770.html
Copyright © 2011-2022 走看看