Java中内部类的讲解(Java系列8)

news2024/11/16 1:43:43

目录

前言:

1.内部类

1.1内部类的概念

1.2内部类的分类

1.2.1实例内部类

1.2.2静态内部类

1.2.3局部内部类

1.2.4匿名内部类

结束语:


前言:

这次小编主要与大家分享一下什么是内部类,那么接下来就和小编一起来见识一下内部类究竟是什么,我们又该怎么使用他们。

1.内部类

1.1内部类的概念

当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么这个内部的完整的结构最好使用内部类。在Java中,可以将一个类定义在另一个类或者另一个方法的内部,前者称之为内部类,后者称之为外部类,内部类也是封装的一种体现。

代码如下所示:

public class OutClass {
    //OutClass称之为外部类
    class InnerClass{
        //InnerClass该类为内部类
    }
}

注意:我们

1.定义在class类名{}花括号外部的,即使是在一个文件里,都不能称之为内部类。只能说是两个类。

代码如下所示:

public class Test2 {
    public int a;
}
class B{
    public int b;
}

 2.内部类和外部类共用一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件。

1.2内部类的分类

我们先来看一下内部类具体度可以分布在哪些方面。

public class Test3 {
    //1.成员变量的位置
    public class InnerClass1{
        //未被static修饰的实例内部类
    }
    static class InnerClass2{
        //被static修饰的静态内部类
    }
    //2.成员方法的位置
    public void method() {
        class InnerClass3{
            //在方法中定义的局部内部类
        }
    }
}

上面代码中给大家简单的看了一下内部类的三大位置,那么接下来我们就分别具体展开给大家介绍一下各个内部类都有哪些具体的用法以及注意事项。 

1.2.1实例内部类

实例内部类也叫非静态内部类,根据词意大家应该也知道了,就是不被static修饰的成员内部类。

具体代码如下所示:

public class Test4 {
    public class InnerClass{
        //实例内部类(非静态内部类)
    }
}

注意:

1.外部类中的任何成员都可以在实例内部类方法中直接访问。

public class Test4 {
    public int a;
    private int b;
    
    public class InnerClass{
        //实例内部类(非静态内部类)
        public int c;
        private int d;
        public void methodInnerClass(){
            System.out.println("内部类的方法:methodInnerClass");
            a = 100;
            b = 200;
            System.out.println(a + b);//可以访问外部被任何修饰符修饰的成员变量。
            methodOutClass();//可以访问外部的成员方法
        }
    }
    public void methodOutClass(){
        System.out.println("外部类的方法:methodOutClass");
    }
}

 2.实例内部类所处的位置与外部成员位置相同,因此也受public、private等访问限定符的约束。

public class Test5 {
    //示范被各种修饰限定符修饰的内部类
    private class InnerClass1{
        //1.被private修饰的内部类
    }
    class InnerClass2{
        //2.被default(默认)修饰的内部类
    }
    protected class InnerClass3{
        //3.被protected修饰的内部类
    }
    public class InnerClass4{
        //4.被public修饰的内部类
    }
}

3.在实例内部类方法中访问同名的成员的时,会优先访问自己的,你也可以理解为遵循“就近原则”如果要访问外部类同名的成员,必须要外部类名称.this.同名成员来访问。 

public class Test6 {
    public int a = 10;
    private int b = 20;
    class InnerClass{
        public int a = 30;
        private int b = 40;
        public void methodInnerClass(){
            //调用的是内部类自己的成员变量,遵循就近原则
            System.out.println(a);
            System.out.println(b);
            //要调用外部类的成员变量则可以通过外部类类名.this.相同成员变量名
            System.out.println(Test6.this.a);
            System.out.println(Test6.this.b);
        }
    }
}

4.实例内部类对象必须在先有外部类对象前提下才能创建。

5.实例内部类的非静态方法中包含了一个指向外部类对象的引用。

6. 外部类中,不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。

代码如下所示:

