什么是内部类? 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.内部类可以引用外部类的 ...
随机推荐
- JS 灵活使用 console 调试
前言: Web 开发中最常用的调试就是 console.log(),console 除了 本身 log() 方法外,还有其他很多方法. console.log() console.log() 有许多意 ...
- iview 动态渲染menu时active-name无效的问题
动态渲染menu时,如果需要active-name,那么name只能绑定index,动态渲染的数组初始必须有一个空对象.否则无法使用active-name属性.注:仅限3.0版本,不排除新版本修复的可 ...
- Java Mail 实现第三方邮件发送功能
1 创建一个用于发送邮件的类 package com.latiny.service; import java.io.IOException; import java.io.InputStream; i ...
- [硬件]超能课堂(181):我们为什么需要4+8pin CPU供电接口?
超能课堂(181):我们为什么需要4+8pin CPU供电接口? https://www.expreview.com/68008.html 之前算过TDP 来计算机器的功耗 发现自己 理解的还是有偏差 ...
- DAY12、装饰器
一.补充:nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 3.案例: def outer(): ...
- BZOJ3028食物——生成函数+泰勒展开
题目描述 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这次又准备带一些 ...
- min-max容斥学习笔记
min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...
- python 第一课 helloworld
#!/usr/bin/env python #-*-coding:utf-8-*- #以上是配置编写环境的开始 #第一行env表示运行当前环境变量内的python版本(2.x or 3.x) #第二行 ...
- 对于mysql数据库优化的见解
一.数据库占用的空间大小.表占用空间大小.索引占用空间大小 在用阿里云的数据库的时候经常出现磁盘空间爆满的情况.所以要经常查询数据库相关内容占用的磁盘大小,有很多mysql客户端如navicat 就可 ...
- CMDB资产管理系统开发【day26】:Django admin
想实现的是一个表里面的字段 选择性的出现在菜单栏 1.如何自定义菜单 自定义菜单前 在asset\admin.py里添加如下代码: class NewAssetApprovalZoneAdmin(ad ...