内部类详解————静态内部类

内部类三连击:

《内部类详解————匿名内部类》

《内部类详解————局部内部类》

《内部类详解————静态内部类》

定义

静态内部类,又叫静态嵌套类或嵌套类。是使用static关键字修饰的内部类

静态内部类可以用 private 修饰,这非常符合良好的OOM设计。并且由于嵌套类被认为是外部类的一部分,所以不存在产生不可见问题。——《数据结构与算法分析—Java语言描述》p50

书写形式

一般的书写形式:

public class Outter {/** 嵌套类,public等四种访问修饰符均可修饰*/public static class Inner {/** 嵌套类内部*/}
}

接口中的书写形式:

public interface OutInterface {/** 嵌套类,在接口中定义的任何类都自动的是public和static的,因此这两个关键字都可以省略*/class Inner {public void print() {System.out.println("print()");}}
}

嵌套类的语法规则

规则一:不能从嵌套类中访问外部类的非静态成员。这一点与Java基础语法中对静态非静态语法的相关描述完全一致。

规则二:与普通内部类不同,嵌套类实例化不需要依赖外部类对象,而普通的内部类对象需要与外部类的对象有一种绑定关系。

public class Outter {/** 嵌套类*/public static class Inner {}public static void main(String[] args) {Outter.Inner inner = new Inner();}
}

规则三:与普通内部类的区别如下:

普通内部类只能包含非静态变量非静态方法非嵌套类

静态嵌套类可以包含静态和非静态变量静态和非静态方法静态和普通内部类

注意:“嵌套类中包含”与规则一中的“嵌套类中访问”是不同的含义,区别在于“访问”是嵌套类中调用嵌套类之外定义的成员,而“包含”则表示在嵌套类中定义)

规则四:嵌套类可以定义在接口中,并作为接口的一部分来使用。

《Java编程思想》(第四版,P203)

如果你想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用,那么使用接口内部的嵌套类会显得很方便。

代码实例:

/** 接口*/
public interface OutInterface {void method_1();void method_2();/** 嵌套类*/class Inner {public void print() {System.out.println("print something...");}}
}
/** 实现类 */
public class OutInterfaceImpl implements OutInterface {private OutInterface.Inner inner = new Inner();@Overridepublic void method_1() {inner.print();}@Overridepublic void method_2() {inner.print();}public static void main(String[] args) {OutInterface oif = new OutInterfaceImpl();oif.method_1();oif.method_2();}
}

输出结果:

print something...
print something...

规则五:静态内部类不会在外部类加载时也执行类加载。这一点可以应用于单例模式。

总之,静态内部类可以具有一个普通类的所有特性,本质上他们并无二致,而且还可以通过访问修饰符如private等,来控制访问权限。

综上,就是静态嵌套类的详细使用,其中需要注意的问题,已经列在规则中,经过博主实操,大概也就这些内容,如有疑问和建议,欢迎文末留言。:)

 

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

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

相关文章

jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

jvm gc(垃圾回收机制) Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程)作者:知乎用户 链接:https:…

【Mathematical Model】Ransac线性回归Python代码

Ransac算法,也称为随机抽样一致性算法,是一种迭代方法,用于从一组包含噪声或异常值的数据中估计数学模型。Ransac算法特别适用于线性回归问题,因为它能够处理包含异常值的数据集,并能够估计出最佳的线性模型。 1 简介 …

异常解析————Parameter metadata not available for the given statement

