Java基础语法之内部类

什么是内部类

就是在一个类中又定义了另一个类

分类

实例内部类

即未被static修饰的内部类

1.外部类中的任何成员都可以在内部类里面直接访问,不管这个成员是什么权限

2.内部类对象的创建必须是在有外部类成员的前提下

这是错误的,那如何实例化呢?

先要有一个外部类对象,然后再实例化内部类对象,等号左边是这个对象的类型,即OutClass.InnerClass,等号右边则是通过外部类对象去实例化内部类对象

也可以按照下面的方式:

实际上,内部类也是外部类的一个普通成员变量,它是未被static修饰的成员变量,所以它的使用是要依赖外部类对象的

3.内部类里面不能有static修饰的变量,除非加上final

这是因为,内部类的实例必须要有外部类对象的帮助,而static是不依赖对象的

如果说可以有static修饰的成员,那我们就可以用内部类类名.变量来访问这个static变量,但是上面的第二点说了,内部类的加载是要依赖外部类对象的,也就是要想用这个内部类,就必须进行实例化,这就与我们的静态变量的初衷相违背了

但要想用static修饰,就要加上final,因为final修饰的变量会在编译时就被看作常量处理,直接用确定的值来替代,就免去了类加载这一个环节

4.内部类如何访问外部类的成员

当变量名不相同时,直接访问即可

当变量名相同时,要用到this,例如:在外部,a=111;在内部,a=1;下面代码:

会打印出:

为什么不是111呢?修改代码:

这是就可以打印出111了

这是因为,在内部类中隐藏了俩个this,一个时外部的,一个是内部的,这也是为什么对于不重名的变量,直接访问即可,而不需要通过外部类对象或类名来调用,其实就是有了this了,其实实际上this就是一个对象了

而对于外部类的方法,在内部类中也是用上面的方式来调用(不论是否是静态的):

5.外部类如何访问内部类的成员

因为内部类是外部类的一部分,所以直接在非静态方法中实例化一个内部类对象即可

但注意,如果这个外部类的方法是一个静态的,就无法实例化内部类对象了

这是因为,内部类对象的创建依赖外部类对象,如果是一个非静态方法,那么他就有一个隐藏的参数this表示外部对象的引用,但如果是一个静态的方法,就没有this参数,所以就无法对内部类对象进行实例化

静态内部类

被static修饰的内部成员类称为静态内部类

1.在静态内部类中不可以直接访问非静态的外部类成员

由于静态内部类是外部类的一个静态成员,它就和普通静态成员一样,是不依赖对象的,这就导致它的所有方法里面没有隐藏的this参数,所以就无法访问非静态的外部类成员变量和方法

那如何访问呢,只要实例化一个外部类对象即可

2.对于静态的外部类变量和方法,可以直接访问,既不需要实例化外部类对象,也不需要用类名来引出,不论这个内部类方法是否为静态方法

3.外部类的方法如何访问内部类成员

不论这个外部类方法是否为静态的,它要想访问内部类的非静态成员,就必须实例化内部类对象,因为非静态成员依赖对象

而不论这个外部类方法是否为静态的,它要想访问内部类的静态成员,不需要实例化内部类对象,只需要用类名引出即可

4.如何在外部类之外创建静态内部类对象

由于静态内部类同外部类的普通静态成员一样不依赖对象,所以只需要用类名引出即可,如下:

局部内部类

就是定义在外部类的方法体中或者{}中,它只能在对应的方法中使用,不能被static,public等访问修饰限定符修饰。

但注意,final不是访问修饰限定符,所以它可以被final修饰

匿名内部类

我们知道,对于一个接口,是不能直接实例化对象的:

但下面的方法却可以:

这实际上相当于创建了一个匿名对象,实现了IA接口,重写了它的方法

那如何调用这个重写的方法呢?

如上,可以用IA的引用来接收这个内部类对象,这实际上是向上转型,而在调用test方法时则发生了动态绑定

如上,也可以不接收,而是直接调用

其实不用匿名内部类,而是用局部内部类也可以,但不如匿名内部类简洁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人熟悉C语言,准备学习嵌入式,用得上吗?

今日话题,准备学习嵌入式,熟悉C语言用得上吗?C语言具有高效的性能和接近硬件的特性,因此在嵌入式开发中有着广泛的应用,包括系统级编程和驱动程序开发等方面。实际上,C语言在嵌入式开发中扮演着非常关键的角…

八股文打卡day3——计算机网络(3)

面试题:请讲一下四次挥手的过程? 1.客户端发送FIN数据包给服务器,表示客户端不再发送数据给服务器,想要断开这个方向的连接。 2.服务器收到客户端的FIN包之后,发送ACK包给客户端,对收到的FIN包进行收到确认…

大数据机器学习-梯度下降:从技术到实战的全面指南

大数据机器学习-梯度下降:从技术到实战的全面指南 文章目录 大数据机器学习-梯度下降:从技术到实战的全面指南一、简介什么是梯度下降?为什么梯度下降重要? 二、梯度下降的数学原理代价函数(Cost Function)…

VueStu01-Vue是什么

1.概念 Vue 是一个 用于构建用户界面 的 渐进式 框架 。 2.构建用户界面 基于数据渲染出用户看到的页面。 3.渐进式 Vue的学习是循序渐进的,可以学一点用一点,不必全部学完才能用。哪怕你只学了 声明式渲染 这一个小部分的内容,你也可以完成…

