什么是内部类? 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.内部类可以引用外部类的 ...
随机推荐
- D3.js 入门学习(一)
一.安装D3.js 1.网络连接 <script src="https://d3js.org/d3.v4.min.js"></script> 2.命令行安装 ...
- CentOS7下解决yum install mysql-server 异常:No package mysql-server available.问题
yum安装mysql-server没有可用包问题解决方法: step 1: wget http://repo.mysql.com/mysql-community-release-el7-5.noarc ...
- vue非父子组件之间的通信
https://www.cnblogs.com/chengduxiaoc/p/7099552.html //vm.$emit( event, arg ) //触发当前实例上的事件 //vm.$on ...
- sql sever基本命令
创建表: create table stu_info( id ,) not null primary key clustered, name ) not null, score numeric not ...
- java多线程中 volatile与synchronized的区别-阿里面试
volatile 与 synchronized 的比较(阿里面试官问的问题) ①volatile轻量级,只能修饰变量.synchronized重量级,还可修饰方法 ②volatile只能保证数据的可见 ...
- 使用mongo-express管理mongodb数据库
前面的话 本文将详细介绍一款用nodejs开发的基于Web的mongodb数据库管理工具mongo-express 安装 首先,全局安装 mongo-express 包 npm install -g ...
- Linux shell if判断语句
无论什么编程语言都离不开条件判断.SHELL也不例外. 大体的格式如下: if list then do something here elif list then do another thing ...
- 使用Webstorm建立vue.js工程并添加vuetify组件
.. .. .. ..等待安装完 ..生成的目录结构 ..打开Webstorm的终端 ..最后出现 ..回到工程目录,右键 ..显示npm面板,点击serve运行 .. ..打开[貌似跟以前不一样了. ...
- 我眼中的支持向量机(SVM)
看吴恩达支持向量机的学习视频,看了好几遍,才有一点的理解,梳理一下相关知识. (1)优化目标: 支持向量机也是属于监督学习算法,先从优化目标开始. 优化目标是从Logistics regressi ...
- Linux下安装部署Samba共享盘的操作手册
简述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的 ...