public class OutClass2 {
    public int a = 10;
    private int b = 20;
    public void methodOutClass(){
        System.out.println("这是一个外部类方法:methodOutClass!");
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    class InnerClass{
        public int a = 30;
        private int b = 40;
        public void methodInnerClass() {
            System.out.println("这是一个内部类方法:methodInnerClass!");
            System.out.println("******这是内部类的成员变量!*****");
            System.out.println("a = " + a);
            System.out.println("b = " + b);
            System.out.println("******这是外部类的成员变量!*****");
            System.out.println("a = " + OutClass2.this.a);
            System.out.println("b = " + OutClass2.this.b);
        }
    }

    public static void main(String[] args) {
        //实例化外部类
        OutClass2 outClass2 = new OutClass2();
        outClass2.methodOutClass();
        //实例内部类
        //创建方法一:
        OutClass2.InnerClass innerClass1 = new OutClass2().new InnerClass();
        innerClass1.methodInnerClass();
        //创建方法二:
        //该方法需要先创建外部类对象后才能创建出来!!!
        OutClass2.InnerClass innerClass2 = outClass2.new InnerClass();
        innerClass2.methodInnerClass();
    }
}

结果如下所示:

1.2.2静态内部类

看完实例内部类(非静态内部类)那么对于静态内部类大家应该会更加好理解一点吧,就是被static修饰的内部类就叫静态内部类。

public class OutClass1 {
    static class InnerClass1{
        //静态内部类
    }
}

那么接下来我们具体通过代码和注意事项来学习一下什么是静态内部类,如何使用静态内部类。

注意:

1.在静态内部类中只能访问外部类中的静态成员。

public class OutClass1 {
    public int a = 10;
    public static int b = 30;
    //在静态内部类中只能访问外部类中的静态成员
    static class InnerClass1{
        //静态内部类
        public void methodInnerClass() {
            //System.out.println(a);
            System.out.println(b);
        }
    }
}

在上述代码中我们只能访问b而不能访问a。

 2.创建静态内部类对象时,不需要先创建外部类对象。

public class OutClass1 {
    public int a = 10;
    public static int b = 30;
    //在静态内部类中只能访问外部类中的静态成员
    static class InnerClass1{
        //静态内部类
        public void methodInnerClass() {
            //System.out.println(a);
            System.out.println(b);
        }
    }

    public static void main(String[] args) {
        InnerClass1 innerClass1 = new InnerClass1();
        innerClass1.methodInnerClass();
    }
}

1.2.3局部内部类

局部内部类是定义在外部类的方法体或者是{}中,该种类内部类只能在其定义的位置使用,一般使用的非常少。

public class OutClass1 {
    public void methodOutClass1(){
        class InnerClass1{
            //局部内部类
        }
    }
    {
        class InnerClass2{
            //局部内部类
        }
    }
}

注意:

1.局部内部类只能在所在定义的方法体内部使用。

public class OutClass1 {
    public void methodOutClass1(){
        class InnerClass1{
            public int a = 10;
            //局部内部类
            public void methodInnerClass1() {
                System.out.println(a);
            }
        }
        //只能在方法体内部使用
        InnerClass1 innerClass1 = new InnerClass1();
        innerClass1.methodInnerClass1();
    }
    
    {
        class InnerClass2{
            //局部内部类
            public int b = 20;
            public void methodInnerClass2() {
                System.out.println(b);
            }
        }
        InnerClass2 innerClass2 = new InnerClass2();
        innerClass2.methodInnerClass2();
    }
}

 2.不能被public、static等修饰符修饰。

3.编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class。 

1.2.4匿名内部类

顾名思义就是没有名字的,具体的看下面的代码。

interface IClass{
    void func();
}
public class OutClass1 implements IClass{

    @Override
    public void func() {
        System.out.println("这是一个接口方法的重写!");
    }

    public static void main(String[] args) {
        //匿名内部类
        new IClass(){
            @Override
            public void func() {
                System.out.println("这是在创建对象的时候接口方法的重写!!!");
            }
        }.func();//方法的调用
    }
}

 

结束语:

在这节中小编与大家分享了内部类是什么,内部类分为了哪几种,具体如何使用,希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!) 

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

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

相关文章

aloam学习笔记(一)

开始学习aloam框架,记录一下最开始运行aloam中出现的各种问题以及解决方式。 1.aloam地址 GitHub - HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM 2.安装aloam的一些依赖 主要是两个ceres和pcl库 2.1安装ceres ceres官方地址:I…

宝马335i手动挡和M3手动挡的对比

感受篇 *动力 两车的动力都堪称强悍,但发力感受差异非常大。335具备典型的涡轮车特征,动力来的比较突兀, 低速跟车时油门很难控制,给小了车走得慢,给大了就往前窜。转速拉到3000转以后335的动力刺激度非常高&#xff…

房产管理系统安全可靠性分析

数图互通房产管理 高校房产管理系统是基于公司自主研发FMCenter平台开发的应用系统。 一、系统安全性分析: 1.支持SSL传输协议,可以实现链路层的加密传输。 2.提供基于角色的授权体系,角色可自…

辞旧迎新,社科院与杜兰大学金融管理硕士项目引领你在金融的世界遇到更好的自己

不知不觉中2022年剩下最后的2天了,这一年中一半的时间是核酸,另一半是辛酸。当我们的理想快被生活磨灭的时候,记得把生活调成自己喜欢的频率,尽力而为。告别过去才能跟未来更好的相逢,新的一年我们的在职读研从社科院杜…

