内部类(上)成员内部类,局部内部类的使用

news2024/10/7 8:27:27

文章目录

  • 前言
  • 一、内部类是什么?
  • 二、如何使用?
    • 1.成员内部类
    • 2.局部内部类
  • 总结

前言

        如果在一个文件中创建了两个类,那么这两个类是并列关系,不存在哪一个类包含哪一个类的情况。如果在类中再定义一个类,那么这个在类中被定义的类叫做内部类。


一、内部类是什么?

        内部类:内部类是在一个类内部定义的类。

            作用:可以访问外部类的成员,并提供更好的封装和组织代码的能力。

二、如何使用?

1.成员内部类

        语法:

public class OuterClass{	//外部类
	private class InnerClass{	//成员内部类
	    //…
    }
}

         规则1:内部类可以随意使用外部类的成员方法和成员变量,即使有 private 权限关键字修饰,也可以使用。

class OuterClassa{	//外部类
    private int a = 0;    //外部类成员变量
    
    private void b(){
        //外部类成员方法
    }

	private class InnerClass{	//内部类
        
	    void c() {   //内部类的成员方法
			
            a++;

            b();
            //在内部类方法中,调用了外部类的成员方法和成员变量
		}
    }
}

         规则2:内部类的成员只有在内部类的范围之内是可知的,不能被外部类使用。外部类中可以使用内部类对象引用调用内部类的成员变量。

         规则3:如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类的对象上。内部类的初始化方式也是使用new关键字,在外部类和外部类非静态方法中直接实例化

interClass in = new interClass();

         规则4: 如果是在静态方法中实例化内部类对象,需要调用外部类对象。内部类的形式指定该对象的类型

//在main方法中:
OuterClass out = new OuterClass();    //外部类实例化
OuterClass.innterClass in =out.new interClass();    //外部类对象实例化内部类对象

        另一种方法:在方法中返回值实例化内部类对象:通过方法返回值实现成员内部类的实例化 

public OutInterface doit() {	
    //定义一个方法,返回值类型为 OutInterface接口
	return new InnerClass("访问内部类构造方法");
    //return new 关键字,实现实例化内部类对象
	}

实例: 

interface OutInterface{
	// 创建接口,方法通过接口实现 new实例化 内部类对象
}

class OuterClass2{
	//定义一个内部类实现OutInterface接口
	private class InnerClass implements OutInterface{
		InnerClass(String s){	//内部类构造方法
			System.out.println(s);
		}
	}

	public OutInterface doit() {	//定义一个方法,返回值类型为 OutInterface接口
			return new InnerClass("访问内部类构造方法");
	}
}

public class InterfaceInner {
	public static void main(String[] args) {
		OuterClass2 out = new OuterClass2();
		//调用 doit()方法,返回一个OuterInterface接口
		OutInterface outinter = out.doit();
        //通过外部对象 out 调用 doit()方法,new关键字 实例化内部类对象
		
	}
}

输出结果:

 解析:

        1.创建了一个接口。用于外部类doit()方法,返回值类型为接口,实现内部类的实例化。

        2.创建了一个外部类。外部类中写了一个 doit()方法,用于在静态方法中创建内部类对象。

        3.创建了一个内部类。内部类实现了接口,并且写了一个构造方法。

        4.创建了一个静态方法。静态方法中创建了外部类对象。通过外部类对象,调用外部类方法doit()方法,实现内部类的实例化(尽管赋值的对象是一个接口)

2.局部内部类

        局部内部类:在类的方法任意的作用域中定义的内部类。

        语法:

public OutInterface action(String x) {
        //这是一个方法
		class innerClass implements OutInterface{
			//这是写在方法里的一个局部内部类
		}
	}

        实例: 

package package5;

public class Demo2 {
	
	interface OutInterface{
		
	}
	