商业加速终极指南:创业家的10个关键步骤

多年来,前沿的初创企业一直在塑造整个行业,引入新技术、更精简的业务模式以及深受客户喜爱的开箱即用的产品。这不仅仅是一种短暂的趋势,而是我们的商业格局发生了根本性的转变,在这种情况下,率先抓住新的增长机遇可以…

ubuntu无 root 权限安装 screen

网上的方法主要是如下图的方法,源码安装,但是我一直 make install失败显示没有权限 然后选择放弃,然后随便试了一下方法 2,成功 方法 1 方法 2 pip3 install screen结果:

【软件工程】软件工程复习题库2023

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 SpringCloud MybatisPlus JVM 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 软件工程复习题库 一、选择题二、填空题三、判断题四…

AtCoder Beginner Contest 333 A~D(E,F更新中...)

A.Three Threes&#xff08;循环&#xff09; 题意&#xff1a; 给出一个正整数 N N N&#xff0c;要求输出 N N N个 N N N 分析&#xff1a; 按要求输出即可 代码&#xff1a; #include <bits/stdc.h> using namespace std;void solve() {int n;cin >> n;fo…

【C语言】自定义类型:结构体深入解析(一)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

springboot 学生信息管理

介绍 一个学生信息管理后台&#xff0c;适用于大作业&#xff0c;课设等 软件架构 springbootmybatisthymeleaf &#xff08;前后端未分离&#xff09; 安装教程 注&#xff1a;mysql数据库要8.0以上&#xff0c;&#xff0c;本地mysql新建一个名为 student 的空数据库&am…

open3d bug:pcd转txt前后位姿发生改变

1、open3d bug&#xff1a;pcd转txt前后位姿发生改变 open3d会对原有结果进行一个微小位姿变换 import open3d as o3d import numpy as np# 读取PCD点云文件 pcd o3d.io.read_point_cloud(/newdisk/darren_pty/zoom_centered_s2.pcd)# 获取点云坐标 points pcd.points# 指定…

4.1 媒资管理模块 - Nacos与Gateway搭建

文章目录 媒资管理模块 - 媒资项目搭建一、需求分析1.1 介绍1.2 数据模型1.3 分析网关 二、 搭建Nacos2.1 服务发现中心2.2.1 Maven2.2.2 配置Nacos 2.2 配置中心2.2.1 介绍2.2.2 Maven 坐标2.2.3 配置 content-api 工程2.2.4 配置 content-service 工程2.2.5 配置 system-api …

如何安装运行Wagtail并结合cpolar内网穿透实现公网访问网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

grafana基本使用

一、安装grafana 1.下载 官网下载地址&#xff1a; https://grafana.com/grafana/download官网包的下载地址&#xff1a; yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-10.2.2-1.x86_64.rpm官网下载速度非常慢&#xff0c;这里选择清华大…

Zotero 7 安装并彻底解决“无法安装插件。它可能无法与该版本的 Zotero 兼容“。以及解决“此翻译引擎不可用,可能是密钥错误“的问题

Zotero 7 安装并彻底解决"无法安装插件。它可能无法与该版本的 Zotero 兼容"。以及解决"此翻译引擎不可用&#xff0c;可能是密钥错误"的问题 &#xff01;&#xff01;&#xff01;不要直接在Zotero 6上安装翻译插件&#xff0c;将会版本不兼容&#xff0…

【python】飞机大战

import pygame import random# 敌机出现事件 ENEMY_EVENT pygame.USEREVENT # 发射子弹事件 FIRE pygame.USEREVENT 1class GameSprite(pygame.sprite.Sprite):def __init__(self, image_name, speed1):super().__init__()# 定义对象的属性self.image pygame.image.load(im…

使用IDEA创建springboot依赖下载很慢,解决方法

显示一直在resolving dependencies&#xff0c;速度很慢 原因&#xff1a;maven会使用远程仓库来加载依赖&#xff0c;是一个国外的网站&#xff0c;所以会很慢。应该使用阿里云的镜像&#xff0c;这样速度会提升很多。 步骤&#xff1a;1.右击pom.xml&#xff0c;选择"m…

MFC 窗口创建过程与消息处理

目录 钩子简介 代码编写 窗口创建过程分析 消息处理 钩子简介 介绍几个钩子函数&#xff0c;因为它们与窗口创建工程有关 安装钩子函数 HHOOK SetWindowsHookExA([in] int idHook,[in] HOOKPROC lpfn,[in] HINSTANCE hmod,[in] DWORD dwThreadId ); 参数说明…

前端常见面试题之html和css篇

文章目录 一、html1. 如何理解html语义化2. 说说块级元素和内联元素的区别 二、css1. 盒模型的宽度offsetWidth如何计算2. box-sizing:border-box有什么用3. margin的纵向重叠问题4. 谈谈你对BFC的理解和应用5. 清除浮动有哪些方式6. 使用flex布局实现骰子37.position的absolut…

喜报!巨蟹数科荣获国家“高新技术企业”认定!

根据《高新技术企业认定管理办法》&#xff08;国科发火〔2016〕32 号&#xff09;和《高新技术企业认定管理工作指引》&#xff08;国科发火〔 2016〕195号&#xff09;有关规定&#xff0c;经省高新技术企业认定管理机构组织企业申请、专家评审等程序&#xff0c;并经全国高新…