初探Java内部类的使用

目录
  • 一、成员内部类
  • 二、静态内部类
  • 三、匿名内部类

之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结。

Java内部类一般可以分为以下三种:

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

一、成员内部类

内部类的创建:成员内部类的创建需要依赖于外部类对象,没有创建外部类实例之前无法创建成员内部类对象

若在main函数中直接创建成员内部类则会报错:

MemberInner memberInner = new MemberInner();

私有属性访问:成员内部类可直接访问外部类非静态私有属性,外部类访问内部类私有属性则需要通过内部类的对象来访问

在memberInnerTest()方法中,可以直接访问外部类中的私有test字段,若内部类中有与外部类同名字段,调用外部类需要使用如下方法:

OuterTest.this.test

创建内部类:

在外部类内部创建内部类对象:使用new关键字创建内部类对象

private void createMemberInner(){
    MemberInner memberInner = new MemberInner();
    memberInner.memberInnerTest();
}

在外部类外部创建内部类对象:需要先创建外部类对象,再通过外部类创建内部类

OuterTest outerTest = new OuterTest();
MemberInner memberInner = outerTest.new MemberInner();

若不需要使用外部类,可以使用如下方式创建内部类

MemberInner memberInner = new OuterTest().new MemberInner();

使用该方法创建内部类需要注意:若外部类中有多个内部类,这种方法会new出多个外部类对象,各个类对象都是独立的,因此外部类的成员变量并不会在内部类中共享。

如下代码中,由于new出了两个OuterVar类,所以InnerOne与InnerTwo类输出的成员变量var均为0。若想InnerOne与InnerTwo类共享成员变量var,则需用如下方式创建:

  OuterVar outerVar = new OuterVar();
  InnerOne innerOne = outerVar.new InnerOne();
  InnerTwo innerTwo = outerVar.new InnerTwo();
public class OuterVar {
private int var = 0;

class InnerOne{
  private void innerOnePrint(){
      System.out.println("innerOnePrint:"+var);
      var+=1;
  }
}

class InnerTwo{
  private void innerTwoPrint(){
      System.out.println("innerTwoPrint:"+var);
  }
}

public static void main(String[] args) {
  InnerOne innerOne = new OuterVar().new InnerOne();
  InnerTwo innerTwo = new OuterVar().new InnerTwo();

  innerOne.innerOnePrint();
  innerTwo.innerTwoPrint();
}
}
/* 结果
innerOnePrint:0
innerTwoPrint:0
*/
/*1、成员内部类
  2、静态内部类
  3、匿名内部类
*/
public class OuterTest {
    /*
    1、成员内部类
     */
    private String test = "OuterTest";

    private void createMemberInner(){
        MemberInner memberInner = new MemberInner();
        memberInner.memberInnerTest();
    }

    class MemberInner{
        private String test = "MemberInnerTest";

        public void memberInnerTest(){
            System.out.println("MemberInner");
            System.out.println(test);
            System.out.println(OuterTest.this.test);

        }
    }

    public static void main(String[] args) {
        // 成员内部类
        OuterTest outerTest = new OuterTest();
        MemberInner memberInner = outerTest.new MemberInner();
//        MemberInner memberInner = new OuterTest().new MemberInner();

        memberInner.memberInnerTest();
    }
}

/* 结果
   MemberInner
   MemberInnerTest
   OuterTest */

二、静态内部类

静态内部类定义在外部类的内部,使用static关键字修饰,静态内部类不需要外部类对象产生就能使用,不能访问外部类的成员域,但能访问静态域。

私有属性访问:静态内部类不可直接访问外部类的非静态属性

创建内部类:

在外部类内部创建内部类对象:使用new关键字创建内部类对象

private void createStaticInner(){
    StaticInner staticInner = new StaticInner();
    staticInner.staticInnerTest();
}

在外部类外部创建内部类对象:可以不创建外部类对象,直接创建内部类对象

StaticInner staticInner = new StaticInner();
public class OuterTest {
    /*
      2、静态内部类
     */
    private String test = "OuterTest";

    private void createStaticInner(){
        StaticInner staticInner = new StaticInner();
        staticInner.staticInnerTest();
    }

    static class StaticInner{
        private String test = "StaticInnerTest";

        public void staticInnerTest(){
            System.out.println("StaticInner");
            System.out.println(test);
        }
    }