	public OutInterface action(String x) {
		class innerClass implements OutInterface{
			//这是写在方法里的一个局部内部类
			public innerClass(String s) {
				//局部内部类的构造方法
				s = x;
				System.out.println(s);
			}
		}
		//方法返回值为实例化局部内部类,括号中赋值了局部内部类的构造方法,通过实现一个接口,
		return new innerClass("");
	}

	public static void main(String[] args) {
		Demo2 de = new Demo2();
		de.action("这里是局部内部类");
	}
}

输出结果: 

附加规则:

        局部内部类:在方法中定义的局部内部类只能访问方法中 final类型的局部变量,并且不能改变该局部变量。 


总结

        以上就是对java的内部类的部分介绍,成员内部类,局部内部类的使用。如果有其他的问题,欢迎在评论区评论,我会及时地进行反馈。下一篇补充完内部类的剩下内容。

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

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

相关文章

VMPWN的入门系列-1

温馨提示: 今天的文章有点长,图片比较多,请耐心阅读 5.1 实验一 VMPWN1 5.1.1 题目简介 这是一道基础的VM相关题目,VMPWN的入门级别题目。前面提到VMPWN一般都是接收字节码然后对字节码进行解析,但是这道题目不接受字节…

加载已训练好的目标检测YOLOv8,v5,v3,v6模型,对数据集中某张图片中的object打上方框、标出类别,并将图片保存到本地

参考的教程:Python - Ultralytics YOLOv8 Docs 在与ultralytics代码同一层级下新建 predict.py 里面写下面的内容。运行即可 from ultralytics import YOLO from PIL import Image import cv2# 加载计划使用的模型 model YOLO("yolov8n.pt") # load a…

Flask deleteput

Flask delete&put 一、delete 请求1.1 代码1.2 分析1.3 验证 二、put请求2.1 代码2.2 分析2.3 验证 三、总结 Flask get&post 请求传送门:FLASK get&post分析 一、delete 请求 1.1 代码 from flask import Flask, requestapp Flask(__name__)app.ro…

CVPR2023新作:考虑3D一致性的人脸关键点检测

Title: 3D-aware Facial Landmark Detection via Multi-view Consistent Training on Synthetic (三维感知人脸关键点检测:合成数据下多视角一致训练) Affiliation: Texas A&M University Authors: Libing Zeng, Lele Chen, Wentao Bao, Zhong Li, Yi Xu, Jun…

Linux常用命令——dris命令

在线Linux命令查询工具 dris 显示和清空目录堆栈中的内容 补充说明 dris命令用于显示和清空目录堆栈中的内容。 语法 dris(选项)选项 n:显示从左边算起第n笔的目录; -n:显示从右边算起第n笔的目录; -l:显示目录…

2023年第六届河北省研究生数学建模竞赛题目B题Python求解代码

2023年第六届河北省研究生数学建模竞赛题目B题 本文文档与代码视频讲解与下载:【2023河北省研究生数学建模竞赛B题数据集和代码-哔哩哔哩】 https://b23.tv/weulGAO 光伏电池的异常检测与发电产能预测在碳达峰-碳中和的战略背景下,我国的光伏发电技术发…

离谱!学费4万孩子考8分

家长怒怼学费4万孩子考8分,高中单科却只考了8分,而且还有不少孩子考了5分甚至更低? 这试题是有多难啊? 老洪说两句。 现在有一些“贵族学校”或者是一些民办学校,收费项目和标准都由市场来决定,可能比一般学…

openGauss学习笔记-21 openGauss 简单数据管理-GROUP BY子句

文章目录 openGauss学习笔记-21 openGauss 简单数据管理-GROUP BY子句21.1 语法格式21.2 参数说明21.3 示例 openGauss学习笔记-21 openGauss 简单数据管理-GROUP BY子句 GROUP BY语句和SELECT语句一起使用,用来对相同的数据进行分组。您可以对一列或者多列进行分组…

【mysql学习篇】Order by与Group by优化以及排序算法详解

