Java——内部类

news2024/9/25 3:28:57

一、成员内部类

类中的东西都是成员,
在这里插入图片描述

1.1、成员内部类定义

定义成员内部类的格式:

class OuterClass {//外部类
	class InnerClass{//内部类(内部类实际是外部类的一个属性)
	
	}
}

示例

public class Outer {

    private static int radius = 1;
    private int count =2;

    class Inner {
        public void visit() {
            System.out.println("visit outer static variable:" + radius);
            System.out.println("visit outer variable:" + count);
        }
    }

    public static void main(String[] args) {
        Outer outer =new Outer();
        Outer.Inner inner = outer.new Inner();

        inner.visit();
    }
}

//输出
visit outer static variable:1
visit outer variable:2

编译上述代码会产生两个class文件:Outer.class和Outer$Inner.class。

创建内部类对象的格式:
外部类 outer = new 外部类();
外部类.内部类 inner = outer.new 内部类();

1.2、使用 this 关键字获取内部类与外部类的引用

如果在外部类中定义的成员变量与内部类的成员变量名称相同,可以使用 this 关键字。

public class TheSameName {
	private int x = 7; // 外部类的x

	private class Inner {
		private int x = 9;// 内部类的x

		public void doit() {
			int x = 11; // 局部变量x
			this.x++; // 调用内部类的x
			TheSameName.this.x++; // 调用外部类的x
		}
	}
}

二、匿名内部类

匿名内部类就是没有名字的内部类

2.1、继承式的匿名内部类

public class Car {
    public void drive(){
        System.out.println("Driving a car!");
    }
    
    public static void main(String[] args) {
        Car car = new Car(){
            public void drive() {
                System.out.println("Driving another car!");
            }
        };
        car.drive();
    }
}

//输出
Driving another car!
  • 匿名内部类不能有构造方法。
  • 匿名内部类不能定义任何静态成员、静态方法。
  • 匿名内部类不能是public,protected,private,static。
  • 只能创建匿名内部类的一个实例。
  • 一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
  • 因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。

2.2、接口式的匿名内部类

interface Vehicle {
    public void drive();
}

class Test{
    public static void main(String[] args) {
        Vehicle v = new Vehicle(){
            public void drive(){
                System.out.println("Driving a car!");
            }
        };
        v.drive();
    }
}

//输出
Driving a car!

2.3、参数式的匿名内部类

class Bar{
    void doStuff(Foo f){
        f.foo();
    }
}

interface Foo{
    void foo();
}

class Test{
    static void go(){
        Bar b = new Bar();
        b.doStuff(new Foo(){
            public void foo(){
                System.out.println("foofy");
            }
        });
    }
}

2.4、抽象式的匿名内部类

abstract class Dog {
	String Color;

	public abstract void move();

	public abstract void call();
}

public class Demo {
	public static void main(String args[]) {
		Dog maomao = new Dog() {
			public void move() {
				System.out.println("四腿狂奔");
			}

			public void call() {
				System.out.println("嗷呜~");
			}
		};
		maomao.Color = "灰色";
		maomao.move();
		maomao.call();
	}
}

三、方法内部类

把类放在方法内

class Outer {
    public void doSomething(){
        final int a =10;
        class Inner{
            public void seeOuter(){
                System.out.println(a);//只能使用该内部类所在方法的final局部变量
            }
        }
        Inner in = new Inner();//方法内部类只能在定义该内部类的方法内实例化
        in.seeOuter();
    }
    public static void main(String[] args) {
        Outer out = new Outer();
        out.doSomething();
    }
}

//输出
10

(1)、方法内部类只能在定义该内部类的方法内实例化,不可以在此方法外对其实例化。
(2)、方法内部类对象不能使用该内部类所在方法的非final局部变量。

四、静态内部类

class Outer {
    private static int radius = 1;

    static class StaticInner {
        public void visit() {
            System.out.println("visit outer static variable:" + radius);
        }
    }
    
     public static void main(String[] args){
         Outer.StaticInner inner = new Outer.StaticInner();
         inner.visit();
     }
}

//输出
visit outer static variable:1

静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;

静态内部类的创建方式:
外部类.静态内部类 内部类名 = new 外部类.静态内部类(),
如下: Outer.StaticInner inner = new Outer.StaticInner();

