java提高](18)—静态内部类和非静态内部类

定义 放在一个类的内部的类我们就叫内部类。

自己从开发到现在其实用到内部类主要在两个地方会考虑用内部类:

1、使用静态内部类的单例模式

2、将Json字符串转为Bean实体的时候,也考虑创建内部类

其它比如网上说的通过内部类实现多继承,我还没有用过。这篇博客主要将静态内部类非静态内部类中的成员内部类,至于局部内部类和匿名内部类这边就不阐述了。

一、概念

我们可以简单把内部类当成外部类的一个成员,如果你是static内部类,那么外部类不需要创建对象就可以访问你,

如果你是非静态类部类,那你就属于外部类的对象的,所以一定要先创建外部对象才能来访问你。

1、非静态内部类

成员内部类也是最普通的内部类,它是外围类的一个成员,所以它可以访问外围类的所有成员属性和方法。同样外围类也可以访问内部类的成员属性和方法。

它的主要特点是:

1、成员内部类中不能存在任何static的变量和方法

2、成员内部类是依附于外围类的对象,所以只有先创建了外围类对象才能够创建内部类对象

补充:对于成员内部内并不是完全不能出现static字段的,如果你是使用finalstatic同时修饰一个属性字段,并且这个字段是基本类型或者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)---静态内部类和非静态内部类的更多相关文章

  1. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  2. 《java入门第一季》之面向对象静态内部类和非静态内部类的区别

    很感谢在内部类章节,"开心阳"先生给与的建议.使用静态内部类.这里就简单说一下静态内部类的使用. package com.devin; public class MyMain{ p ...

  3. Java中static关键字声明的静态内部类与非静态内部类的区别

    (1)内部静态类不需要有指向外部类的引用.但非静态内部类需要持有对外部类的引用.(2)非静态内部类能够访问外部类的静态和非静态成员.静态类不能访问外部类的非静态成员.他只能访问外部类的静态成员.(3) ...

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

    静态类(只有内部类才能被声明为静态类,即静态内部类)1.只能在内部类中定义静态类 2.静态内部类与外层类绑定,即使没有创建外层类的对象,它一样存在. 3.静态类的方法可以是静态的方法也可以是非静态的方 ...

  5. java提高篇之详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  6. java提高篇(八)----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  7. java提高篇(七)-----详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  8. Java非静态内部类中为什么不能有静态变量却可以有常量?

    如:public class InnerClassDemo{ int x; class A{ static int a = 0;//这样写是不合法的. static final int b=0;//这 ...

  9. java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类

    提起java内裤类(innerClass)很多人不太熟悉,实际上类似的概念在c++里面也有,那就是嵌套类(Nested Class),关于这俩者的区别,在下文中会有对比.内部类从表面上看,就是在类中定 ...

随机推荐

  1. 快速掌握mongoDB(二)——聚合管道和MapReduce

    上一节简单介绍了一下mongoDB的增删改查操作,这一节将介绍其聚合操作.我们在使用mysql.sqlserver时经常会用到一些聚合函数,如sum/avg/max/min/count等,mongoD ...

  2. C#3.0新增功能09 LINQ 标准查询运算符 01 概述

    连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符 是组成 LINQ 模式的方法. 这些方法中的大多数都作用于序列:其中序列指其类型实现 IEnumerable<T> 接 ...

  3. linux中type 、file、stat三者的区别

    1.type 用来查看命令类型,以区别是内部命令还是外部命令 示例:[root@localhost ~]# type cd cd 是 shell 内嵌    [root@localhost ~]# t ...

  4. nginx目录穿越漏洞复现

    nginx目录穿越漏洞复现 一.漏洞描述 Nginx在配置别名(Alias)的时候,如果忘记加/,将造成一个目录穿越漏洞. 二.漏洞原理 1. 修改nginx.conf,在如下图位置添加如下配置 在如 ...

  5. 小白学python-day03-系统位数、变量、用户输入、if else

    今天是day03,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  6. javascript基础学习第二天

    ECMASCRIPT(语法标准) 1. 能够写出简单的逻辑程序代码 2. 变量,数据类型,运算符,条件判断语句,循环语法,数组,对象,函数 1. 赋值运算符 = 将'='右侧的结果赋值给左侧的变量 a ...

  7. MYSQL A、B表数组关联查询

    最终结果: 数据库表 A表: B表: 操作步骤 主要关键字:FIND_IN_SET.GROUP_CONCAT.LEFT JOIN.GROUP BY 第一步:left join 连接AB表并通过 fin ...

  8. 在ts+vue中实现前端批量下载打包二维码

    ---恢复内容开始--- 一.插件安装 首先是插件的安装与引入,这里我们用的是qrcode的这个插件,直接使用npm install qrcodejs2安装即可,但是这里要注意,如果你用的是ts进行开 ...

  9. AbstractList

    概述 此类提供 List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作.对于连续的访问数据(如链表),应优先使用 AbstractSequentialLis ...

  10. Jibx 只绑定需要的字段

    栗子:     binding.xml   <?xml version="1.0" encoding="UTF-8"?> <binding&g ...