【java提高】(18)---静态内部类和非静态内部类
java提高](18)—静态内部类和非静态内部类
定义 放在一个类的内部的类我们就叫内部类。
自己从开发到现在其实用到内部类主要在两个地方会考虑用内部类:
1、使用静态内部类的单例模式
2、将Json字符串转为Bean实体的时候,也考虑创建内部类
其它比如网上说的通过内部类实现多继承,我还没有用过。这篇博客主要将静态内部类和非静态内部类中的成员内部类,至于局部内部类和匿名内部类这边就不阐述了。
一、概念
我们可以简单把内部类当成外部类的一个成员,如果你是static内部类,那么外部类不需要创建对象就可以访问你,
如果你是非静态类部类,那你就属于外部类的对象的,所以一定要先创建外部对象才能来访问你。
1、非静态内部类
成员内部类也是最普通的内部类,它是外围类的一个成员,所以它可以访问外围类的所有成员属性和方法。同样外围类也可以访问内部类的成员属性和方法。
它的主要特点是:
1、成员内部类中不能存在任何static的变量和方法
2、成员内部类是依附于外围类的对象,所以只有先创建了外围类对象才能够创建内部类对象
补充:对于成员内部内并不是完全不能出现static字段的,如果你是使用final和static同时修饰一个属性字段,并且这个字段是基本类型或者String
类型的,那么是可以编译通过的。至于原因需要了解class文件,我之前写过一篇相关博客可以参考:【JVM虚拟机】(7)---深入理解Class中-属性集合
2、静态内部类
使用static修饰的内部类我们称之为静态内部类,我们要知道只要是static修饰的类那它一定是内部类,不可能是外部类。
静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围类
的对象,但是静态内部类却没有。没有这个引用就意味着:
1、它的创建是不需要依赖于外围类的对象
2、它不能使用任何外围类的非static成员变量和方法
二、示例
有关静态内部类和非静态内部类这里做一个完整的代码演示
1、代码演示
/**
* 外部类 OutClass
*/
public class OutClass {
/**
* 外部类静态属性
*/
private static String name = "小小";
/**
* 外部类非静态属性
*/
private Integer age = 3;
/**
* @Description: 非静态内部类
*/
private class InnerClass {
// TODO 非静态内部类不能声明或定义静态成员
// private static String sex = "女";
/**
* 这里定义静态常量是不会报错的哦
*/
public static final String sex = "女";
/**
* 可以定义 普通属性
*/
private int flag = 0;
/**
* 构造函数
*/
public InnerClass() {
// 非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量
System.out.println("非静态类访问外部对象的name" + name);
System.out.println("外部对象的age " + age);
}
}
/**
* @Description: 静态内部类
*/
private static class InnerStaticClass {
/**
* 静态内部类可以有静态成员和非静态成员
*/
private static String sex = "女";
private int flag = 0;
public InnerStaticClass() {
System.out.println("静态类访问外部对象的name" + name);
//静态类只能访问外部的静态成员,不能访问非静态成员
//System.out.println("外部对象的age " + age);
}
}
public static void main(String[] args) {
System.out.println("==========非静态内部类调用==========");
//new一个外部类
OutClass outClass = new OutClass();
// 通过外部类的对象new一个非静态的内部类
OutClass.InnerClass innerClass = outClass.new InnerClass();
System.out.println("==========静态内部类调用==========");
//获取静态内部类的静态属性
String sex = OutClass.InnerStaticClass.sex;
//获取静态内部类的非静态属性
OutClass.InnerStaticClass inner = new OutClass.InnerStaticClass();
System.out.println(inner.flag);
}
}
2、总结
这里在针对上面代码做一个总结
1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
3.实例化一个非静态的内部类的方法:
a.先生成一个外部类对象实例
OutClass outClass=new OutClass();
b.通过外部类的对象实例生成内部类对象
OutClass.InnerClass inner=outClass.new InnerClass();
4.实例化一个静态内部类的方法:
a.不依赖于外部类的实例,直接实例化内部类对象
OutClass.InnerStaticClass inner=new OutClass.InnerStaticClass();
b.调用内部静态类的方法或静态变量,通过类名直接调用
OutClass.InnerStaticClass.static_sex
补充
1、内部类的作用
我个人觉得主要有以下三点吧
1、内部类能够提供更好的隐蔽性。因为我们的内部类是可以用private和protected修饰的,所以在必要的时候我们可以保证在其它类里是
无法创建当前内部类对象的。就好比我们常用的静态内部类的单例模式。
2、通过内部类可以实现多继承。
3、代码可以更加整洁。因为我们在创建实体类的时候,可能类中还包含其它类,如果这个类只会被当前类使用,那我们只需创建一个内部类就可以了。
2、展示一个静态类部类的单例模式
/**
* 外部类
*/
public class StaticInnerSingleton {
/**
* 私有的静态内部类
*/
private static class SingletonClassInstance{
private static final StaticInnerSingleton instance = new StaticInnerSingleton();
}
/**
* 获取单例
*/
public static StaticInnerSingleton getInstance() {
return SingletonClassInstance.instance;
}
}
我相信,无论今后的道路多么坎坷,只要抓住今天,迟早会在奋斗中尝到人生的甘甜。抓住人生中的一分一秒,胜过虚度中的一月一年!(4)
【java提高】(18)---静态内部类和非静态内部类的更多相关文章
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- 《java入门第一季》之面向对象静态内部类和非静态内部类的区别
很感谢在内部类章节,"开心阳"先生给与的建议.使用静态内部类.这里就简单说一下静态内部类的使用. package com.devin; public class MyMain{ p ...
- Java中static关键字声明的静态内部类与非静态内部类的区别
(1)内部静态类不需要有指向外部类的引用.但非静态内部类需要持有对外部类的引用.(2)非静态内部类能够访问外部类的静态和非静态成员.静态类不能访问外部类的非静态成员.他只能访问外部类的静态成员.(3) ...
- Java---- 静态内部类与非静态内部类的区别
静态类(只有内部类才能被声明为静态类,即静态内部类)1.只能在内部类中定义静态类 2.静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在. 3.静态类的方法可以是静态的方法也可以是非静态的方 ...
- java提高篇之详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- java提高篇(八)----详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- java提高篇(七)-----详解内部类
可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...
- Java非静态内部类中为什么不能有静态变量却可以有常量?
如:public class InnerClassDemo{ int x; class A{ static int a = 0;//这样写是不合法的. static final int b=0;//这 ...
- java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类
提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...
随机推荐
- Spring Boot + Elasticsearch实现大批量数据集下中文的精确匹配-案例剖析
缘由 数据存储在MYSQ库中,数据基本维持不变,但数据量又较大(几千万)放在MYSQL中查询效率上较慢,寻求一种简单有效的方式提高查询效率,MYSQL并不擅长大规模数据量下的数据查询. 技术方案 考虑 ...
- 20131228-sql命令
开始 --cmd net start mssqlservernetnet stop mssqlserver
- 【题解】搬书-C++
搬书 Description 陈老师桌上的书有三堆,每一堆都有厚厚的一叠,你想逗一下陈老师,于是你设计一个最累的方式给他,让他把书 拿下来给同学们.若告诉你这三堆分别有i,j,k本书,以及每堆从下到上 ...
- sql 数据处理时join字段慎重选择--避免出现double数据!
前几天做BI Tabular表格模型的时候,数据中心核对数据发现模型展现数据比实际数据要多,经过核查之后,发现原来我是一个不经意,在做数据选取的时候,inner join的字段CITY_NAME_CN ...
- python 3.5学习笔记(第五章)
本章内容 1.什么是模块 2.模块的导入方法 3.搜索路径 4.重要标准库 一.什么是模块 1.模块本质上是一个以.py 结尾的python文件,包含了python对象定义和python语句. 2.模 ...
- 【CYH-02】noip2018数论模拟赛:赛后题解
1.小奔的矩阵 2.大奔的方案 3.小奔与不等四边形 4.小奔的方案 当然本次比赛肯定难度不会仅限于此啦!后续还会--
- David与Vincent的博弈游戏[树型DP]
\(\mathcal{Description}\) \(\mathcal{Solution}\) 根据题意,我们知道 根节点深度为1,深度为 奇数 的节点由\(David\)移动,我们称为\(D\)点 ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Unity AR Foundation 和 CoreML: 实现手部的检测和追踪
0x00 前言 Unity的AR Foundation通过上层抽象,对ARKit和ARCore这些底层接口进行了封装,从而实现了AR项目的跨平台开发能力. 而苹果的CoreML是一个可以用来将机器学习 ...
- Cobbler-自动化部署神器
Cobbler-自动化部署神器 前言: 网络安装服务器套件 Cobbler(补鞋匠)从前,我们一直在做装机民工这份很有前途的职业.自打若干年前 Red Hat 推出了 Kickstart,此后我们顿觉 ...