【Java入门提高篇】Day9 Java内部类——静态内部类
今天来说说Java中的最后一种内部类——静态内部类
所谓的静态内部类,自然就是用static修饰的内部类,那用static修饰过后的内部类,跟一般的内部类相比有什么特别的地方呢?
首先,它是静态的,这就意味着它的创建不依赖于外部类,创建内部类的实例不需要像普通内部类一样先创建外部类实例才能创建。
其次,有优势必然有劣势,它不能像普通内部类一样无限制的访问外部类的方法和成员变量,只能访问静态成员变量和静态方法。
话不多说,先来看个栗子:
public class StaticInnerClass {
//外部类的非静态成员
private int numA = 1;
//外部类的静态成员
private static int numB = 2;
//静态内部类
static class Inner {
//内部类的非静态成员
private int numC = 3;
//内部类的静态成员
private static int numD = 4;
public void printInner(){
System.out.println("printInner");
System.out.println(numB);//访问外部类的静态成员
System.out.println(numC);//访问内部类的非静态成员
System.out.println(numD);//访问内部类的静态成员
}
}
//外部类的普通成员方法
public void printOuter(){
System.out.println("printOuter");
}
public static void main(String[] args) {
StaticInnerClass outer = new StaticInnerClass();
outer.printOuter();
Inner inner = new StaticInnerClass.Inner();
inner.printInner();
System.out.println(StaticInnerClass.numB);
System.out.println(Inner.numD);
}
}
输出如下:
printOuter
printInner
2
3
4
2
4
看起来,内部类跟外部类的使用上是差不多的,更像是一个暂存在外部类中的一个类,跟外部类并没有什么太多本质上的联系,但是创建的时候需要使用Outer.Inner的方式来定义,就像给类加了一个命名空间一样。
再举个栗子来看看静态内部类和非静态内部类的区别:(知乎上看到的一段话,觉得比喻比较形象)
如果把类比喻成鸡蛋,内部类为蛋,,外部类是蛋壳。那么静态类相当于熟鸡蛋,就算蛋壳破碎(外部类没有实例化),蛋黄依然完好(内部类可以实例化);而非静态类相当于生鸡蛋,蛋壳破碎(无实例化),蛋黄也会跟着xx(不能实例化)。
至于原因?其实就是因为非静态内部类中保存有外部类的指针,所以可以无限制访问外部类的所有属性,而静态内部类则没有,所以静态内部类无法访问外部类的非静态成员和方法,仅仅是借用一下它的壳而已。
再来看一个栗子:
public class Caculate {
//定义一个pair类来将两个数捆绑
static class Pair{
private int first;
private int second;
public Pair(int first, int second) {
this.first = first;
this.second = second;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
}
//获取一个int数组中的最大和最小值
public static Pair getMaxMin(int[] values){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i:values){
if (min > i) min = i;
if (max < i) max = i;
}
return new Pair(min,max);
}
public static void main(String[] args){
int[] list = {1,3,5,2,77,23,25};
Caculate.Pair pair = Caculate.getMaxMin(list);
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());
System.out.println(pair.first);
System.out.println(pair.second);
}
}
这里getMaxMin里需要一次返回两个值,所以用了一个Pair类来将两个数捆绑到一起,而因为这个类只在Caculate类中使用,而且两者并没有依赖关系,所以这里使用静态内部类是最合适的。
静态内部类还有很多适用的场景,这就需要大家在今后的使用中慢慢体会了。
至此,本篇讲解完毕,欢迎大家继续关注。
【Java入门提高篇】Day9 Java内部类——静态内部类的更多相关文章
- 【Java入门提高篇】Java集合类详解(一)
今天来看看Java里的一个大家伙,那就是集合. 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体.集合就是用来存放和管理其他类对象 ...
- 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析
今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...
- 【Java入门提高篇】Day1 抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- 【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解
今天来介绍一下容器类中的另一个哈希表———>LinkedHashMap.这是HashMap的关门弟子,直接继承了HashMap的衣钵,所以拥有HashMap的全部特性,并青出于蓝而胜于蓝,有着一 ...
- 【Java入门提高篇】Day27 Java容器类详解(九)LinkedList详解
这次介绍一下List接口的另一个践行者——LinkedList,这是一位集诸多技能于一身的List接口践行者,可谓十八般武艺,样样精通,栈.队列.双端队列.链表.双向链表都可以用它来模拟,话不多说,赶 ...
- 【Java入门提高篇】Day13 Java中的反射机制
前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上 ...
- 【Java入门提高篇】Day16 Java异常处理(下)
今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势. Exception家族 一图胜千言,先来看一张图. Exception这是一个父类 ...
- 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ...
- 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙——HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...
随机推荐
- Leetcode题解(六)
21.Merge Two Sorted Lists 题目 直接上代码: class Solution { public: ListNode *mergeTwoLists(ListNode *l1, L ...
- route命令实例练习
第1章 命令配置 虚拟服务器 网卡配置信息 虚拟网卡名称 虚拟网卡模式 服务器01 eth1 10.0.0.10/24 nat模式 服务器02 eth2 10.0.0.11/24 nat模式 eth3 ...
- 关于easyui隐藏后数据不能刷新??
原因是div用display属性隐藏后不能重新加载table数据 解决方法:使用hide()方法在初始化时隐藏 $("#two").hide(); //点击按钮隐藏与显示表单域 $ ...
- AMD 和 CMD 的区别
AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这里:https://github.com/seajs/seajs/issue ...
- 小议webpack下的AOP式无侵入注入
说起来, 面向切面编程(AOP)自从诞生之日起,一直都是计算机科学领域十分热门的话题,但是很奇怪的是,在前端圈子里,探讨AOP的文章似乎并不是多,而且多数拘泥在给出理论,然后实现个片段的定式)难免陷入 ...
- Python把给定的列表转化成二叉树
在LeetCode上做题时,有很多二叉树相关题目的测试数据是用列表给出的,提交的时候有时会出现一些数据通不过,这就需要在本地调试,因此需要使用列表来构建二叉树,方便自己调试.LeetCode上二叉树结 ...
- details和summary可以对内容进行折叠
使用<details>和<summary>元素 它可以在body的任意地方使用下面有一个小例子 <!DOCTYPE html> <html lang=&quo ...
- Hibernate框架学习之注解配置关系映射
上篇文章我们通过注解对映射了单个实体类,但是具体项目中往往实体类之间又是相互关联的,本篇文章就是从实体类之间存在的不同关联角度,具体学习下如何映射他们之间的关联,主要涉及内容如下: 单向的一 ...
- 《天书夜读:从汇编语言到windows内核编程》十 线程与事件
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...