内部类详解

article/2025/9/14 11:40:47

在这里插入图片描述

1.成员内部类

1.样例

class OutClass {class InnerClass {public String SayHi() {return "你好";}}
}

2.特点

  1. 内部类能够无条件的访问外部类的成员变量,外部类要访问内部类成员变量需要使用new。
  2. 内部类和外部类有相同名称的变量或者是方法,访问外部类方式为:外部类.this.方法。
  3. 内部类是依赖外部类的,只有先有外部类才能有内部类。调用内部类方法为:
OutClass out = new OutClass();
OutClass.InnerClass inner = out.new InnerClass();
  1. 内部类的权限可以public,protected,保护类型和private。而外部类只能是public和保护类型。
  2. 成员内部类不能存在static关键字,非静态内部类也可以定义静态成员但需要同时有final关键词修饰。

2.局部内部类

1.样例

public class Outer {private int s = 100;private int out_i = 1;public void f(final int k) {final int s = 200;int i = 1;final int j = 10;// 定义在方法内部class Inner {int s = 300;// 可以定义与外部类同名的变量// static int m = 20;//不可以定义静态变量Inner(int k) {inner_f(k);}int inner_i = 100;void inner_f(int k) {// 如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量System.out.println(out_i);// 可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的System.out.println(j);// System.out.println(i);// 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量System.out.println(s);// 用this.变量名访问的也是内部类变量System.out.println(this.s);// 用外部类名.this.内部类变量名访问的是外部类变量System.out.println(Outer.this.s);}}new Inner(k);}public static void main(String[] args) {// 访问局部内部类必须先有外部类对象Outer out = new Outer();out.f(3);}
}

2.特点

是指内部类定义在一个类的方法,代码块中。

  1. 局部内部类只能在代码代码块、方法体内和作用域中使用(如创建对象和使用类对象等)
  2. 局部内部类访问作用域内的局部变量,该局部变量需要使用final修饰。
  3. 可以使用abstract修饰,声明为抽象类。
  4. 只能在定义该类的方法中实例化。

3.静态内部类

1.样例

public class Outer {private static int i = 1;private int j = 10;public static void outer_f1() {}public void outer_f2() {}// 静态内部类可以用public,protected,private修饰// 静态内部类中可以定义静态或者非静态的成员private static class Inner {static int inner_i = 100;int inner_j = 200;static void inner_f1() {// 静态内部类只能访问外部类的静态成员(包括静态变量和静态方法)System.out.println("Outer.i" + i);outer_f1();}void inner_f2() {// 静态内部类不能访问外部类的非静态成员(包括非静态变量和非静态方法)// System.out.println("Outer.i"+j);// outer_f2();}}public void outer_f3() {// 外部类访问内部类的静态成员:内部类.静态成员System.out.println(Inner.inner_i);Inner.inner_f1();// 外部类访问内部类的非静态成员:实例化内部类即可Inner inner = new Inner();inner.inner_f2();}public static void main(String[] args) {new Outer().outer_f3();}
}

2.特点

使用static修饰的内部类。

  1. 不依赖外部类,不能使用外部类非静态的变量和方法。
  2. 不需要如成员内部类一样,生成外部类对象来生成内部类。
  3. 静态内部类中可以定义静态或者非静态的成员。
  4. 外部类访问内部类的静态成员:内部类.静态成员。
  5. 外部类访问内部类的非静态成员:实例化内部类即可。
  6. 可以有非静态的方法或者变量。

3.使用场景

  1. 当外部需要使用内部类而内部类不依赖与外部类的资源。
  2. 能够单独生成对象。
  3. 节省资源。

4.匿名内部类

1.样例

就是没有名字的内部类。匿名内部类的格式:

      new 接口或父类(){重写抽象方法};

2.应用场景

个人理解就是没有实现一个接口,但是想重写接口中的方法并且调用并返回。
目的:

  1. 可以使命名变得简洁。
  2. 使代码更加紧凑,简洁,封装性比内部类更优。
  3. 一个类用于继承其他类或是实现接口,无需增加其他的方法,只是对继承方法实现 覆盖。
public class OuterClass {public InnerClass getInnerClass(final int num,String str2){return new InnerClass(){int number = num + 3;public int getNumber(){return number;}};        /* 分号不能省 */}public static void main(String[] args) {OuterClass out = new OuterClass();InnerClass inner = out.getInnerClass(2, "chenssy");System.out.println(inner.getNumber());}
}interface InnerClass {int getNumber();
}----------------
Output:
5

如果不适用匿名内部类

interface InnerClass {int getNumber(int a);
}class InnerClassImpl{ int getNumber(int a){system.out.print(a);}
}InnerClass  InnerClass  = new InnerClassImpl();
使用匿名内部类之后
InnerClass  InnerClass =  new InnerClass (){public int getNumber(int a){return a;}
}

特点:

  1. 匿名内部类是没有访问修饰符的。
  2. new 匿名内部类,这个类首先是要存在的。如果我们将那个InnerClass接口注释掉,就会出现编译出错。
  3. 注意getInnerClass()方法的形参,第一个形参是用final修饰的,而第二个却没有。同时我们也发现第二个形参在匿名内部类中没有使用过,所以当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
  4. 匿名内部类是唯一一种没有构造方法的类。
  5. 匿名内部类不能定义任何静态成员、方法和类。

5.使用内部类的原因:

