什么是内部类? Static Nested Class 和 Inner Class 的不同。
什么是内部类? Static Nested Class 和 Inner Class 的不同。
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员(静态成员不是对象的特
性,只是为了找一个容身之处,所以需要放到一个类中而已,这么一点小事,你还要把它放
到类内部的一个类中,过分了啊!提供内部类,不是为让你干这种事情,无聊,不让你干。
我想可能是既然静态成员类似 c 语言的全局变量,而内部类通常是用于创建内部对象用的,
所以,把“全局变量”放在内部类中就是毫无意义的事情,既然是毫无意义的事情,就应该被
禁止), 内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,
也可以定义在外部类的方法体中,如下所示:
public class Outer
{
int out_x = 0;
public void method()
{
Inner1 inner1 = new Inner1();
public class Inner2 //在方法体内部定义的内部类
{
public method()
{
out_x = 3;
}
}
Inner2 inner2 = new Inner2();
}
public class Inner1 //在方法体外面定义的内部类
{
}
}
在方法体外面定义的内部类的访问类型可以是 public,protecte,默认的, private 等4种类型,
这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是
否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象
时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对
象,代码如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();
在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,
但这种内部类的前面可以使用 final 或 abstract 修饰符。这种内部类对其他类是不可见的其
他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内
部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的
局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,
但是,该局部变量前必须加 final 修饰符。
对于这些细节,只要在 eclipse 写代码试试,根据开发工具提示的各类错误信息就可以马上
了解到。
在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同
时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer
{
public void start()
{
new Thread(
new Runable(){
public void run(){};
}
).start();
}
}
最后,在方法外部定义的内部类前面可以加上 static 关键字,从而成为 Static Nested Class,
它不再具有内部类的特性,所有,从狭义上讲,它不是内部类。 Static Nested Class 与普通
类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以
定义成 public、 protected、默认的、 private 等多种类型,而普通类只能定义成 public 和默
认的这两种类型。在外面引用 Static Nested Class 类的名称为“外部类名.内部类名”。在外
面不需要创建外部类的实例对象,就可以直接创建 Static Nested Class,例如,假设 Inner
是定义在 Outer 类中的 Static Nested Class,那么可以使用如下语句创建 Inner 类:
Outer.Inner inner = newOuter.Inner();
由于 static Nested Class 不依赖于外部类的实例对象,所以, static Nested Class 能访问
外部类的非 static 成员变量(不能直接访问,需要创建外部类实例才能访问非静态变量)。 当
在外部类中访问 Static Nested Class 时,可以直接使用 Static Nested Class 的名字,而不
需要加上外部类的名字了,在 Static Nested Class 中也可以直接引用外部类的 static 的成员
变量,不需要加上外部类的名字。
在静态方法中定义的内部类也是 Static Nested Class,这时候不能在类前面加 static 关键字,
静态方法中的 Static Nested Class 与普通方法中的内部类的应用方式很相似,它除了可以
直接访问外部类中的 static 的成员变量,还可以访问静态方法中的局部变量,但是,该局部
变量前必须加 final 修饰符。
什么是内部类? Static Nested Class 和 Inner Class 的不同。的更多相关文章
- 【Java面试题】11 什么是内部类?Static Nested Class 和 Inner Class的不同。
Inner Class(内部类)定义在类中的类. (一般是JAVA的说法) Nested Class(嵌套类)是静态(static)内部类.(一般是C++的说法)静态内部类:1 创建一个static内 ...
- 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化.而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示. /** ...
- 什么是内部类? Static Nested Class 和 Inner Class的不同?
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员. 内部类作为其外部类的一个成员,因此内部类可以直接访问外部类的成员.但有一点需要指出:静态成员不能访问非静态成员,因此静态内部类不能访问外部 ...
- 什么是内部类?Static Nested Class和Inner Class的不同?
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中.在方法外部定义的内部类前面可以加上st ...
- 静态嵌套类(Static Nested Class)和内部类(Inner Class) 的不同?
Static Nested Class 是被声明为静态(static)的内部类,它可以不依赖于外部类 实例被实例化.而通常的内部类需要在外部类实例化后才能实例化,其语法看起 来挺诡异的,如下所示. / ...
- Java | 静态嵌套类(Static Nested Class)
前言 本文内容主要来自 Java 官方教程中的<嵌套类>章节. 本文提供的是 JDK 14 的示例代码. 定义 静态嵌套类(Static Nested Class),是 Java 中对类的 ...
- Static Nested Class 和 Inner Class的不同?
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法).Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上. 注: 静态内部类(Inner ...
- final 内部类 static
[Java中为什么会有final变量]: final这个关键字的含义是“这是无法改变的”或者“终态的”: 那么为什么要阻止改变呢? java语言的发明者可能由于两个目的而阻止改变: 1).效率问题: ...
- Java面试题——中级(下)
内部类和静态内部类的区别 内部类: 1.内部类中的变量和方法不能声明为静态的. 2.内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B(). 3.内部类可以引用外部类的 ...
随机推荐
- JEECG 3.8宅男优化版本发布
1024程序员节宅男节日快乐 -- JAVA快速开发平台,JEECG 3.8宅男优化版本发布 - JEECG开源社区 - CSDN博客https://blog.csdn.net/zhangdaisco ...
- python学习 day13 装饰器(一)&推导式
装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...
- 微服务与容器化Docker
1.Docker的应用案例 2. 3. 4.docker的核心:镜像.仓库.容器 Build构建镜像:类似于集装箱. Ship运输镜像,仓库:类似于码头.将镜像运输到仓库. Run运行镜像:容器:类似 ...
- Python【pyyaml】模块
pyyaml模块安装: pip install pyyaml pyyaml导入: import yaml pyyaml使用: 1.使用前,在pycharm中新建一个以yaml或yml结尾的文件,保存为 ...
- 版本控制工具之git
git存储区域详解 命令快速总结 初始化 git init 当前文件夹初始化 代码提交 git add file/. 自动检测工作区修改的内容提交到暂存区 git status 查看当前文件夹工作区的 ...
- elk 中kafka启动脚本和配置文件
kafka启动脚本和配置文件 # more kafka #!/bin/sh # Init script for kafka ### BEGIN INIT INFO # Provides: kafka ...
- C++回顾day03---<纯虚函数和抽象类以及虚析构函数,delete使用>
一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列 ...
- docker 安装入门
install docker 命令 docker version // docker 版本 docker pull nginx // 拉取nginx docker images // 查看本机dock ...
- expprt与环境变量
一.Windows 环境变量 1.在Windows 系统下,很多软件安装都需要配置环境变量,比如 安装 jdk ,如果不配置环境变量,在非软件安装的目录下运行javac 命令,将会报告找不到文件,类似 ...
- css中的数学表达式calc()
前言 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路. 概念 数学表达式calc()是calculate计算的缩写,它允许使用+.-.*. ...