五、为什么需要内部类

内部类(Inner Class)是指在一个类的内部定义的另一个类。在Java中,内部类可以嵌套在其他类中,在外部类的成员变量和方法中,可以直接访问内部类的成员,包括私有成员。以下是使用内部类的几个常见的理由:

  1. 封装和隐藏:内部类可以将类隐藏在其他类的内部,只对外部类可见。这可以实现更好的封装性和模块化,隐藏内部类的实现细节,仅暴露必要的接口。

  2. 访问外部类的成员:内部类可以直接访问外部类的成员,包括私有成员。这有助于实现更紧密的类之间的关系,方便数据共享和操作。

  3. 实现多重继承:内部类可以在不引入多重继承的情况下实现多个接口,提供更灵活的设计选择。一个类可以实现多个接口,并且每个接口都可以有其自己的内部类,从而实现多重功能的组合。

  4. 回调和事件处理:内部类常常用于实现回调和事件处理机制。例如,一个窗口类可以定义一个内部类来处理按钮的点击事件,内部类可以直接访问外部类的成员和方法,方便事件处理。

  5. 代码组织和逻辑清晰:内部类可以将相关的类组织在一起,使代码更具可读性和可维护性。当内部类与外部类之间具有紧密的关系时,使用内部类可以提高代码的可读性,并且逻辑更清晰。

需要注意的是,内部类并不是必需的,很多情况下都可以通过其他方式来达到相同的效果。内部类的使用应该根据具体的需求和情况来决定,合理地使用内部类可以带来更灵活、更清晰的代码结构。

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

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

相关文章

使用Selenium-PO设计模式提高Web自动化测试效率

PO(page object)设计模式是在自动化中已经流行起来的一种易于维护和减少代码的设计模式。在自动化测试中,PO对象作为一个与页面交互的接口。测试中需要与页面的UI进行交互时,便调用PO的方法。这样做的好处是,如果页面的…

.Net之AOP - 使用Fody的代码静态编织实现AOP

简介(好久没写博客了) 万物皆可AOP,本篇文章主要讲解在.Net7中使用Fody的代码静态编织实现AOP。 一、前言 AOP AOP是指面向切面编程 (Aspect Oriented Programming),相信大家都再熟悉不过了,…

上海市“小巨人”竞争力指数榜单发布!上海三思居全市总榜第四!分项NO.1!

6月25日下午,2022 年上海市专精特新“小巨人”市场竞争力指数榜单”在上海市上海联合产权交易所正式发布。上海三思电子工程有限公司多项荣登指数榜单: ●指数总榜TOP10,上海三思以83.69的高分位居全市8072家“小巨人”企业第四位&#xff0…

军用电子设备人工智能时代正在到来

源自: 战略前沿技术 Al的应用快速增长 更大的图景 人工智能技术的多面性 增强作战人员能力 数据依赖 人工智能和机器学习:前面的路 对人工智能应用保持警惕 声明:公众号转载的文章及图片出于非商业性的教育和科研目的供大家参考和探讨,并不意味着支持其观…

vue+elementui实现联想购物商城,样式美观大方

目录 一、首页效果图对比 1.联想商城首页截图: 2.作者项目效果图: 二、商品详情效果图对比 1.联想官方截图: 2.作者项目截图: 三、项目实现 1.数据分离维护 2.首页推荐列表数据处理 3.商品详情数据动态获取完成交互 4.商品详…

MySQL原理探索——20幻读

20 幻读是什么?幻读会造成什么后果? 在上一篇文章最后,遗留了一个关于加锁规则的问题。今天,我们就从这个问题说起。 为了便于说明问题,这篇文章,我们就先使用一个小一点的表。建表和初始化语句如下&#…

【MySQL】MySQL PHP 语法,PHP MySQL 简介,查询,下载 MySQL 数据库, SQL 教程

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

探究Vue源码:mustache模板引擎(4) 了解mustache转换概念,简述tokens转换

上文 探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路我们用正则表达式构建了一个简易版的render模板编译函数 但是 我们有特意强调过 mustache的render函数并非用简单正则实现的 因为这样无法实现循环和一些比较复杂的逻辑处理 它的实现基理可以参考这…