引言 在将数据存入mysql数据库时抛出异常:Parameter metadata not available for the given statement。参数元数据对于给定的声明不可用。 SQL本身并没有错误: Autowiredprivate JdbcTemplate jdbc;public Integer saveScenicSequence(ScenicSequence…

Java中HashMap的常用操作

Java中HashMap的常用操作HashMap<Integer, Integer> hashMap new HashMap<>();hashMap.put(5, 2);hashMap.put(9, 2);hashMap.put(8, 1);hashMap.put(7, 3);hashMap.put(16, 1);hashMap.put(10, 2);hashMap.put(6, 2);//其实下面两个键值对是没有存的hashMap.put(…

MySQL忽略主键冲突,避免重复插入数据的三种方式

方案一&#xff1a;ignore 插入时检索主键列表&#xff0c;如存在相同主键记录&#xff0c;不更改原纪录&#xff0c;只插入新的记录。 INSERT IGNORE INTO ignore关键字所修饰的SQL语句执行后&#xff0c;在遇到主键冲突时会返回一个0&#xff0c;代表并没有插入此条数据。…

SQL分页查询的介绍以及好处~~

SQL分页查询的介绍以及好处~~分页查询就是将过多的结果在有限的界面上分多页来显示&#xff0c;一般将分页查询分为两类&#xff1a; 逻辑分页、物理分页。 逻辑分页是在用户第一次访问时&#xff0c;将数据库的所有记录全部查询出来&#xff0c;添加到一个大集合中&#xff0c…

Swagger使用————接口参数注解的使用缺陷

问题描述 在使用springboot开发web项目时&#xff0c;用到了swagger框架&#xff0c;来生成web api文档。但是其中有一项是举例说明参数的结构&#xff0c;如下图&#xff1a;但是&#xff0c;这个功能真的是非常方便&#xff0c;因为可以让前端开发人员第一时间得知参数的内部…

分布式事务最终一致性常用方案

分布式事务最终一致性常用方案目前的应用系统&#xff0c;不管是企业级应用还是互联网应用&#xff0c;最终数据的一致性是每个应用系统都要面临的问题&#xff0c;随着分布式的逐渐普及&#xff0c;数据一致性更加艰难&#xff0c;但是也很难有银弹的解决方案&#xff0c;也并…

数据列表的分页实现————分页敏捷开发

概要 分页功能是比较常见的基础功能&#xff0c;虽然比较简单&#xff0c;但是每次需要用到这个功能的时候还是需要现写一遍。为了实现更加宏观的业务复用&#xff0c;特将本人特别喜欢的简易分页逻辑在此记述&#xff0c;以备日后重用。 逻辑描述 一般的分页实现方式多是通…

Java基础————理解Integer对象的缓存策略

一个简单的面试题public static void main(String[] args) {Integer in1 100;Integer in2 100;Integer in3 200;Integer in4 200;System.out.println(in1 in2);System.out.println(in3 in4);} 运行结果&#xff1a; true false 从自动装箱谈Integer缓存 上述面试题中&…

Java面试日常总结大杂烩

日常总结大杂烩&#xff1a;一。 取出特定行数的数据1. select* from 表名 limit m,n; 2. select * from 表名 limit [offset,] rows;1. m代表从m1条记录行开始检索&#xff0c;n代表取出n条数据。&#xff08;m可设为0&#xff09;如&#xff1a;select * from表名 limit 6,5…

Eclipse深度患者设置VSCode快捷键

VSCode设置Eclipse中常用的快捷键 将eclipse中一些基本的快捷键输入右侧用户快捷键设置中&#xff1a; // Place your key bindings in this file to overwrite the defaults [{ "key": "alt/", "command": "editor.action.triggerSugges…

Java基础日常总结!!

Java基础日常总结&#xff01;&#xff01;1. Java的字符类型采用的是Unicode编码方案&#xff0c;每个Unicode码占用( )个比特位 在java中一个unicode占2个字节&#xff08;byte&#xff09;.一个字节等于8比特位&#xff08;bit&#xff09;.所以每个Unicode码占用 16 个比特…

NodeJS学习————关于let和const命令的使用理解

let的基本用法 在新的js规范ES6中&#xff0c;新增了let 命令&#xff0c;用来声明变量。用法类似于var&#xff0c;但不同的是所声明的变量&#xff0c;只在let 命令所在的代码块内有效。 { let a 10; var b 10; } //ReferenceError: a is not defined console.log(a …

forward和redirect的区别是什么?

forward和redirect是什么&#xff1f; 是servlet种的两种主要的跳转方式。forward又叫转发&#xff0c;redirect叫做重定向。 区别&#xff1a;&#xff08;本地效应次数&#xff09; 地址栏&#xff0c;数据共享&#xff0c;应用场景&#xff0c;效率&#xff0c;本质&…

MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

一、MySQL索引类型 MySql常见索引类型有&#xff1a;主键索引、唯一索引、普通索引、全文索引、组合索引 PRIMARY KEY&#xff08;主键索引&#xff09; ALTER TABLE table_name ADD PRIMARY KEY ( column ) UNIQUE(唯一索引) ALTER TABLE table_name ADD UNIQUE (colu…

Servlet入门总结

一、了解Servlet的概念Servlet定义&#xff1a;Servlet是基于Java技术的Web组件&#xff0c;由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。 注意&#xff1a;Servlet不是从…

MySQL日期类型的处理总结

一、概述 MySQL中的日期类型包括以下5种&#xff1a; 类型大小 (字节)范围格式用途DATE31000-01-01/9999-12-31YYYY-MM-DD日期值TIME3-838:59:59/838:59:59HH:MM:SS时间值或持续时间YEAR11901/2155YYYY年份值DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:…

详解HTTP协议~~~

详解HTTP协议~~~HTTP 简介HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。。HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;…

MyBatis基础知识概述

一、依赖配置 添加依赖即可&#xff0c;jar包或pom依赖&#xff1a; <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version> </dependency> 二、SqlSessionFactory 2.1 什…