当前位置: 首页 > news >正文

Java---- 静态内部类与非静态内部类的区别

在面试中回答的很不全,所以再此做一个总结。

1 static 静态修饰符

在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的。
static修饰表示静态的,在类加载时JVM会把它放到方法区,被本类以及本类中所有实例所公用。在编译后所分配的内存会在一直存在,直到程序退出内存才会释放这个空间。如果一个被所有实例公用的方法被申明为static,那么就可以节省空间了,不用每个实例初始化的时候都被分配到内存。

2.内部类

定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。

3.静态类(只有内部类才能被声明为静态类,即静态内部类)

1.只能在内部类中定义静态类
2.静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在。
3.静态类的方法可以是静态的方法也可以是非静态的方法,静态的方法可以在外层通过静态类调用,而非静态的方法必须要创建类的对象之后才能调用。
5.只能引用外部类的static成员变量(也就是类变量)。
6.如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态的。

以上稍微介绍了一下静态类,接下来将用代码来分析静态内部类与非静态内部类的区别。

public class OutClassTest {int out1=1;static int out2=1;void out(){System.out.println("非静态");}static void outstatic(){System.out.println("静态");}public class InnerClass{void InnerClass(){System.out.println("InnerClass!");System.out.println(out1);System.out.println(out2);out();outstatic();//静态内部类只能够访问外部类的静态成员}// static void inner(){}  static int i=1; 非静态内部类不能有静态成员(方法、属性)}public static class InnerstaticClass{void InnerstaticClass(){System.out.println("InnerstaticClass");//  System.out.println(out1);out(); 静态内部类只能够访问外部类的静态成员System.out.println(out2);outstatic();}static void innerstatic(){}  static int i=1;//静态内部类能有静态成员(方法、属性)}public static void main(String args[]){OutClassTest a=new OutClassTest();OutClassTest.InnerstaticClass b=new OutClassTest.InnerstaticClass();//创建静态内部类OutClassTest.InnerClass c=a.new InnerClass();//创建非静态内部类}
}1234567891011121314151617181920212223242526272829303132333435

总结

1.是否能拥有静态成员
静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.访问外部类的成员
静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
3.静态内部类和非静态内部类在创建时有区别

//假设类A有静态内部类B和非静态内部类C,创建B和C的区别为: 
A a=new A(); 
A.B b=new A.B(); 
A.C c=a.new C();1234
http://www.lryc.cn/news/272320.html

相关文章:

  • STM32 基础知识(探索者开发板)--135讲 ADC转换
  • Java经典框架之SpringBoot
  • LeetCode75| 二叉搜索树
  • 博物馆3d虚拟场景复原制作有助于传承和弘扬中华民族优秀传统文化
  • 二维码地址门牌系统:便捷报修服务引领社区新篇章
  • c++基础(对c的扩展)
  • RS485数据采集模块,如何一次采集多个modbus设备数据?
  • 面试 Vue 框架八股文十问十答第一期
  • 【积微成著】性能测试调优实战与探索(存储模型优化+调用链路分析)| 京东物流技术团队
  • 建立分位制,用标准去量化优化效果 - 启动优化为例
  • Modbus 通信协议 二
  • 关于系统设计的一些思考
  • Java 第19章 IO流 课堂练习+本章作业
  • 一键制作电子样册,提升企业品牌形象
  • Linux 的引导与服务控制
  • 多输入多输出 | MATLAB实现SSA-CNN麻雀算法优化卷积神经网络多输入多输出预测
  • 高端电流检测方案
  • IP地址、子网掩码与网络地址
  • python 深度学习 记录遇到的报错问题10
  • linux下docker搭建Prometheus +SNMP Exporter +Grafana进行核心路由器交换机监控
  • Github 2023-12-31 开源项目日报 Top10
  • 管程-第三十三天
  • 嵌入式中断理解
  • React16源码: Hooks源码实现
  • 华为端口隔离高级用法经典案例
  • java项目启动jar包启动参数设置端口号
  • 【数据结构和算法】寻找数组的中心下标
  • 多粒度在研究中的应用
  • Docker命令---查看容器日志
  • Spring Boot 基于Redisson实现注解式分布式锁