Java之内部类

news2025/8/2 21:23:07

目录

一.内部类

1.什么是内部类

2.内部类存在的原因

3. 内部类的分类

4.内部类的作用

二.成员内部类

1.基本概念

2.成员内部类的注意点

1.成员内部类可以用private方法进行修饰

2.成员内部类可以直接访问外部类的私有属性

3.外部类可以通过对象访问内部类的私有属性

4.成员内部类中不可以定义static属性和方法

 3.产生内部类的对象

1.在外部类的内部产生内部类的对象

2.在外部类的外部产生内部类的对象

三.静态内部类

1.基本概念

2.静态内部类的注意点

1.静态内部类可以通过对象访问内部类的私有属性

2.静态内部类可以直接访问外部类的静态属性和方法

3.外部类通过对象访问静态内部类中的私有属性和方法

4.静态内部类中可以定义静态变量也可以定义成员变量

3.产生静态内部类的对象

1.在外部类的内部产生静态内部类

2.在外部类的外部产生静态内部类

四.成员内部类和静态内部类的对比

1.实际案例

2.两者差异

3.内部类的作用

4.编译后的class文件

五.方法内部类

1.基本概念

2.方法内部类的注意点

1.方法内部类不能使用任何的访问修饰符

2.方法内部类的声明周期只在方法调用的过程中存在

3.方法内部类中的访问范围

4.方法内部类形参不可改变

六.匿名内部类

1.基本概念

2.匿名内部类的示例

3.匿名内部类的使用  ----参数使用匿名内部类


一.内部类

1.什么是内部类

内部类:一个类嵌套在另一个类的内部,称这个嵌套类为内部类.

public class Outter {
    //内部类
    class Inner{
        
    }
}

2.内部类存在的原因

内部类是封装的一种体现,

人类和心脏类的关系就是一种内部类和外部类的关系

汽车发动机和汽车关系也是一种内部类和外部类的关系

3. 内部类的分类

根据定义的位置和使用的关键字的不同,可以分为以下四种内部类

  1. 成员内部类
  2. 静态内部类
  3. 方法内部类
  4. 匿名内部类

4.内部类的作用

  1. 内外部类可以更方便的访问彼此的私有属性
  2. 可以打破单继承的局限

具体的表现在下面慢慢的具体分析

二.成员内部类

1.基本概念

成员内部类:直接定义在类中,不加static定义的内部类就称为成员内部类

2.成员内部类的注意点

提示:可以把成员内部类类比为类中的成员方法

1.成员内部类可以用private方法进行修饰

我们都知道我们平常使用的类是不可以使用private关键字进行修饰的,因为这样在外部就无法访问到这个私有的类了,定义显得没有必要了.

但是成员内部类是可以用private关键字修饰的,表示在外部无法直接创建私有的成员内部类

public class Outter {
    private String name;

    //私有的内部类
    private class Inner {


    }


}

2.成员内部类可以直接访问外部类的私有属性

在内部类Inner中,我们直接可以访问外部类的私有属性和私有方法,直接调用,不需要创建对象,类比为成员方法直接调用类中的私有属性和私有方法

直接调用的name相当于Outter.this.name 

直接调用的fun()相当于Outter.this.fun()

public class Outter {
    private String name;

    //内部类
    private class Inner {
        private int num;

        private void test() {
            //直接在成员内部类直接访问外部类的私有属性
            System.out.println(name);
            fun();
            System.out.println("inner的test方法");
        }

    }

    private void fun() {

        System.out.println("外部类的fun方法");
    }


}

3.外部类可以通过对象访问内部类的私有属性

外部类中是不可以直接访问内部类的属性和方法的,但是我们可以通过创建内部类的对象来访问内部类的私有属性和方法.

如果是一个普通的类,内部定义了私有的属性和方法,我们即使创建了对象,也不可以访问内部的私有属性和方法,但是外部类中定义了内部类的对象,我们是确实可以访问到内部类的私有属性和方法的