webdriver的尝试:三 【移动端的使用appium-配置】

文章目录appium安装appium与inspectorinspector配置配置信息获取inspector启动遇到的错误记录启动appium Selenium webdriver到移动端使用的是appium。 官方网站 介绍是:appium是一个app的自动化测试框架,使用webdriver协议。且可用于,原生…

【机器学习实战】二、随机森林算法预测出租车车费案例

随机森林算法预测出租车车费案例 一、导入第三方库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import sklearn二、加载数据集 train pd.read_csv(train.csv,nrows1000000) # 加载前1000000条数据 test pd.read_csv(…

Java-抽象类与接口

前言 温故而知新 最近从头来看当初学过的语法知识点, 温故而知新, 发现当初还有许多未掌握的知识, 所以我建议大家也要多温故, 可能当初有好多知识点是没掌握到的. 这篇博客的重点就是介绍抽象类与接口, 并阐述他们的区别. 一. 抽象类 1. 概念 在面向对象的概念中, 所有的…

git基础

代码托管平台:git.acwing.com 一、git基本概念 工作区:仓库的目录。工作区是独立于各个分支的。 暂存区:数据暂时存放的区域,类似于工作区写入版本库前的缓存区。暂存区是独立于各个分支的。 版本库:存放所有已经提交…

黑马Hive+Spark离线数仓工业项目--数仓主题应用层ST层构建(2)

服务域:回访主题分析 目标:掌握回访主题的需求分析 路径 - step1:需求 - step2:分析 实施 需求:统计不同维度下的回访主题指标的结果 分析 - 指标 - 回访工程师数量、回访人员数量、回访人员最大数量、回访人员最…

C++学习 Day.8 (重载运算符和类型转换运算符)ps:一大波参考博客来袭~~

this指针 详解请点这里 复制构造函数详解 点这里和这里 指针的指针的地址,指针自身的地址,指针指向的地址 点这里 实例化解释很好 引用和指针的区别 点这里和这里 引用详解:C:引用的简单理解 - Tom文星 - 博客园 (cnblogs.co…

SMC详解

SMC全称:Secure Monitor Call 目的:进入到EL3异常等级 应用场景:大于等于EL1异常等级下使用(EL0下不能使用) 官方介绍以及使用方式如下: 主要配置: (1) SCR_EL3.SMD: (2) HCR_EL2.TSC 主要功…

ArcGIS基础实验操作100例--实验20按像元修改栅格值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验20 按像元修改栅格值 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

SpringCloud整合Seata(AT两阶段--场景: 下单减少库存)

文章目录零:前置操作 --- 搭建Seata服务一:介绍说明二:添加undolog表三:框架整合Seata相关依赖3.1:引入公共SEATA POM依赖3.2:业务服务引入SEATA公共组件依赖3.3:yml文件配置Seata客户端和注册信…

[C++]模板与STL简介

🥁作者: 华丞臧 📕​​​​专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 文章目录模板初阶…

AspNetCore中的日志组件

介绍 本文写作年代比较久远,最新日志文档请查看: .NET Core 和 ASP.NET Core 中的日志记录 | Microsoft Learn了解如何使用由 Microsoft Extension.Logging NuGet 包提供的日志记录框架。https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/l…

选择-C++选择分支

引言 你们喜欢吃"只因"肉? a > 喜欢 b > 还行 c > 不喜欢 请说出你的答案: 证明 真ikun 和假ikun 关键点 我现在 a 因为我是ikun 我是 唯一玩梗的CSDN技术型博主 哈哈所以夹带点私货 你们dddd(懂的都懂) 关注我,让你看到更多的C/C 的技术点和技术以外的梗…

CTF之MISC题目-简单流量

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 第二篇 CTF之MISC题目-西游记 第三篇 CTF之MISC题目-简单流量 文章目录CTF系列文章前言一、题目是什么?二、解题步骤1.下载文件、解压2.使用wireshark3.解压flag.zip总结前言 这是一道关于网络数…

ElasticSearch-倒排索引

文章目录一、mysql数据库存在的问题1.1 模糊查询索引失效1.2 不能分词查询二、倒排索引一、mysql数据库存在的问题 1.1 模糊查询索引失效 假设要查询上图中title中包含"手机"的信息,那么sql语句是这样的 SELECT * FROM goods WHERE title LIKE %手机%;如…

功能更新 | 身份认证增强安全配置

在开始本文前,先给大家出个解谜题,密码在下一段文字里,由 9 个字组成,开动你的脑筋吧,我们在本文结尾会揭晓答案: 2022 年马上就要结束了,机遇与挑战并存的一年。昨天,北京郊区一些地…

企业电子招标采购系统源码及功能清单

​ ​ 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点:对草稿进行编…