内部静态类和非内部静态类的区别

目录

问题:

原理:

外部类与非内部静态类

外部类与静态内部类

加载顺序

总结:

1.非静态内部类依赖于外部类的实例,而静态内部类不依赖于外部类的实例。

2.非静态内部类可以访问外部类的实例变量和方法,而静态内部类只能访问外部类的静态成员。

3.非静态内部类不能定义静态成员,而静态内部类可以定义静态成员。

4.非静态内部类在外部类实例化后才能实例化,而静态内部类可以独立实例化。

5.非静态内部类可以访问外部类的私有成员,而静态内部类不能直接访问外部类的私有成员,需要通过实例化外部类来访问。


问题:

刷完面经,以写博客输出的方式加深面经理解,特此记录。

原理:

从内存的角度更能理解的透彻一些

外部类与非内部静态类

  •  非内部静态类实例和外部静态类实例是两个独立的对象,它们分别在堆内存中分配空间。
  • 但是,非内部静态类实例隐式持有一个指向外部实例的引用(也就是指针或者说是地址),这个引用是编译器自动生成的。
  • 非内部静态类有了外部类的this,那当然可以访问外部类的实例变量,
  • 当然也可也访问静态变量,这里要特别注意,即使没有外部类的this,也可也通过类名访问。

外部类与静态内部类

  • 外部类与静态内部类,二者之间没啥关系,可以相互独立存在。
  • 只是,语法上我们把它俩放在了一块。只是逻辑上的内部与外部,这里一定要理解清楚。
  • 说白了,外部类与非内部静态类,是真的存在内外的关系,
  • 而外部类与静态内部类,只是把一个静态类放在了一个类里面,因为有非内部静态类这样的称呼,所以我们也就把(一个静态类放在了一个类里面)这样的情况叫做 静态内部类
  • 它的生命周期独立于外部类实例。

加载顺序

  • 先加载外部类,后加载内部类,因为内部类必须得拿到外部类的引用才行。
  • 静态内部类和外部类二者独立,谁被用到,谁就被加载。

总结:

如果你理解了上面从内存角度的问题,那么接下来这些案例,你都可以从这个角度想通了。

1.非静态内部类依赖于外部类的实例,而静态内部类不依赖于外部类的实例。

原因:

只有外部类实例化后,非内部静态类才能拿到内部类的引用,而静态内部类和外部类二者独立,所以不需要进行实例化后才能拿到引用。