public class Outter {
    private String name;

    //内部类
    private class Inner {
        private int num;

        private void test() {
            //直接在成员内部类直接访问外部类的私有属性
            System.out.println(name);
            System.out.println("inner的test方法");
        }

    }

    private void fun() {
        //产生内部类的对象
        Inner inner = new Inner();
        //外部类中访问内部类的属性
        System.out.println(inner.num);
        inner.test();
        System.out.println("外部类的fun方法");
    }

    public static void main(String[] args) {
        Outter outter = new Outter();
        outter.fun();

    }
}

main方法的输出

0
null
inner的test方法
外部类的fun方法

4.成员内部类中不可以定义static属性和方法

类比于成员方法,在成员方法中是不可以定义static的属性的,因为方法的调用需要对象来调用,而static的变量是不需要对象调用的,这显然是矛盾的

 3.产生内部类的对象

1.在外部类的内部产生内部类的对象

直接new出来内部类的对象即可

类名称 引用名称=new 类名称();

        Inner inner = new Inner();

2.在外部类的外部产生内部类的对象

注意:如果成员内部类私有(private),无法在内部类的外部产生内部类的对象

外部类名称.内部类名称 内部类引用=new 外部类名称().new 内部类名称();

public class Test {
    public static void main(String[] args) {
        //在外部类的外部产生内部类的对象
        Outter.Inner inner = new Outter().new Inner();
    }
}

类比于成员方法:成员方法必须通过类的对象调用

同理:要产生内部类的对象,首先要产生外部类的对象

三.静态内部类

1.基本概念

静态内部类:直接定义在类的内部,使用staic关键字修饰,就成为静态内部类

2.静态内部类的注意点

注意:可以把静态内部类类比于静态方法

1.静态内部类可以通过对象访问内部类的私有属性

直接new外部类的对象,然后便可以访问其私有的属性和方法

因为静态内部类不需要依赖外部类的对象产生而产生,因此静态内部类中不能直接访问外部类的方法和属性,必须通过外部类的对象来访问,但是可以直接访问外部类的静态属性和方法

public class StaticOutter {
    private String name;

    static class inner {
        private int num;

        public void test() {

            //通过外部类的对象访问其私有属性和方法
            StaticOutter staticOutter = new StaticOutter();
            staticOutter.fun();
            System.out.println(staticOutter.name);


        }
    }


    private void fun() {
        System.out.println("外部类的fun方法");
    }
}

2.静态内部类可以直接访问外部类的静态属性和方法

public class StaticOutter {
    private String name;
    static int age;


    static class inner {
        private int num;

        public void test() {
            //直接访问外部类的静态属性和方法
            System.out.println(age);
            method();
            //通过外部类的对象访问其私有属性和方法
            StaticOutter staticOutter = new StaticOutter();
            staticOutter.fun();
            System.out.println(staticOutter.name);


        }
    }

    public static void method() {
        System.out.println("外部类的method方法");
    }

    private void fun() {
        System.out.println("外部类的fun方法");
    }
}

3.外部类通过对象访问静态内部类中的私有属性和方法

和成员内部类中的外部类访问内部类一样

public class StaticOutter {
    private String name;
    static int age;


    static class Inner {
        private int num;

        public void test() {
            //直接访问外部类的静态属性和方法
            System.out.println(age);
            method();
            //通过外部类的对象访问其私有属性和方法
            StaticOutter staticOutter = new StaticOutter();
            staticOutter.fun();
            System.out.println(staticOutter.name);


        }
    }

    public static void method() {
        System.out.println("外部类的method方法");
    }

    private void fun() {
        //外部类通过对象访问静态内部类中的私有属性和方法 
        Inner inner = new Inner();
        System.out.println(inner.num);
        System.out.println("外部类的fun方法");
    }
}

4.静态内部类中可以定义静态变量也可以定义成员变量

静态内部类可以看做相当于一个普通的类,只不过嵌套在了外部类的里面了而已

