java中的四种内部类

java中的内部类分为四个:

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

1. 成员内部类:

定义在另一个类(外部类)的内部,而且与成员方法和属性平级叫成员内部类,......相当于外部类的非静态方法,如果被static修饰,就变成静态内部类了。

  1. )成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。【非静态内部类也可以定义静态成员但需要同时有final关键词修饰,静态方法鉴于无法用final修饰,仍必须是在静态内部类 或者非内部类中定义。
  2. )创建成员内部类的实例使用:外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数),可以理解为隐式地保存了一个引用,指向创建它的外部类对象。
  3. )在成员内部类中访问外部类的成员方法和属性时使用:外部类名.this.成员方法/属性。
  4. )内部类在编译之后生成一个单独的class文件,里面包含该类的定义,所以内部类中定义的方法和变量可以跟父类的方法和变量相同。例如上面定义的三个类的class文件分别是:MyTest.class、Outer.class和Outer$Inner.class三个文件。
  5. )外部类无法直接访问成员内部类的方法和属性,需要通过内部类的一个实例来访问。
  6. )与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”。
//成员内部类......相当于非静态方法
class Outer{
    private int a = 3;
    private Inner in;
    public Outer(){
        in = new Inner();
    }
    public int getInnerA(){
        return in.a;  // 引用内部类的变量,需通过实例
    }
    public class Inner {
        public int a = 2;
        public void doSomething() {
            // 调用外部类的属性
            System.out.println(MemberInner.this.a);// 这块要注意......很重要!!!
            System.out.println(a);
        }
    }
}

public class Test3 {
    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();// 非静态内部类要new实例
        inner.doSomething();
    }
}

class Extender extends Outer.Inner{
    public Extender(Outer outer){
       //外部类实例名.super(内部类参数列表)
       outer.super();
    }
}

2.静态内部类

使用static修饰的成员内部类叫静态内部类。

可以这样理解:与外部类同级的类,或者叫做外部类的静态成员。与成员内部类的对比如下:


说明


成员内部类


静态内部类


静态成员


静态成员需同时有final关键词修饰


可以


静态方法


不可定义


可以


访问外部类非static属性/方法


外部类名.this.成员方法/属性


不可以


外部类访问内部类


需要通过内部类的一个实例来访问


需要通过内部类的一个实例来访问


创建实例


外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)


外部类名.内部类名 实例名 = new 外部类名.内部类名(参数)


编译后的class文件


单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class


单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class


其他


与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”


/**
 * 成员内部类和静态内部类总结: 
 * 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
 * 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
 * 3.实例化一个非静态的内部类的方法:
 *  a.先生成一个外部类对象实例
 *  OutClassTest oc1 = new OutClassTest();
 *  b.通过外部类的对象实例生成内部类对象
 *  OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
 *  4.实例化一个静态内部类的方法:
 *  a.不依赖于外部类的实例,直接实例化内部类对象
 *  OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
 *  b.调用内部静态类的方法或静态变量,通过类名直接调用
 *  OutClassTest.InnerStaticClass.static_value
 *  OutClassTest.InnerStaticClass.getMessage()
 */

3.局部内部类

定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。

  1. )局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
  2. )局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
  3. )可以使用abstract修饰,声明为抽象类。

4.匿名内部类

为什么要有匿名内部类: 主要是针对那些不能直接创建对象的抽象类和接口而来的

匿名内部类定义和实例化形式如下:
new 父类构造方法(参数){
         //注:该方法名必须在父类中已经存在
     修饰符 返回参数类型 方法名(参数列表){
           。。。
     }
}
  1. )只能使用一次,创建实例之后,类定义会立即消失(想要多次使用就要用到反射的知识了)
  2. )必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
  3. )不能是抽象类,因为匿名内部类在定义之后,会立即创建一个实例。
  4. )不能定义构造方法,匿名内部类没有类名,无法定义构造方法,但是,匿名内部类拥有与父类相同的所有构造方法。
  5. )可以定义代码块,用于实例的初始化,但是不能定义静态代码块。
  6. )可以定义新的方法和属性(不能使用static修饰),但是无法显式的通过“实例名.方法名(参数)”的形式调用,因为使用new创建的是“上转型对象”(即父类声明指向子类对象)。
  7. )是局部内部类,所以要符合局部内部类的要求。

