java内部类的创建

这篇具有很好参考价值的文章主要介绍了java内部类的创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 内部类(嵌套类)

创建内部类非常简单,就是在类中定义另外一个类。
内部类,实际上就是类的嵌套。

/********************************************************************************
*   Java 一个类中可以嵌套另外一个类,语法格式如下:
    class OuterClass {          // 外部类
        // ...
        class InnerClass {      // 嵌套类,或称为内部类
            // ...
        }
    }

    要访问内部类,可以通过创建外部类的对象,然后创建内部类的对象来实现。
    嵌套类有两种类型:
        a. 非静态内部类;
        b. 静态内部类;
* */

2. 非静态内部类

2.1 创建

/*
* 非静态内部类
    非静态内部类是一个类中嵌套着另外一个类。它有访问外部类成员的权限,通常被称为内部类。
    由于内部类嵌套在外部类中,因此必须首先实例化外部类,然后创建内部类的对象来实现。
* */
class Outter {
    private int index = 100;

    public void print() {
        Inner inner = new Inner();
        inner.print();
    }

    class Inner {
        void print() {
            System.out.println(index);
            System.out.println(Outter.this.index);
        }
    }
}

public class App {
    public static void main(String[] args) {
        //
        Outter outter = new Outter();
        outter.print();

        // 创建内部类
        Outter.Inner inner = outter.new Inner();
        inner.print();
    }
}

内部类如何访问外部类成员?
可以通过外部类名称.this的形式来获得外部类对象的引用;
上例中的 System.out.println(Outer.this.index)等价于System.out.println(index);
一般情况下,无需这么麻烦,因为这种关系式隐式建立的,所以不需要显示的去调用"外部类名称.this"的方式去访问外部类成员。
但是,当内部类中的成员和外部类中的成员重名,或者内部类有多层嵌套时,就需要使用外部类名称.this这种方式来显式地指定访问的是哪一个成员,详见下面。

2.2 访问外部类
首先看以下代码。

class outer {
    private int index = 100;
    
    class middle {
        private int index = 99;

        class inner {
            private  int index = 98;

            public void print() {
                System.out.println("outer:> " + outer.this.index);
                System.out.println("middle:> " + outer.middle.this.index);
                System.out.println("inner:> " + index);
            }
        }
    }
}

(1)内部类对象的创建
内部类对象必须通过外部类对象来创建,这样才能建立联系,而不是简单的new;

outer.middle.inner in = new outer.middle.inner(); // 错误

需要通过外部类对象.new 内部类名称这种特殊的语法形式来创建内部类对象。

 outer out = new outer();
 outer.middle middle = out.new middle();
 outer.middle.inner in = middle.new inner();
 in.print();

(2)访问index
outer、middle、inner这三个类中都有一个同名的实例变量index,在inner类的print()中,为了能够明确访问的是哪一个index,需要使用"外部类名称.this"的形式来指定引用的变量。

(3)说明
可以看到,内部类对象的创建是比较麻烦的。在实际开发中,如果需要在外部用到内部类对象,
则一般由外部类给出一个获取内部类对象的方法。这样可以,简化内部类对象的创建,还可以对外屏蔽内部类对象的创建细节。

class outer {
    private int index = 100;

    class middle {
        private int index = 99;

        class inner {
            private  int index = 98;

            public void print() {
                System.out.println("outer:> " + outer.this.index);
                System.out.println("middle:> " + outer.middle.this.index);
                System.out.println("inner:> " + index);
            }
        }

        public inner getInner() {
            return new inner();
        }
    }

    public middle getMiddle() {
        return new middle();
    }
}

public class App {
    public static void main(String[] args) {
        outer out = new outer();
        outer.middle.inner in = out.getMiddle().getInner();

        in.print();
    }
}

3. 静态内部类

/*
* 静态内部类
    静态内部类可以使用 static 关键字定义,静态内部类我们不需要创建外部类来访问,可以直接访问它。
    之前非静态内部类的创建格式如下:
    Outter outter = new Outter();
    Outter.Inner inner = outter.new Inner();
    
    现在静态内部类的创建相对非静态内部类的创建就非常简单了:
    Outter.Inner inner = new Outter.Inner();
* */
class Outter {
    int num1 = 10;

    static class Inner  {
        int num2 = 20;
    }
}


public class App {
    public static void main(String[] args) {
        Outter.Inner inner = new Outter.Inner();
        System.out.println(inner.num2);
    }
}

4. 从内部类访问外部类成员

内部类一个高级的用法就是可以访问外部类的属性和方法。文章来源地址https://www.toymoban.com/news/detail-418371.html

class OutClass {
    int num =100;