public class StaticOutter {
    private String name;



    static class Inner {
        private int num;
        static String address;
        public static void method(){
            System.out.println("静态内部类的静态方法method");
        }

        public void test() {
            //通过外部类的对象访问其私有属性和方法
            StaticOutter staticOutter = new StaticOutter();
            staticOutter.fun();
            System.out.println(staticOutter.name);


        }
    }



    private void fun() {
        //外部类通过对象访问静态内部类中的私有属性和方法
        Inner inner = new Inner();
        System.out.println(inner.num);
        System.out.println("外部类的fun方法");
    }
}

3.产生静态内部类的对象

1.在外部类的内部产生静态内部类

和成员内部类一样

类名称 引用名称=new 类名称();

        Inner inner = new Inner();

2.在外部类的外部产生静态内部类

外部类名称.内部类名称 内部类引用=new 外部类名称.内部类名称();

静态内部类不需要外部类的对象,因此不需要创建外部类的对象

public class Test {
    public static void main(String[] args) {
        //在外部类的外部产生静态内部类的对象
        StaticOutter.Inner inner = new StaticOutter.Inner();
    }
}

四.成员内部类和静态内部类的对比

1.实际案例

成员内部类和外部类相当于人类和心脏,心脏的产生不能离开人的产生

而静态内部类和外部类相当于车和发动机,发动机可以立刻车独立存在

2.两者差异

成员内部类中包含了外部类的对象,能直接访问外部类的成员属性,不能定义静态属性

静态内部类中没有包含外部类的对象,不能直接访问外部类的成员属性,能定义静态属性和成员属性

3.内部类的作用

1.经过以上的分析,我们可以总结出内部类的一大作用就是可以直接访问外部类的私有属性和方法

2.我们知道一个子类只能继承一个父类,我们如果使用内部类,便可以写出类似多继承的子类,规避单继承的局限性,此时外部类中就包含了A和B的所有属性和方法

class A {

}

class B {

}

public class InnerClassExtends {
    class InnerA extends A {
    }


    class InnerB extends B {
    }

    
}

4.编译后的class文件

Outter是外部类,Inner是内部类,中间用$符分隔开

五.方法内部类

1.基本概念

方法内部类:直接定义在方法中的类

2.方法内部类的注意点

注意:方法内部类可以类似于参数

1.方法内部类不能使用任何的访问修饰符

public class MethodInner {
    private String name;

    public void fun() {
        //在方法中定义的类技术就是方法内部类
        class Inner {

        }
    }
}

2.方法内部类的声明周期只在方法调用的过程中存在

方法调用结束之后自动销毁,方法内部类对方法外部完全隐藏

public class MethodInner {
    private String name;

    public static void fun() {
        //在方法中定义的类技术就是方法内部类
        class Inner {
            private int num;

            private void test() {
                //可以访问到外部类的私有
                System.out.println(new MethodInner().name);
            }

        }
        //可以通过对象访问到方法内部类的私有属性和方法
        //在这个方法之外无法new Inner对象
        Inner inner = new Inner();
        inner.test();
        System.out.println(inner.num);
    }
}

3.方法内部类中的访问范围

方法内部类中的方法是否需要new外部类取决于外部方法是static还是普通的

public class MethodInner {
    private String name;

    public void fun() {
        //在方法中定义的类技术就是方法内部类
        class Inner {
            private int num;

            public void test() {
                //可以访问到外部类的私有
                System.out.println(name);
            }

        }
    }
}
public class MethodInner {
    private String name;

    public static void fun() {
        //在方法中定义的类技术就是方法内部类
        class Inner {
            private int num;

            public void test() {
                //可以访问到外部类的私有
                System.out.println(new MethodInner().name);
            }

        }
    }
}

4.方法内部类形参不可改变

若方法内部类使用方法的形参,这个参数必须为形式上的参数(不能在类中修改该参数的值,JDK8之后),JDK8之前必须显式的定义为final