class OuterClass {private String outerField = "Outer Field";class NonStaticInnerClass {void display() {System.out.println(outerField); // 可以直接访问外部类的实例变量}}
}public class Main {public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.NonStaticInnerClass inner = outer.new NonStaticInnerClass();inner.display(); // 输出:Outer Field}
}class OuterClass {private static String staticOuterField = "Static Outer Field";static class StaticInnerClass {void display() {System.out.println(staticOuterField); // 可以访问外部类的静态成员}}
}public class Main {public static void main(String[] args) {OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();staticInner.display(); // 输出:Static Outer Field}
}

2.非静态内部类可以访问外部类的实例变量和方法,而静态内部类只能访问外部类的静态成员。

原因:内存区域不一样,而且非静态内部类有外部类的引用,静态内部类与外部类独立,静态内部类单独存储在别的区域。

class OuterClass {private String outerField = "Outer Field";class NonStaticInnerClass {void display() {System.out.println(outerField); // 可以访问外部类的私有实例变量}}
}class OuterClass {private String outerField = "Outer Field";private static String staticOuterField = "Static Outer Field";static class StaticInnerClass {void display() {// System.out.println(outerField); // 编译错误:无法访问实例成员System.out.println(staticOuterField); // 可以访问静态成员// 如果需要访问实例成员,必须通过外部类实例OuterClass outer = new OuterClass();System.out.println(outer.outerField);}}
}

3.非静态内部类不能定义静态成员,而静态内部类可以定义静态成员。

原因:静态成员需要在类加载时就存在,并且不依赖于任何实例,但是非静态内部类需要在外部类加载后才可以,所以不行。

如果你问我为什么不解释静态内部为甚可以定义静态成员,你白看了兄弟!。

class OuterClass {class NonStaticInnerClass {// static int staticField = 10; // 编译错误:非静态内部类不能定义静态成员// static void staticMethod() {} // 编译错误}
}class OuterClass {static class StaticInnerClass {static int staticField = 10; // 允许定义静态成员static void staticMethod() {System.out.println("This is a static method.");}}
}public class Main {public static void main(String[] args) {System.out.println(OuterClass.StaticInnerClass.staticField); // 输出:10OuterClass.StaticInnerClass.staticMethod(); // 输出:This is a static method.}
}

4.非静态内部类在外部类实例化后才能实例化,而静态内部类可以独立实例化。

前面都解释过了,略。

class OuterClass {class NonStaticInnerClass {}
}public class Main {public static void main(String[] args) {OuterClass outer = new OuterClass();OuterClass.NonStaticInnerClass inner = outer.new NonStaticInnerClass();}
}class OuterClass {static class StaticInnerClass {}
}public class Main {public static void main(String[] args) {OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();}
}

5.非静态内部类可以访问外部类的私有成员,而静态内部类不能直接访问外部类的私有成员,需要通过实例化外部类来访问。

class OuterClass {private String privateField = "Private Field";class NonStaticInnerClass {void display() {System.out.println(privateField); // 可以访问外部类的私有成员}}
}class OuterClass {private String privateField = "Private Field";static class StaticInnerClass {void display() {// System.out.println(privateField); // 编译错误:无法直接访问私有成员OuterClass outer = new OuterClass();System.out.println(outer.privateField); // 通过实例访问}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis分布式锁的实现(Redission)

写在前面 本人在学习Redis过程中学习到分布式锁时太多困惑和疑难杂点 需要总结梳理思路 以下思路都是最简单最基本的思路 主要用到Redission工具类 会涉及到看门狗机制等 本文内容部分引自Javaguide,小林coding等热门八股 用于个人学习用途 分布式锁介绍 对于单机多线程来说…

【愚公系列】《Python网络爬虫从入门到精通》038-SQLite数据库

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

【开源免费】基于SpringBoot+Vue.JS网络海鲜市场系统(JAVA毕业设计)

本文项目编号 T 222 ,文末自助获取源码 \color{red}{T222,文末自助获取源码} T222,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

JDK17安装方法/如何安装JDK17/环境变量配置

双击安装 我们这里安装jdk17 然后更改jdk目录 jdk环境变量配置 右键——>此电脑——>高级系统设置——>环境变量 当前用户的环境变量,另外有一个系统变量。 一般我们配置系统环境变量 一、配置JAVA_HOME 这里我们配置一个JAVA_HOME 我这里先前的jdk…

python集合set的常用方法

目录 集合的定义 集合的基础操作 多个集合之间的操作 集合的for循环 集合的定义 集合的基础操作 集合.add(元素) 添加新元素 集合.pop() 从集合中随机取出一个元素 集合.clear() 清空集合 集合.remove(元素) 移除元素 #定义集合,集合自动去重了 set1{"春"…

看得见摸得着的AI:具身智能

“如果Siri有手有脚,你的生活会变成什么样?” 想象一下: • 你家的扫地机器人不再横冲直撞,而是像猫咪一样轻巧绕过桌脚 • 手机里的语音助手能“摸”到你发烧的额头,主动帮你叫医生 • 工厂里的机械臂会边干活边学习&…

ES、OAS、ERP、电子政务、企业信息化(高软35)

系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…

【算法学习之路】4.简单数论(4)

简单数论(4) 前言三.高精度1.什么是高精度2.解决办法 精度乘除法一.精度乘法1.数据的存储2.步骤3.例题:高精度乘法 二.精度除法1.例子2.步骤3.例题:高精度除法 前言 我会将一些常用的算法以及对应的题单给写完,形成一套…

Linux 动静态库和_make_进度条(一)

文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…

基于springboot+vue的拖恒ERP-物资管理

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Leetcode-853. Car Fleet [C++][Java]

目录 一、题目描述 二、解题思路 Leetcode-853. Car Fleethttps://leetcode.com/problems/car-fleet/description/ 一、题目描述 There are n cars at given miles away from the starting mile 0, traveling to reach the mile target. You are given two integer array …

Vue核心知识:动态路由实现完整方案

在Vue中实现动态路由,并结合后端接口和数据库表设计,是一个复杂的项目,需要多个技术栈和步骤的配合。以下将详细描述整个实现过程,包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…

CMU15445(2023fall) Project #4 - Concurrency Control踩坑历程

把树木磨成月亮最亮时的样子, 就能让它更快地滚下山坡, 有时会比骑马还快。 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering…

天疱疮是一种慢性、严重的皮肤疾病

天疱疮是一种慢性、严重的皮肤疾病,对患者的日常生活带来很大的困扰。为了更好地预防天疱疮的发生,我们需要了解其成因及传播途径,并采取相应的预防措施。以下是关于天疱疮预防的小知识。 一、了解天疱疮 天疱疮是一种自身免疫性疾病&#…

神经网络代码入门解析

神经网络代码入门解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 数据生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩阵相乘再加bnoise torch.normal(0, 0.01, y.shape) # 为y添加噪声…

解决android studio(ladybug版本) gradle的一些task突然消失了

今天不知道干了啥,AS(ladybug版本)右边gradle的task有些不见了,研究了半天解决了,这里记录下: 操作: File -->Settings-->Experimental--> 取消选项“Enable support for multi-vari…

软件测试之白盒测试知识总结

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 概念与定义 白盒测试:侧重于系统或部件内部机制的测试,类型分为分支测试(判定节点测试)、路径测试、语句测试…

Unity中动态切换光照贴图的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…

LLC谐振变换器恒压恒流双竞争闭环simulink仿真

1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换)针对全桥LLC拓扑,利用Matlab软件搭建模型,分别对轻载&#xf…

网络变压器的主要电性参数与测试方法(2)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…