    class InnClass {
        public int InnerMethod() {
            return num;
        }
    }
}

public class App {
    public static void main(String[] args) {
        OutClass outCls = new OutClass();
        OutClass.InnClass inner = outCls.new InnClass();
        System.out.println(inner.InnerMethod());
    }
}

到了这里,关于java内部类的创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java语言------四种内部类的详细讲解

    目录 一.内部类的介绍 二.内部类的种类 2.1实例内部类       2.2.静态内部类 2.3局部内部类 2.4匿名内部类 总结        内部类: 一个类定义在  另一个类  的  内部。        内部类分为 四种 : 实例内部类、静态内部类、局部内部类、匿名内部类。 使用时机:当一个事

    2023年04月25日
    浏览(43)
  • 【Java入门】final关键字、static关键字、内部类的认识

    前言 : final是Java中的一个修饰符,用于表示某个变量、方法或者类不能被修改。final可以用于修饰类、方法和变量(局部变量,成员变量)。被final所修饰的类不能被继承,被final所修饰的方法不能被重写,被final所修饰的变量,不能被重新赋值 。 static是Java中的一

    2024年02月11日
    浏览(54)
  • Java进阶(7)——手动实现LinkedList & 内部node类的实现 & 增删改查的实现 & toString方法 & 源码的初步理解

    1.linkedList的节点,当前,上一个,下一个的思想; 2.根据index找node的方法,根据index确定从头部还是尾部; 3.linkedlist的增删改查的实现,本质是改变节点的信息; 4.递归方法实现自定义链表的toString方法; Java进阶(3)——手动实现ArrayList 源码的初步理解分析 数组插入数据和

    2024年02月11日
    浏览(51)
  • 简述java中类的创建过程

    1. 创建步骤 我们要用代码创建一个类,可以按如下几个步骤进行实现: 1. 确定类名; 2. 编写成员变量; 3. 编写成员方法。 通过以上步骤,一个类就可以创建出来了。 2. 基本语法 在 Java 中,定义一个类需要使用 class 、类名和一对表示程序体的大括号,基本语法如下

    2024年02月09日
    浏览(39)
  • Java面试题Class类的理解?创建类的对象的方式?

    1.类的加载过程: 程序经过 javac.exe 命令以后,会生成一个或多个字节码文件(.class结尾)。 接着我们使用 java.exe 命令对某个字节码文件进行解释运行。相当于将某个字节码文件 加载到内存中。此过程就称为类的加载 。加载到内存中的类,我们就称为运行时类,此运行时类,

    2024年02月10日
    浏览(37)
  • Java多线程---线程的创建(Thread类的基本使用)

    本文主要介绍Java多线程的相关知识, Thread的创建, 常用方法的介绍和使用, 线程状态等. 文章目录 前言 一. 线程和Thread类 1. 线程和Thread类 1.1 Thread类的构造方法 1.2 启用线程的相关方法 2. 创建第一个Java多线程程序 3. 使用Runnable对象创建线程 4. 使用内部类创建线程 5. 使用Lamba

    2024年02月03日
    浏览(39)
  • 使用反射调用类的私有内部类的私有方法

    在进行单元测试时,我们往往需要直接访问某个类的内部类或者某个类的私有方法,此时正常的调用就无能为力了,因此我们可以使用反射进行调用。 类 实现方法 获取类的Class对象 Class class = Class.forName(\\\"类名\\\") 或 Class class = 类实例.getClass() new一个实例 Object object = class.newIn

    2024年02月07日
    浏览(41)
  • 内部类的学习2

    静态内部类 静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。 创建静态内部类对象的格式: 外部类名.内部类名 对象名=new 外部类名.内部类名(); 局部内部类:将内部类定义在方法里面就叫局部内部类,类似于方法里面的局部变量

    2024年01月25日
    浏览(35)
  • 关于内部类的面试题

    一、看下面代码求值 复制 答案:num、this.num、Outer.this.num 解析:这题你如何明白了上面总结中的第二点,那么非常简单,考察的就是1、局部变量 2、this,和3、Outer.this,也就是内部类访问外部类属性方法的原理。这考察三个东西, 1、在一个方法中,使用直接使用变量名,肯定

    2024年02月08日
    浏览(37)
  • 微信小程序 <view></view>容器嵌套,wxss样式修改内部内部样式不产生效果

    网上关于”微信小程序讲的知识很少“,微信开发文档对于新手不是很友好,但是建议一定要学会看文档。 问题如下: 我写了好几个view/view 容器嵌套,我在对内部容器包括的内容做修改时,不产生效果,后来发现这是因为引用方式有误。 ’ view 示例二/view   view class = 

    2024年02月17日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包