在方法内部类中调用了方法的形参,在方法内也不能改变其值;我们可以思考一下为什么.因为如果我们在方法内部类中调用了方法的形参,而此时我们在方法中修改了形参的值,无法确定调用的形参的值是原始的,还是修改过后的形参的值

总结:在方法内部类中只能访问方法内的参数,不能修改其值

方法形参是否有final取决于方法形参中是否使用了形参

六.匿名内部类

1.基本概念

匿名内部类:定义在方法之中,主要是在方法的形参上使用,这个类没有名字,一般默认继承一个类或者一个接口

2.匿名内部类的示例

interface IMessage {

    void print();
}

public class NonNameMethod {
    public void fun() {
        new IMessage() {

            @Override
            public void print() {

            }
        };
    }
}

上边的结构相当于这样进行转换的

3.匿名内部类的使用  ----参数使用匿名内部类

    public static void main(String[] args) {
        compare(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return 0;
            }
        });
    }

    public static void compare(Comparator c) {
        System.out.println("compare方法");
    }

上面的compare方法需要传入一个接口对象,这个时候我们需要传入一个接口的实现类,实现向上转型,这个时候我们就需要使用匿名实现类了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量化择时——均线策略及改进方法(第1部分—因子测算)

文章目录道氏理论个股股价走势阶段板块、行业股价走势均线策略交易逻辑均线策略效果测算改进一:设置策略信号偏移量改进二:生成止盈止损信号道氏理论 使用盘面数据,根据计算出的一条或多条均线,判断入场与离场的时机,…

Redis学习(五):事务、持久化及使用Java操作Redis

事务 Redis事务本质:一组命令的集合。一个事务中的所有命令都会被序列化,在事务执行过程中,会按顺序执行。 一次性、顺序性、排他性!执行一系列的命令。 Redis单条命令保证原子性,但是事务不保证原子性! R…

MySQL面试题-日志

目录 1.MySQL 中常见的日志有哪些? 2.慢查询日志有什么用? 3.binlog 主要记录了什么? 4.Mysql的binlog有几种录入格式?分别有什么区别? 5.redo log 如何保证事务的持久性? 6.页修改之后为什么不直接刷…

Linux系统安装Docker

目录 Linux系统安装Docker 1、如果之前安装过旧版本的Docker,可以使用下面命令卸载 2、安装docker 3、启动docker 4、配置镜像加速 Linux系统安装Docker 前提:Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10&#xff0…

LearnDash Groups学习群组:您需要了解的一切

大约131k 网站使用 LearnDash。因此,毫无疑问,LearnDash是 WordPress 领域中最受欢迎的 LMS。而且,这是因为它具有强大的功能。但让它更受欢迎的是它与大多数第 3 方扩展很好地集成,并且比现有的任何其他 LMS 都更灵活。群组和群组…

扬帆优配|淡定的周期股走出慢牛,这些超跌大象股低估值

多只大市值股走势良好,超跌的绩优大盘股会否后发先至? 三一集团定下万亿市值方针 三一重工董事长许诺向金牌职工派发500万元巨额奖金刷屏网络,不过奖赏兑现的前提是三一集团的总市值要超越万亿元。 3月4日,在央视《对话》节目中…

同城外卖跑腿系统源码分析

外卖订餐已经成为很多“社畜”日常不可分割的一部分,足不出户,只需要一部电子设备即可在线订餐,并且可提供的选择非常多样化,与传统的电话订餐外卖模式相比也更便捷的多。 因此,同城外卖跑腿系统源码得以爆火&#xff…

微服务里的小问题

1.微服务为什么设置不同的namespace 为了实现三种服务三种情况下的隔离。 2.为什么要用nginx为naocos集群结点做负载均衡? 2.1 正向代理 就像我们访问外网需要一个代理。 2.2 反向代理 我们不需要访问真实的ip,只需要访问 这个服务的代理服务器即可&a…

【极致简洁】Python tkinter 实现下载工具,你想要的一键获取