说明


成员内部类


匿名内部类


静态成员


静态成员需同时有final关键词修饰


不可定义


静态方法


不可定义


不可定义


访问外部类非static属性/方法


外部类名.this.成员方法/属性


外部类名.this.成员方法/属性


外部类访问内部类


需要通过内部类的一个实例来访问


需要通过内部类的一个实例来访问


创建实例


外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)


如上:父类 实例名 = new 父类(){}


编译后的class文件


单独的class文件(so内部类中的方法和变量可以跟父类的方法和变量同名),外部类$内部类.class


单独的class文件,使用类$数字.class


其他


与外部类平级的类继承内部类时,其构造方法中需要传入父类的实例对象。且在构造方法的第一句调用“外部类实例名.super(内部类参数)”


原文地址:https://www.cnblogs.com/kexianting/p/8486050.html

时间: 2024-08-04 08:01:48

java中的四种内部类的相关文章

java中的四种单例实现方式

在java中,单例设计模式是非常常见的设计模式,对单例设计模式的概念,不做过多的介绍,下面将逐一介绍四种单例设计模式: 1.第一种单例设计模式 1.1 代码实现 package com.singleton.one; /**  * 第一种单例设计模式  * @author Administrator  *  */ public class SingleTonOne { // 实例化 private static SingleTonOne instance = new SingleTonOne();

JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用)的作用.同时我们还将介绍ReferenceQueue和WeakHashMap的功能和使用示例. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. JAVA中的四种引用 四种引用中,软引用.若引用.虚引用都需要相关类来创建.创建的时候

Java 中的四种引用

1.强引用(Strong Reference)在 Java 中四种引用中是"最强"的,我们平时通过 new 关键字创建的对象都属于强引用,如下面的代码: Person person = new Person();其中的 person 就是一个强引用,只有当它不再被使用后才会被垃圾回收器回收掉.当内存不足时,但是其依然在被使用中,那么垃圾回收器也不会回收其引用的对象:JVM 宁愿报"内存泄漏错误 (OutofMemoryError)",终止程序也不会回收此引用所关联的

Java 中的四种引用及垃圾回收策略

Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物的生活用品.如果内存空间足够,垃圾回收器就不会回收它,如果

java中的四种引用

Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题. 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物的生活用品.如果内存空间足够,垃圾回收器就不会回收它,如果

java中的四种监听类用法

在此列举四种方法: 自身类实现ActionListener接口,作为事件监听器 通过匿名类处理 通过内部类处理 通过外部类处理 下面依次介绍: 第一种:自身类实现ActionListener接口,作为事件监听器. 这种方法是最基本的,也是初学者经常使用的,我当初即是如此. import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent;

Java中的四种引用类型比较

1.引用的概念 引用这个概念是与JAVA虚拟机的垃圾回收有关的,不同的引用类型对应不同的垃圾回收策略或时机. 垃圾收集可能是大家感到难于理解的较难的概念之一,因为它并不能总是毫无遗漏地解决Java运行时环境中堆管理的问题. 垃圾回收的大致思路是:当Java虚拟机觉得内存不够用的时候,会触发垃圾回收操作(GC),清除无用的对象,释放内存.可是如何判断一个对象是否是垃圾呢?其中的一个方法是计算指向该对象的引用数量,如果引用数量为0,那么该对象就为垃圾(Thread对象是例外),否则还有用处,不能被回

Java中的四种引用类型,强引用,软引用,弱引用,虚引用

对于Java中的垃圾回收机制来说,对象是否被回收的标准在于该对象是否被引用.因此,引用也是JVM进行内存管理的一个重要概念. Java中对象的引用一般有以下4种类型: 1强引用  2软引用  3弱引用  4虚引用 以下一一介绍其用法和区别 1强引用:在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用.当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JVM也不会回收.因此强引用是造成Java内存泄漏的主

Java中的四种引用(强引用、软引用、弱引用、虚引用)

以下内容摘自<深入理解Java虚拟机 JVM高级特性与最佳实践>第2版,强烈推荐没有看过的同学阅读,读完的感觉就是"原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴" 在JDK1.2以前,Java中的引用的定义很传统:如果 reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,对于如何描述一些"食之无味,弃之可惜"的对象就显得