背景

开发新项目,写Swager的mode的时候用到了嵌套Model,于是在代码中,出现了静态内部类。在codeReview的时候稍微和大家聊了一下。尤其是Static 修饰类和修饰对象和变量不一样呢?

定义

1. 内部类

  • 可以将一个类的定义放在另一个类的定义内部,这就是内部类;
  • 嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的也是如此。静态嵌套类无权访问封闭类的其他成员。为一体的一个部件OuterClass,一个嵌套类可以声明private,public,protected,或包专用。(回想一下,只能声明外部类public或将其包装为私有。)

2. 静态内部类

  • 再一个普通类里面,给内部类加上static关键字的修饰;
  • 与类方法和变量一样,静态嵌套类与其外部类相关联。与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们。(就和两个普通不同的类之间的使用)

3. 两者的区别

  • 内部类只是外部类的成员变量,通俗讲,就是你只能通过先调用外部类才能去拿到这个类(但是这是和组合还是有区别的)。
  • 但是静态内部类就像是一个普通类一样。可以直接调用,直接去new对象。

4. Java 拥有嵌套类有什么作用呢?

  • 这是一种对仅在一个地方使用的类进行逻辑分组的方法:如果一个类仅对另一个类有用,那么将其嵌入该类并将两者保持在一起是合乎逻辑的。嵌套此类“帮助程序类”可使它们的程序包更加简化。
  • 它增加了封装:考虑两个顶级类A和B,其中B需要访问A的成员,否则将对其进行声明private。通过将类B隐藏在类A中,可以将A的成员声明为私有,而B可以访问它们。另外,B本身可以对外界隐藏。
  • 这可能会导致代码更具可读性和可维护性:在顶级类中嵌套小类会使代码更靠近使用位置。

Demo

  • talk is cheap ,Show me Code;
package 静态内部类;import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import javassist.runtime.Inner;
import lombok.Data;/*** @authoryuanxindong* @date: 2020/6/19 10:25 下午*/
@Data
public class OuterClassDemo {String outerStr;public OuterClassDemo(String outerStr) {this.outerStr = outerStr;}@Datapublic static class StaticInnerClass{public StaticInnerClass(String innerStr) {this.innerStr = innerStr;}private  String  innerStr;}@Datapublic class InnerClass{private String innerClassStr;public InnerClass(String outerStr) {//可以和外部类通讯this.innerClassStr = getOuterStr();}}public static void main(String[] args) {OuterClassDemo staticClassDemo =new OuterClassDemo("Outer");staticClassDemo.getOuterStr();// 内部正常类是不能直接new出来的//  OuterClass outerClass = new OuterClass();StaticInnerClass innerClass = new StaticInnerClass("StaticInner");System.out.println(innerClass.getInnerStr());initInnerClass();}public static void initInnerClass(){OuterClassDemo staticClassDemo1 = new OuterClassDemo("OuterClassDemo");InnerClass innerClass = staticClassDemo1.new InnerClass("outerStr");System.out.println(innerClass.getInnerClassStr());}
}

注意事项

  • 序列化强烈建议不要对内部类(包括 本地和 匿名类)进行序列化。当Java编译器编译某些构造(例如内部类)时,它会创建综合构造。
  • 这些是类,方法,字段以及其他在源代码中没有相应构造的构造。合成构造使Java编译器无需更改JVM就可以实现新的Java语言功能。但是,合成构造在不同的Java编译器实现中可能有所不同,这意味着.class文件在不同的实现中也可能有所不同。因此,如果序列化一个内部类,然后使用其他JRE实现对其进行反序列化,则可能会遇到兼容性问题。

核心讨论

  • 了解了静态内部类后,那static为什么修饰了类,对于这个类也是起了一个全局可用的一个作用?
  • 越想问题越多,还有就是为什么被Static 修饰的方法可以被类直接引用到?而static 修饰的类也可以被其他的类直接使用,而不依赖于对象。

答 :我们得明确一下

  • static修饰类的方法,表示这个方法和这个类对象没有关系,只是和这个类有关系
  • static 修饰变量,按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
  • 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
  • 好的,是这样的。static修饰对象 可以全局使用,修饰方法可以不依赖于对象,修饰类,也不用依赖与他的对象,也可以被其他的类直接使用,或者自己进行初始化。

总结

  • 嵌套类:内部类和静态内部类
  • 内部类属于外部类的成员,必须依赖与外部对象来实现,静态内部类,不依赖,可以自己单独实现。
  • static 的修饰 变量,类,方法,代码块。 共性全局性。变量的话也就是全剧唯一性,会出现多个饮用,但不会出现多个存储。

参考

