1、静态内部类与普通内部类的区别

1)普通内部类不能脱离外部类被创建;静态内部类可以脱离外部类被创建。

2)普通内部类可访问外部类的静态和非静态成员变量和方法(包括私有属性),因其在外部类内部;静态内部类只能访问外部类的静态成员,不能访问外部类的非静态成员。

3)普通内部类拥有对外部类的引用;静态内部类没有对外部类的引用。

4)普通内部类不能定义static成员变量和方法。

5)类的内部,可定内部接口,并且可定义一个内部类实现这个内部接口。

6)内部类可以多嵌套。

7)可以在方法体内定义一个内部类,方法体内的内部类可以完成一个基于虚方法形式的回调操作

注:static修饰的内部类,是一种较为特殊的内部类,Java文档中描述static修饰的内部类:一旦内部类使用static修饰,那么此时这个内部类就升级为顶类。也就是说,除了写在一个类的内部以外,static内部类具备所有外部类的特性,同外部类没有分别。一般之定义和使用静态内部场景:该内部类仅外部类用到,以此减少类文件数量,方便代码维护和管理。

2、代码验证

package com.base;import lombok.Data;@Data
public class OuterClass {public static int classNum = 1;public int classSort = 2;// ************************************************************************// 静态内部类// ************************************************************************@Datapublic static class InnerStaticClass {private String name;public InnerStaticClass() {}public InnerStaticClass(String name) {this.name = name;}public void say() {System.out.println("我是【静态内部类】,可被外部调用");}public static void speak() {System.out.println("我是【静态内部类】,可被外部调用,且无需初始化就可调用");}}// ************************************************************************// 内部类// ************************************************************************public class InnerClass implements InnerClassInterface {private String name;//内部类不能定义static元素,包括:成员变量和方法//public static Integer age;public InnerClass() {}public InnerClass(String name) {this.name = name;}public void say() {System.out.println("我是【内部类】,可被本内部类对象调用");//【1】普通内部类能够访问外部类的静态和非静态成员,【静态内部类】不能访问外部类的非静态成员,他只能访问外部类的静态成员System.out.println("我是【内部类】,可调用外部类非静态属性-班级名次:" + OuterClass.this.classSort);System.out.println("我是【内部类】,可以调用外部类静态属性-班级号码:" + OuterClass.classNum);//【2】普通内部类持有对外部类的引用,【静态内部类】没有持有外部类的引用。OuterClass.this.speak();}public void speak() {System.out.println("我是【内部类】,可被外部类通过初始化调用");}//错误非【静态内部类】,不允许声明静态的方法
//        public static void speak() {
//            System.out.println("我是【静态内部类】,我不需要初始化就可以调用");
//        }//内部类可以多嵌套public class InnerInnerClass {}}//可以定义内部接口,且可以定义另外一个内部类实现这个内部接口public interface InnerClassInterface{void say();void speak();}public void speak() {System.out.println("我是【外部类】,可被内部类调用");new InnerClass().speak();}public static void main(String[] args) {InnerStaticClass.speak();System.out.println();InnerStaticClass innerStaticClass1 = new InnerStaticClass("李清华");innerStaticClass1.say();System.out.println();OuterClass outerClass = new OuterClass();//【3】一个普通内部类不能脱离外部类实体被创建,且可以访问外部类的数据和方法,因为他就在外部类里面。InnerClass innerClass = outerClass.new InnerClass("张北大");innerClass.say();}
}

打印输出:

我是【静态内部类】,可被外部调用,且无需初始化就可调用

我是【静态内部类】,可被外部调用

我是【内部类】,可被本内部类对象调用
我是【内部类】,可调用外部类非静态属性-班级名次:2
我是【内部类】,可以调用外部类静态属性-班级号码:1
我是【外部类】,可被内部类调用
我是【内部类】,可被外部类通过初始化调用

java 中静态内部类与普通内部类的区别相关推荐

  1. java == hashcode,java中==和equals和hashCode的区别

    java中==和equals和hashCode的区别 == 的作用: 基本类型:比较的就是值是否相同 引用类型:比较的就是地址值是否相同(确切的说,是堆内存地址) equals 的作用: 引用类型:默 ...

  2. Java中实现接口与继承的区别

    ** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...

  3. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

  4. Java中long和Long有什么区别

    Java中long和Long有什么区别(转) Java的数据类型分两种: 1.基本类型:long,int,byte,float,double,char 2. 对象类型(类): Long,Integer ...

  5. java中的sleep()和wait()的区别

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...

  6. Java中活锁和死锁有什么区别?

    Java中活锁和死锁有什么区别? 活锁:一个线程通常会有会响应其他线程的活动.如果其他线程也会响应另一个线程的活动,那么就有可能发生活锁.同死锁一样,发生活锁的线程无法继续执行.然而线程并没有阻塞-- ...

  7. Java中wait和sleep方法的区别

    1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...

  8. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  9. java system sleep_详解Java中的sleep()和wait()的区别

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序 ...

最新文章

  1. 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上
  2. 独家 | 别用csv存储了-这种文件格式比csv快150倍(附链接)
  3. 放弃“for循环”,教你用这种算法 !(附代码)
  4. IOS-webService
  5. 【Python】青少年蓝桥杯_每日一题_4.03_求偶数
  6. Linux下查看系统配置
  7. 一个字符串中到底能有多少个字符? 我竟然算错了!
  8. java基础——java基本运算
  9. java字符串的方法 1118
  10. 如何将Windows下的文件传到Linux中
  11. 关于app.config不能即时保存读取的解决方案
  12. Python之路第二天
  13. 旅游展示网站-前端网页设计技术完整精美源码HTML+CSS+JS
  14. 如何五分钟实现无线WEP网络入侵(ZZ)
  15. ThinkPHP自定义标签的使用总结
  16. python gdal迭代写为ENVI的dat格式
  17. (Rock, Paper, Scissors, Lizard and Spock)sheldon谢耳朵独创的剪刀,布,石头,蜥蜴,史波克 用代码实现
  18. ORB——OPC服务器冗余的最佳选择
  19. 云计算360度 微软专家纵论产业变革
  20. 2020年缴费基数调整

热门文章

  1. 一起做激光SLAM[六]isam于SLAM位姿因子图优化的使用
  2. Pandas 统计分析基础 笔记2 任务4.2 掌握DataFrame的常用操作
  3. Altium designer18系列教程一 建工程和封装介绍
  4. 网红王思聪数字时钟动态壁纸【电脑壁纸】
  5. python 可视化分析平台_python 数据分析数据可视化工具matplotlib
  6. 外汇天眼:使用 MT4 进行交易的最佳方式
  7. 冯绍峰,如果你爱她,记得不要把名字倒过来讲!
  8. Axure 交互案例:放大缩小图片
  9. SCP、NFS、TFTP的配置
  10. 代码Verify简介