Ubuntu系统安装JDK教程

今天新买了一台阿里云服务器,因为centos 不提供了更新支持,所以Linux系统选择了Ubuntu 系统,今天就出一期 Ubuntu上安装的一系列教程,今天就先从JDK开始。 Ubuntu系统安装JDK教程 1、 jdk下载2、安装 lrzsz 命令 (仅限…

FreeRTOS_系统内核控制函数

目录 1. 系统内核控制函数预览 2. 系统内核函数详解 2.1 函数 taskYIELD() 2.2 函数 taskENTER_CRITICAL() 2.3 函数 taskEXIT_CRITICAL() 2.4 函数 taskENTER_CRITICAL_FROM_ISR() 2.5 函数 taskEXIT_CRITICAL_FROM_ISR() 2.6 函数 taskDISABLE_INTERRUPTS() 2.7 函数…

1. 数字mic驱动分析

一般遇到的音频硬件都是这样的 由于项目不需要播放只需要录音,于是将模拟的mic换成了数字mic,直接通过i2s连接到soc 由于还要使用alsa架构进行录音,所以这里不能简单的写个代码读i2s数据,需要虚拟出一个codec 上面就是我们这次要分…

第九十六天学习记录:Linux基础:实用操作Ⅰ

注:第一张图与学习记录无关,是为了参与CSDN的AI绘图活动 CtrlC强制停止 1、Linux某些程序的运行,如果想要强制停止它,可以使用快捷键CtrlC中止 2、在命令输入错误时,也可以通过快捷键CtrlC快速退出当前输入 CtrlD…

projection介绍及EPSG:4326和EPSG:3857的投射转换

每个地图数据在Web端加载显示时,都需要设罝其投影坐标系。众所周知,地图是不规则的椭球体,如果我们将其展开到二维平面上,会发现地图与实际情况有出入。所以,人们提出 投影的方式来尽量减小失真的程度。 openlayers的…

技术驱动美丽:动态贴纸与美颜SDK的应用实践与创新

随着科技的迅速发展,智能手机的普及以及社交媒体的兴起,人们对于美颜和创意贴纸的需求日益增长。动态贴纸和美颜技术的应用已经成为当今互联网时代的一种趋势。本文将重点讨论动态贴纸与美颜SDK的应用实践与创新,探讨它们对美容美妆行业和社交…

运维必学 | 变量定义调用-从零开始学Windows批处理(Batch)编程系列教程

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习! 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折,莫待无花空折枝。 ” 作者主页&#xff1…

vue中如何封装一个基础组件---demo

在 Vue 中封装基础组件可以提高代码的可复用性和维护性,使开发过程更高效。下面是封装基础组件的一般步骤: 确定组件功能:首先确定要封装的基础组件的功能和用途。基础组件通常是具有单一功能的,可以在不同的项目中多次使用的组件…

【C++初阶】C++入门——缺省参数、函数重载

目录 一、缺省参数1.1 定义1.2 缺省参数分类1.3 缺省参数只能出现在函数声明中 二、函数重载2.1 定义2.2 构成重载的几种情况2.3 C支持函数重载的原理 一、缺省参数 1.1 定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实…

下一代Windows被披露,任何硬件都能运行

这么些年来,微软似乎一直没能打破 Windows 系统隔代香魔咒。 继 Win XP 惊艳世界后 Win Vista 表现平平,到 Win 7 引领一个时代; 接着 Win 8 含泪淹没在前代耀眼光环之下,直到 Win 10 再创辉煌成功走入家家户户。 而最新的 Win …

vue-antd-admin——关闭当前页面,跳转到指定页面——bus事件总线的用法

最近在写后台管理系统时,遇到一个需求: 关闭当前页面,然后跳转到指定页面。 具体实现方法如下: 1.tabsView.vue文件中添加bus文件,并实现跨组件之间的监听 1.1 引入bus文件 import Bus from /utils/bus; bus文件内…

C#winform自定义圆角按钮控件

本篇介绍自定义圆角渐变按钮,实现过程,实现效果如下 创建winform项目,添加组件类控件 修改的名称为ButtonEx,并点击添加 修改cs中的代码 using System; using System.ComponentModel;using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms;…