一、Order by与Group by优化 Case1: 分析: 利用最左前缀法则:中间字段不能断,因此查询用到了name索引,从key_len74也能看出,age索引列用在排序过程中,因为Extra字段里没有using filesort 注意…

tinkerCAD案例:12.Minecraft Party Glasses 我的世界派对眼镜

tinkerCAD案例:12.Minecraft Party Glasses 我的世界派对眼镜 原文 In this lesson, you will learn to design a cool pair of party glasses! 在本课中,您将学习设计一副很酷的派对眼镜! Start by dragging the Box shape to the Workpla…

【Unity】写的一个小工具用来帮助调试代码

unity的Debug.Log方法当放在Update这样的高频方法中调用时,调试信息就会显得很乱难以观测,因此我自己实现了一个调试辅助工具,可以通过GUI实时显示变量状态在Game视图中,可以在代码的任意处调用即可(key不要重复&#…

STM32 USB使用记录:HID类设备(后篇)

文章目录 目的基础说明项目构建与代码调整接收发送代码与测试示例链接报告描述符总结 目的 接上篇: 《STM32 USB使用记录:HID类设备(前篇)》 USB HID 类的设备有个比较大的好处是大部分时候接入主机中都是可以免驱使用的。这篇文…

通过Vue-cli解决前端跨域问题

1、找到vue.config.js 在vue.config.js当中增加如下配置 devServer: {port: 3001,proxy: {/agent: {target: http://10.8.50.250:6666,ws: false, //true,开启ws, 如果是http代理此处可以不用设置changeOrigin: true, // 如果接口跨域,需要进行这个参…

面向对象编程:深入理解抽象类和关键字

文章目录 1. 关键字1.1 static1.2 final1.3 static final 2. 抽象类2.1 抽象类的推导过程2.2 抽象类能否创建对象?2.3 抽象类的意义2.4 判断 3. 案例:计算圆形和长方形的周长及面积 在Java编程中,我们经常会遇到一些特殊的关键字和概念&#…

Kyuubi入门简介

一、官方简介 HOME — Apache Kyuubi 二、概述 1、一个企业级数据湖探索平台 2、一个高性能的通用JDBC和SQL执行引擎 3、一个基于spark的查询引擎服务 三、优点 1、提供hiveserver2查询spark sql的能力,查询效率更为高效,首次构建连接时会持续保持连…

学习笔记21 list

一、概述 有两种不同的方法来实现List接口。ArrayList类使用基于连续内存分配的实现,而LinkedList实现基于linked allocation。 list接口提供了一些方法: 二、The ArrayList and LinkedList Classes 1.构造方法 这两个类有相似的构造方法&#xff1a…

数据结构--串、数组、广义表

这里写目录标题 串定义案例引用串的类型定义以及存储结构抽象类型定义存储结构(顺序表较为常用)顺序存储结构链式存储结构 串的模式匹配算法(查找主串中是否有某个字串)BF算法KMP算法设计思想对字串的回溯进行了优化代码对next【j】进行优化 数组类型一维…

C#,数值计算——Kolmogorov-Smirnov累积分布函数的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// Kolmogorov-Smirnov累积分布函数 /// Kolmogorov-Smirnov cumulative distribution functions /// and their inverses. /// </summary> public class KSdist { …

【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

文章目录 网络编程TCP流套接字编程ServerSocket APISocket APITCP中的长短连接手写TCP版本的回显服务器 网络编程 TCP流套接字编程 TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示"TCP数据报"因为TCP不是以数据报为单位进行传输的.是以…

电机故障诊断(python程序,模型为CNN结合LSTM)

代码运行环境要求&#xff1a;TensorFlow版本>2.4.0&#xff0c;python版本>3.6.0 运行效果视频&#xff1a;电机故障诊断&#xff08;python代码&#xff09;_哔哩哔哩_bilibili 1.电机常见的故障类型有以下几种&#xff1a; 轴承故障&#xff1a;轴承是电机运转时最容…