java 中静态内部类与普通内部类的区别
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 中静态内部类与普通内部类的区别相关推荐
- java == hashcode,java中==和equals和hashCode的区别
java中==和equals和hashCode的区别 == 的作用: 基本类型:比较的就是值是否相同 引用类型:比较的就是地址值是否相同(确切的说,是堆内存地址) equals 的作用: 引用类型:默 ...
- Java中实现接口与继承的区别
** Java中实现接口与继承的区别 ** 首先,先来了解一下什么是接口和继承.接口一般是使用interface来定义的.接口定义同类的定义类似,分为接口的声明和接口体,其中接口体由常量定义和方法定义 ...
- Java中PreparedStatement和Statement的用法区别
Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈 1. PreparedStatement接口继承Sta ...
- Java中long和Long有什么区别
Java中long和Long有什么区别(转) Java的数据类型分两种: 1.基本类型:long,int,byte,float,double,char 2. 对象类型(类): Long,Integer ...
- java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...
- Java中活锁和死锁有什么区别?
Java中活锁和死锁有什么区别? 活锁:一个线程通常会有会响应其他线程的活动.如果其他线程也会响应另一个线程的活动,那么就有可能发生活锁.同死锁一样,发生活锁的线程无法继续执行.然而线程并没有阻塞-- ...
- Java中wait和sleep方法的区别
1.两者的区别 这两个方法来自不同的类分别是Thread和Object 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁). wait ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- java system sleep_详解Java中的sleep()和wait()的区别
详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序 ...
最新文章
- 如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上
- 独家 | 别用csv存储了-这种文件格式比csv快150倍(附链接)
- 放弃“for循环”,教你用这种算法 !(附代码)
- IOS-webService
- 【Python】青少年蓝桥杯_每日一题_4.03_求偶数
- Linux下查看系统配置
- 一个字符串中到底能有多少个字符? 我竟然算错了!
- java基础——java基本运算
- java字符串的方法 1118
- 如何将Windows下的文件传到Linux中
- 关于app.config不能即时保存读取的解决方案
- Python之路第二天
- 旅游展示网站-前端网页设计技术完整精美源码HTML+CSS+JS
- 如何五分钟实现无线WEP网络入侵(ZZ)
- ThinkPHP自定义标签的使用总结
- python gdal迭代写为ENVI的dat格式
- (Rock, Paper, Scissors, Lizard and Spock)sheldon谢耳朵独创的剪刀,布,石头,蜥蜴,史波克 用代码实现
- ORB——OPC服务器冗余的最佳选择
- 云计算360度 微软专家纵论产业变革
- 2020年缴费基数调整