    public static void main(String[] args) {
        // 静态内部类
        StaticInner staticInner = new StaticInner();
        staticInner.staticInnerTest();
    }
}

/* 结果
   StaticInner
   StaticInnerTest */

三、匿名内部类

使用匿名内部类的前提条件:必须继承一个父类或实现一个接口。 有以下一些特点:

由于匿名内部类是没有类名,所以匿名内部类不能有构造方法

匿名内部类不能定义任何静态成员、方法和类

//匿名内部类
interface Father{
    public abstract void talk();

    public abstract void eat();
}
public class Test {
    public static void main(String[] args) {
        //匿名内部类
        Father father = new Father() {
            @Override
            public void talk() {
                System.out.println("I'm Father");
            }

            @Override
            public void eat() {
                System.out.println("I'm eating");
            }
        };
        father.talk();
        father.eat();
    }
}

/* 结果
   I'm Father
   I'm eating */

到此这篇关于初探Java内部类的使用的文章就介绍到这了,更多相关Java内部类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java匿名内部类导致内存泄露的原因与解决方案详解

    目录 简介 为什么要持有外部类 实例:持有外部类 代码 编译查看class 查看字节码 什么时候会内存泄露 不会内存泄漏的方案 方案1:不返回内部类对象引用 方案2:匿名内部类改为静态的 简介 说明 本文用示例介绍匿名内部类会导致内存泄漏的原因及其解决方案. 相关网址 普通内部类的内存泄露:Java内部类持有外部类导致内存泄露--原因/解决方案 为什么要持有外部类 Java 语言中,非静态内部类的主要作用有两个: 当匿名内部类只在外部类(主类)中使用时,匿名内部类可以让外部不知道它的存在,从而减

  • 详解Java中static关键字和内部类的使用

    目录 一. static 关键字 1. static修饰成员变量 2. static修饰成员方法 3. static成员变量的初始化 二. 内部类 1. 实例内部类 2. 静态内部类 3. 局部内部类 4. 匿名内部类 一. static 关键字 在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的. 1. static修饰成员变量 static修饰的成员变量,称为静态成员变量 [静态成员变量特性]: 不属于某个具体的对象,是类的属

  • java内部类之成员内部类、局部内部类和匿名内部类用法及说明

    目录 内部类概念 分类 成员内部类 使用成员内部类 间接方式访问内部类 直接方式访问内部类 外部类和内部类变量重名问题 局部内部类 修饰内部类的权限 匿名内部类 测试类 一 匿名内部内应用 总结 内部类概念 一个类中包含另外一个类. 分类 成员内部类. 局部内部类(包含匿名内部类). 成员内部类 定义格式: 修饰符 class 类名称 { 修饰符 class 类名称 { //... } //... } 注意: 内部类使用外部,可以随意访问,但是外部类使用内部类要借助内部类的对象. 使用成员内部类

  • Java内部类持有外部类导致内存泄露的原因与解决方案详解

    目录 简介 为什么要持有外部类 实例:持有外部类 实例:不持有外部类 实例:内存泄露 不会内存泄露的方案 简介 说明 本文介绍Java内部类持有外部类导致内存泄露的原因以及其解决方案. 为什么内部类持有外部类会导致内存泄露? 非静态内部类会持有外部类,如果有地方引用了这个非静态内部类,会导致外部类也被引用,垃圾回收时无法回收这个外部类(即使外部类已经没有其他地方在使用了). 解决方案 1.不要让其他的地方持有这个非静态内部类的引用,直接在这个非静态内部类执行业务. 2.将非静态内部类改为静态内部

  • Java面向对象之内部类详解

    目录 前言 内部类概述 内部类的分类 成员内部类 局部内部类 前言 在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类.本篇博客将总结内部类的使用. 内部类概述 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类. 在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类. 内部类一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称.

  • 关于JavaEE内部类的部分注意事项

    目录 前言 一.成员内部类 注意事项: 二.静态内部类 注意事项: 三.方法内部类 注意事项: 总结 前言 内部类的设计也是一种封装的思想,封装体现的就是保护性和易用性. 内部类可分为四大类: 成员内部类 静态内部类 方法内部类 匿名内部类 内部类存在的原因: 内部类和外部类可以方便地访问彼此的私有域(属性和方法) 内部类使用private关键字修饰可以对外部类的外部完全隐藏(内部类就当作外部类的属性看待) 内部类可以变相多继承 一.成员内部类 在外部类的内部不使用static关键字定义的内部类

  • 一文带你真正理解Java中的内部类

    目录 概述 内部类介绍和分类 常规内部类 局部内部类 匿名内部类 静态内部类 静态内部类和普通内部类的区别 内部类的作用 概述 不知道大家在平时的开发过程中或者源码里是否留意过内部类,那有思考过为什么要有内部类,内部类都有哪几种形式,静态内部类和普通内部类有什么区别呢?本篇文章主要带领大家理解下这块内容. 内部类介绍和分类 顾名思义,内部类是指一个类在另外一个类的内部,是定义在另一个类中的类.根据类的位置和属性不同,可以分为下面几种. 常规内部类 @Data public class Tree

  • java 内部类的实例详解

    java 内部类的实例详解 可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass { private String name ; private int age; public String getName() { return name; } p

  • 基于java内部类作用的深入分析

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦.学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地

  • java内部类的那些事儿_让你一看就弄明白

    在"基于java内部类作用的深入分析"中你可以了解java内部类的一些东西,不过内部类中还有一些地方值得我们细心研究... 下面是我总结出来的java内部类的一些东西,分享给大伙儿....one:静态内部类可以有静态成员,而非静态内部类则不能有静态成员怎样理解这个呢?看看下面的代码: 复制代码 代码如下: /**  *   */ package com.b510.test; public class Test {     private int number = 1; // 非静态内部

  • Java内部类_动力节点Java学院整理

    内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同.内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default). 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法名可以和

  • Java内部类的继承(全)

    下面通过实例代码给大家分享下有关JAVA内部类的继承,具体详解如下: Java内部类的构造器必须连接到指向其外围类对象的引用(构造内部类必须给它一个外部类对象的引用,内部类依赖于外部类对象),所以在继承内部类的时候,需要在导出类的构造器中手动加入对基类构造器的调用. 因为,在导出类实例化时,并不存在一个外围类对象,以让导出类的实例去连接到它. 所以,我们需要创建一个外围类,然后用一个特定的语法来表明内部类与外围类的关系. 在下例子中,需要给导出类InheritInner一个来自内部类的外围类中的

  • java 内部类的详解及实例

     java 内部类的详解及实例 内部类的存在意义: 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.内部类使得多重继承的解决方案变得完整.接口解决了部分问题,二内部类有效地实现了"多重继承".(这是<Java编程思想>里面的解释) 代码: public class OuterAndInnerClass { public static void main(String[] args) { //创建内部类对象的

  • JAVA 内部类详解及实例

    JAVA 内部类 一.什么是内部类? 一个类的定义放在另一个类的内部,这个类就叫做内部类 二.内部类有那些特性? 1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 . 2.内部类不能用普通的方式访问.内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 . 3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 . 三.内部类有哪几种? 1.成员内

  • Java内部类的全限定名规律代码示例

    简述: 由于最近遇到不少需要反射的类,而其中不乏内部类,在此总结一下内部类的全限定名的规律. 成员内部类 测试结果表明,无论成员内部类是否为静态,其全限定名都使用如下命名方法: 包名.外部类名$内部类名 测试代码: package com.test; public class InnerClassTest { static class StaticInner{ } class Inner{ } public static void main(String[] args) { StaticInne

  • Java内部类原理与用法实例总结

    本文实例讲述了Java内部类原理与用法.分享给大家供大家参考,具体如下: 一.非静态内部类 public class OutClass { private String name = "outclass"; public void show() { System.out.println(this.name); } public void innerShow() { InnerClass inner = new InnerClass(); inner.show(); inner.outS

  • java内部类原理与用法详解

    本文实例讲述了java内部类原理与用法.分享给大家供大家参考,具体如下: 概念 内部类:可以包含在另外一个类中的类 外部类:包含内部类的类 每个内部类都会被编译为一个独立的类,生成一个独立的字节码文件. 内部类可以方便地访问外部类的私有变量,内部类也可以声明为private从而实现对外完全隐藏. 分类 java中的四种内部类(根据定义的位置和方式划分) -静态内部类 -成员内部类 -方法内部类 -匿名内部类 分类介绍 -静态内部类 特征:在类的内部中存在另一个类,且该类被static修饰 使用范

随机推荐