美文网首页
内部类、匿名内部类、静态内部类傻傻分不清楚

内部类、匿名内部类、静态内部类傻傻分不清楚

作者: cxlin007 | 来源:发表于2017-01-06 13:18 被阅读157次

在java开发中或是看一些书籍中,经常会涉及到一些概念什么内部类、静态内部类、匿名内部类、成员类等等,往往分不清楚什么情况下是静态内部类还是匿名内部类。接下来就好好梳理下。
  首先要先了解下什么是内部类,因为之后要讲到的类都属于内部类。所谓内部类就是在一个类中定义的类,就是内部类。
如何创建一个内部类:
1、像普通类定义一下在类的作用域下或是在类的某个方法中定义一个类

Paste_Image.png

2、实现一个接口或抽象类

Paste_Image.png

3、继承一个普通的类

Paste_Image.png

要注意与创建一个普通类的区别。通过调用class.getName方法可以看到其名称都是包名+外部类名称+$+内部类名称,如com.OutClass$InnerClass。而普通类的名称是包名+外部类如com.OutClass

内部类特点:
内部类可以可以访问外部类的所有域,包括私有域(私有变量、私有方法等)。这是如何做到的呢?,查看内部类编译后的代码

class OutClass{
        OutClass$InnerClass(OutClass,InnerClass);//包可见构造器
        private OutClass$InnerClass(OutClass);//私有构造器,传入外部类
        final OutClass this$0;            //this$0存储外部类实例
}

那又是如何访问外部类的私有变量的呢?看代码

class OutClass{
      private int a = 10;
}
编译后
class OutClass{
      static int access$0(OutClass);//提供了静态方法
}

在内部类中打印a
System.out.println(a);
就等于是调用
System.out.println(access$0(this$0));

匿名类、成员类,局部类,静态内部类
他们都是内部类,Class提供了方法来判断

clazz.isAnnotation();//是否是匿名类
clazz.isMemberClass();//是否是成员类
clazz.isLocalClass();//是否是局部类

匿名类, 及没有名字的类,他的名称不同于其他内部类
com.OutClass$InnerClass,而是以数字代替com.OutClass$1、com.OutClass$2
哪些是匿名类呢,实现一个接口、继承一个抽象类或普通类


Paste_Image.png

成员类,属于类的一个成员,可以是类或接口,如:


Paste_Image.png
局部类,在某个方法中定义的类,他的所用域只限于这个方法。
Paste_Image.png

静态内部类,及给内部类加上static修饰符后就是静态内部类(只有成员类可以加上static修饰符)

Paste_Image.png

静态内部类并没有外部类的引用,因此不能访问外部类的非静态变量,但是可以访问外部类的静态变量,即使他是私有的。

参考:
http://www.cnblogs.com/jiangao/archive/2012/02/23/2364119.html

相关文章

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • Java 内部类、静态内部类、方法内部类(未完待续)

    内部类 什么是内部类?内部类其实就是在一个类中创建的类。内部类有四种: 成员内部类 静态内部类 局部内部类 匿名内...

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

  • java 内部类

    一般有四种内部类的使用方式: 嵌套的内部类 方法内的内部类 静态内部类 匿名内部类 什么时候用内部类: 有时候明显...

  • Java 内部类

    1. 内部类 概念:在一个类的内部再定义一个完整的类内部类分为 4 类:成员内部类、静态内部类、局部内部类、匿名内...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • (第05天)Handler使用可能导致内存泄漏

    非静态内部类和匿名内部类都会保留外部类的引用。 这个引用是强引用,引用在,JVM就不会回收。 我们经常会在类内声明...

  • Java基础内部类与Static,final

    成员内部类,局部内部类,匿名内部类 非 静态成员内部类 非 静态成员内部类反编译class 静态内部类 静态内部类...

  • 内部类

    内部类 静态内部类 成员内部类 匿名内部类

网友评论

      本文标题:内部类、匿名内部类、静态内部类傻傻分不清楚

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