  1. 可以实现多重继承。(不同的内部类可以继承不同的类)。
  2. 内部类可以更好的隐藏。
  3. 当我们不想写接口的实现或只是用一次对象时可以使用匿名内部类。
  4. 每个内部类都是一个单独的个体。

http://chatgpt.dhexx.cn/article/IEIfDLRv.shtml

相关文章

Java 静态内部类作用

需要了解2个概念:内部类和静态修饰符static 1)首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类。 2)静态都是用来修饰类的内部成员的。…

java内部类的四大作用

一、内部类的作用 我们为什么需要内部类?或者说内部类为啥要存在?其主要原因有如下几点: 内部类方法可以访问该类定义所在作用域中的数据,包括被 private 修饰的私有数据内部类可以对同一包中的其他类隐藏起来内部类可以解决java …

Flink--- 批处理 / 流处理

目录 Flink的主要特点 Flink 和 Spark Streaming 搭建maven工程 FlinkTutorial 添加Scala框架 和 Scala文件夹 Flink-批处理wordcount Flink---流处理wordcount Flink 是一个框架和分布式的处理引擎,用于对无界和有界数据流进行状态计算。 传统数据处理架构 事…

流数据处理利器

流处理 (Stream processing) 是一种计算机编程范式,其允许给定一个数据序列 (流处理数据源),一系列数据操作 (函数) 被应用到流中的每个元素。同时流处理工具可以显著提高程序员的开发效率,允许他们编写有效、干净和简洁的代码。 流数据处理在…

流处理(Stream)和批处理(Batch)

1 流处理和批处理的概念 在程序计算当中,同一节点或者不同节点之间的数据的传递是实时传递还是延迟传递,这就引出了两个概念。其实在非大数据领域这两个概念所起的作用也是很有限,但是在大数据领域,处理上亿级别的时候&#xff0…

管道模式 流处理

(一)介绍 管道这个名字源于自来水厂的原水处理过程。原水要经过管道,一层层地过滤、沉淀、去杂质、消毒,到管道另一端形成纯净水。我们不应该把所有原水的过滤都放在一个管道中去提纯,而应该把处理过程进行划分&#…

Flink流处理API大合集:掌握所有flink流处理技术,看这一篇就够了

大家好,我是百思不得小赵。 创作时间:2022 年 5 月 18 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1172天。觉得有帮助麻烦&#x…

Python流处理

转自 :https://www.toutiao.com/a6589000256896107015/?tt_frommobile_qq&utm_campaignclient_share&timestamp1534156143&appnews_article&utm_sourcemobile_qq&iid40708017633&utm_mediumtoutiao_ios&group_id6589000256896107015 F…

Stream流式处理

Stream流的三类方法 获取Stream:流创建一条流水线,并把数据放到流水线上准备。 中间方法:流水线上的操作一次操作完毕之后,还可以继续进行其他操作。 终结方法:一个Stream流只能有一个终结方法是流水线上的最后一个操作。 生成Stream流的…

流数据处理与分析

环境 名称 版本 系统 Ubuntu 18.04.4 LTS 内存 7.5GiB 处理器 Intel Core i7-8565U CPU 1.80GHz *8 图形 Intel UHD Graphics(Whiskey Lake 3*8 GT2) GNOME 3.28.2 操作系统类型 64位 磁盘 251.0 GB Storm 2.1.0 Zookeeper…

流处理系统

文章目录 引言如何发送事件流流处理不可靠的时钟容错总结 引言 清楚数据的类型有助于我们设计一个性能更高,更有针对性的数据系统,比如在线系统,离线系统(批处理)。近实时系统(流处理)等等。比如说批处理系统&#xf…

流处理简介

一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现。比如我们希望对一个包含整数的集合中筛选出所有的偶数,…

【节点流和处理流】

节点流和处理流 基本介绍 节点流可以从特定数据源读取数据,如FileReader、FileWriter处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一…

流数据处理

流数据处理strom 在2011年Storm开源之前,由于Hadoop的火红,整个业界都在喋喋不休地谈论大数据。Hadoop的高吞吐,海量数据处理的能力使得人们可以方便地处理海量数据。但是,Hadoop的缺点也和它的优点同样鲜明——延迟大&#xff0…

一. 流式处理简介

https://www.cnblogs.com/shenlanzhizun/p/6027042.html Java技术学习 https://www.itkc8.com 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助…

Kafka基础-流处理

1. 什么是流处理? 首先,让我们说一下什么是数据流(也称为事件流)?它是无边界数据集的抽象说法,无边界意味着无限且不断增长,因为随着时间的推移,新数据会不断地到来。 除了无边界的…

流处理基本介绍

1. 什么是流处理 一种被设计来处理无穷数据集的数据处理系统引擎 2. 流处理的几个概念 1. 无穷数据(Unbounded data):一种持续生成,本质上是无穷尽的数据集。它经常会被称为“流数据”。然而,用流和批次来定义…

Spark Streaming与流处理

一、流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中。应用程序根据需要查询数据或计算数据。这就是传统的静态数据处理架构。Hadoop 采用 HDFS 进行数据存储,采用 MapReduce 进行数据查询或分…

什么是流处理

流处理正变得像数据处理一样流行。流处理已经超出了其原来的实时数据处理的范畴,它正在成为一种提供数据处理(包括批处理),实时应用乃至分布式事务的新方法的技术。 1、什么是流处理? 流处理是不断合并新数据以计算结果…

嵌入式软件升级方法

一、U盘升级 1.在u盘根目录新建文件夹,命名为‘upgrade’ 2.将软件复制到upgrade文件夹中 3.将u盘插到嵌入式服务器usb口上,断电重启服务器 二、PC工具升级 1.打开PC工具,选中要升级的机器,点击‘素材管理’选项卡&#xff0c…