  • https://blog.csdn.net/fengyuzhengfan/article/details/38082999(static)
  • https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html(嵌套类)
  • https://blog.csdn.net/zero_and_one/article/details/53167372(静态内部类的作用)

拍摄于 :上海罗南

java 内部类_java的内部类和静态内部类(嵌套类)相关推荐

  1. java局部内部类_Java 局部内部类、匿名内部类详解

    外部类与内部类 众所周知,每个java文件必须有一个与这个java文件同名的外部类,这个外部类可以是public或default的.而除了这个同名外部类,还可以有与这个同名外部类平级的其他外部类,但它 ...

  2. java什么内部类_Java的内部类学习

    1.匿名内部类 匿名类是不能有名称的类,所以没办法引用它们.必须在创建时,作为new语句的一部分来声明它们.这就要采用另一种形式的new语句,如下所示: new 这种形式的new语句声明一个新的匿名类 ...

  3. java 毕向东 内部类_java基础内部类(毕向东老师)

    内部类 //特点:内部类可以直接访问外部类的成员, //外部类要访问内部类中的成员必须创建内部类的对象. //为什么要定义内部类呢? 类是用于描述事物的,而事务中如果还有具体的事物,而且这个内部的事物 ...

  4. java静态内部类(嵌套类)

    http://blog.csdn.net/lu7kang/article/details/5491241 如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static.这通常称为 ...

  5. java 静态内部类 内部类_Java中内部类和静态内部类的区别

    内部类和静态内部类 示例 public class OuterClass { private int numPrivate = 1; public int numPublic = 2; public ...

  6. java 内部接口 内部类_Java接口/内部类

    抽象方法 我先举个例子引出抽象方法,例如求圆.矩形.三角形.这些图形的面积

  7. java转义字符_Java入门 - 语言基础 - 13.Character类

    1.概述 Character 类用于对单个字符进行操作. Character 类在对象中包装一个基本类型 char 的值 实例 char ch = 'a'; // Unicode 字符表示形式char ...

  8. json 反射java 实体_Java 将JSON反射到实体类

    通过服务间调用拿到的数据返回的格式是JSON,如果你当前这个服务有实体数据类型可以对应上,那么就可以轻松愉快的搞定. 如果数据格式对不上,例如这个JSON里面有些数据是我们不想要的,这样我们实体的数据 ...

  9. C++模板类嵌套类内部类局部类的区别

    模板类就是将类定义成模板的形式. C++中好像不区分内部类与嵌套类两个名词. 内部类与嵌套类都是指在类中定义类. 局部类是指在函数中定义类. (c++不能在函数中定义函数(python可以).c++在 ...

最新文章

  1. mysql ignore index_mysql use index、ignore index、force index用法
  2. 澎思科技马原:AI安防竞争还未结束,落地进入后发优势时代 | MEET2020
  3. mysql所有知识点总结_MySQL知识点总结
  4. Dojo-API介绍
  5. Android 编程下 px - dp 的相互转换
  6. 面试官:为什么 wait() 方法需要写在循环里?
  7. matlab极大无关组,matlab最大无关组
  8. throws Exception的意思
  9. Windows XP SP3 最终发布日期公布
  10. java项目.gitignore文件过滤规则
  11. 基于PyTorch+YOLOv4的口罩佩戴检测,附数据集
  12. 我把Ubuntu 10.10放进了自己的口袋
  13. centos7系统详细安装步骤
  14. 如何用python爬虫薅羊毛_拼多多现重大BUG被“薅羊毛”,教你如何用Python简单褥羊毛...
  15. Android Studio 连接手机
  16. 分层确定性钱包(HD Wallets)
  17. 干货分享 | 全文 40000 字,最强(全) Matplotlib 实操指南
  18. 【软考题目】假设某磁盘的每个磁道划分成11个物理块,每块存放1个逻辑记录。
  19. e431装linux系统恢复,Mac、Linux、Windows三系统的备份恢复以及引导修复思路记录
  20. 64位win7系统中vb工程显示加载MSCOMCTL.OCX失败

热门文章

  1. 使Ruby自动定位查找本地路径
  2. HttpModule httpHandle 执行顺序
  3. mysql 基础 增删改查语句
  4. shell下如何删除文件的某一列
  5. Linux学习8-CentOS部署自己本地的django项目
  6. S. gcc相关软件安装
  7. mysql创建视图不允许子查询
  8. BDD(行为驱动开发)
  9. 白光LED驱动方案的选择 TPS61043
  10. duilib CTileLayoutUI 控件