Java内部类入门

简介: Java内部类入门一、内部类介绍二、成员内部类:1、非静态内部类2、静态内部类二、局部内部类:2、有名的局部内部类1、匿名局部内部类(重要)

一、内部类介绍


1.定义:一个类内部又嵌套了一个类,被嵌套的类就是内部类(inner class),嵌套其他类的称为外部类(outer class)。内部类是类的五大成员之一(属性、方法、构造器、代码块、内部类)。


分类0761edd755cd4f9886d0912cd42ada03.png

二、成员内部类:


1、非静态内部类


说明:定义在成员位置中(方法或代码块外面),无static修饰。


1.可以直接访问外部类的所有的成员


2.可以 添加任意权限修饰符


3.作用域,和其他成员一样作用在整个外部类


package local_class;
public class localclass {//外部类
    //属性位置
    private int n1=10;
    class localN1{//局部类
        public void output(){
            //==1==.可以直接访问外部类的所有的成员,包括私有
            System.out.println("获取私有成员"+n1);
        }
    }
    //写一个方法来创建局部类的一个实列
    public void output(){
        localN1 LocalN1 = new localN1();
        LocalN1.output();
    }
}


实现:


1df01636411a4d3da3d30926b02a31b2.png


2、静态内部类


**说明:**定义在成员位置中(方法或代码块外面),有或无static修饰。


1.可以直接访问外部类的静态的成员,不能访问非静态成员。


629d70f1b3354aa58ee4a4dadd29b2c9.png


2.可以 添加任意权限修饰符


3.作用域,和其他成员一样作用在整个外部类


代码:


package local_class;
public class _static_localclass {//外部类
    private int n1=10;
    static int n2=20;
    static public class localN2{//静态局部类
        public void output(){
            //==1==.可以直接访问外部类的所有的成员,包括私有
            System.out.println("获取_static_localclass私有成员"+n2);
            //System.out.println(n1);
        }
    }
    //写一个方法来创建局部类的一个实列
    public void output(){
        localN2 LocalN2 = new localN2();
        LocalN2.output();
    }
}


ac1f6cc7a5074c6780d8223da11d58ce.png


成员内部类:用法比较简单。


三、局部内部类:


说明:局部类是定义在外部类的方法内或者代码块内。


1.可以直接访问外部类的所有的成员。


2.不能添加访问修饰符,局部内部类的地位就是一个局部变量(所以可以用fianl修饰)。

3.作用域:作用在所定义的方法中或者代码块中。


4.访问方式:局部内部类访问外部外部类成员可以直接访问。外部类访问局部内部类,在外部类作用域内先创建对象再访问。


5.外部其他类不能访问内部类。


6.外部类成员与内部类成员重名时,默认就近原则,如果想用外部类的话可以使用:外部类名.this.成员 。例如:


16850751885e47eb93762d78d04229a2.pngd0287ea6742246d4855d57ffbf368c0d.png


2、有名的局部内部类


错误代码


e8fb6f7e4c6f476a87b25b91302c5210.png


正确代码


package _inner_class;
public class Named_local_inner_class {//外部类
    private int a1=1;
    int a2=2;
    private void fun(){
        System.out.println("输出了私有方法");
    }
    //第一种情况,在方法中
    //第二种情况,在代码块中(我就不打代码了和在方法中一样的)
    //此处以方法中为例。
    public void output(){//方法
        class inner_class{//局部内部类
            //1.可以访问外部类的所有成员
            public void _output(){
                System.out.println("a1="+a1);//访问的私有成员
                System.out.println("a2="+a2);
                fun();
            }
        }
    //只需要实例化就行了,然后调用这个 output()方法。
    //注意作用域
        inner_class Inner_class=new inner_class();
        Inner_class._output();
    }//结束方法
}//外部类


调用


877313d619f843219c511f6b1ae41d2e.png


1、匿名局部内部类(重要)


1.本质还是一个内部类 就是一个类,该类没有名字(其实有名字,只是我们看不见,系统分配)。


2.同时还是一个对象。


基本语法


new 类名或接口名(参数列表){
  类体
};


6a5535e1596f4e968a0eb8fcb2d7fcab.png


调用匿名内部类:

34b19c5a653f45459ada6d2998f01b1b.png


输出


944ce04bc1204770b17412a58336fa27.png


和有名的局部内部类的区分


1.A22对象只使用一次,以后不再使用时用匿名局部内部类。


2.A22的编译类型和运行类型是什么?(运行类型其实就是匿名局部内部类,

就是XXXXX.外部类名$1


如图:


9483259ca22d47b2aa400c437b082075.png


9774af7885b742808d5d7ac556091595.png

目录
打赏
0
0
0
0
0
分享
相关文章
|
25天前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
157 60
【Java并发】【线程池】带你从0-1入门线程池
|
12天前
|
【Java并发】【synchronized】适合初学者体质入门的synchronized
欢迎来到我的Java线程同步入门指南!我不是外包员工,梦想是写高端CRUD。2025年我正在沉淀中,博客更新速度加快,欢迎点赞、收藏、关注。 本文介绍Java中的`synchronized`关键字,适合初学者。`synchronized`用于确保多个线程访问共享资源时不会发生冲突,避免竞态条件、保证内存可见性、防止原子性破坏及协调多线程有序访问。
47 8
【Java并发】【synchronized】适合初学者体质入门的synchronized
|
12天前
|
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
57 23
【Java并发】【AQS】适合初学者体质的AQS入门
AQS这是灰常重要的哈,很多JUC下的框架的核心,那都是我们的AQS,所以这里,我们直接开始先研究AQS。 那说到研究AQS,那我们应该,使用开始说起🤓 入门 什么是AQS? AQS(Abst
26 8
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第17天】本文详细介绍了Java编程中Map的使用,涵盖Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的并发处理和性能优化技巧,适合初学者和进阶者学习。
186 3
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
121 60
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
125 7
Spring Boot 入门:简化 Java Web 开发的强大工具
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。