嗨害大家好鸭!我是小熊猫~开发环境本次项目案例步骤成品效果【咱追求的就是一个简洁】界面如何开始?1.导入模块2.创建窗口【这步很重要】功能按键1.创建一个下拉列表2.设置下拉列表的值3.设置其在界面中出现的位置 column代表列 row 代表行4.设置下拉列表…

考研复试——计算机组成原理

文章目录计算机组成原理1. 计算机系统由哪两部分组成?计算机系统性能取决于什么?2. 冯诺依曼机的主要特点?3. 主存储器由什么组成,各部分有什么作用?4. 什么是存储单元、存储字、存储字长、存储体?5. 计算机…

【PyTorch】教程:torch.nn.Hardswish

torch.nn.Hardswish 原型 CLASS torch.nn.Hardswish(inplaceFalse) 参数 inplace (bool) – 内部运算,默认为 False 定义 Hardswish(x){0if x≤−3,xif x≥3,x⋅(x3)/6otherwise\text{Hardswish}(x) \begin{cases} 0 & \text{if~} x \le -3, \\ x & \te…

2.Elasticsearch入门

2.Elasticsearch入门[toc]1.Elasticsearch简介Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Pyth…

win11下载配置CIC Flowmeter环境并提取流量特征

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、下载CIC Flowmeter二、安装java、maven、gradle和IDEA1.java 1.82.maven3.gradle4.IDEA三、CICFlowMeter-master使用四、流量特征1.含义2.获取前言 配了一整…

游戏场景编辑器和骨骼动画相关软件

游戏场景编辑器 一.Tiled(2D) Tiled 是帮助你开发游戏内容的 2D 地图编辑器。它的主要功能是可以编辑各种形式的瓦片地图,还支持通过用空图片这种强大的方式来标记额外信息给游戏使用。Tiled 关注的是总体灵活性,同时尽量保持直观性。 Tiled Map 不但…

获取Github仓库star、fork、watch数

Hi I’m Shendi https://sdpro.top/blog/html/article/1016.html 以下网址可以得到github的star,fork,watch数量图片 https://shields.io/category/social 获取仓库的 Star 则点击 Github Repo stars 填好选项后下方就会出现图标,点击CopyBa…

工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)

博主的合并代码gitgithub.com:huashu996/VINS-FUSION-ESDFmap.git一、D435i深度相机配置1.1 SDKROS参考我之前的博客,步骤和所遇见的问题已经写的很详细了https://blog.csdn.net/HUASHUDEYANJING/article/details/129323834?spm1001.2014.3001.55011.2 相机标定参数…

解决新版QGIS找不到Georeferencer插件

目录1. 问题分析1.1 去 Raster 找,没找到1.2 去插件搜,未搜到1.3 插件库里也搜不到2. 解决办法在 QGIS 3.30中,按常规办法,找不到 Georeferencer插件,它并没有被安装,在库中也找不到它, 请问问题…

sheng的学习笔记Eureka Ribbon

Eureka-注册中心Eureka简介官方网址:https://spring.io/projects/spring-cloud-netflixEureka介绍Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。Zooleeper nacos.Eureka 采用了 C-S 的设计架构。Eureka Server 作为服…

【项目实战】IDEA中 90%的人都不后知后觉的小技巧汇总

一、 IDEA中如何设置左侧导航条跟代码保持同步? https://blog.csdn.net/Arry_Coding/article/details/102389149 二、IDEA中如何将Services调出并将启动类显示在Services中? https://blog.csdn.net/qq_38343402/article/details/106325154 三、IDEA中…

工业企业用电损耗和降损措施研究

来自用电设备和供配电系统的电能损耗。而供配电系统的电能损耗,包括企业变配电设备、控制设备企业在不断降低生产成本,追求经济效益的情况下,进一步降低供配电系统中的电能损耗,使电气设摘要:电网电能损耗是一个涉及面很广的综合性问题,主要包括管理损耗和技术损耗两部分…