【Java基础】Java内部类
什么是内部类
把类定义在其他类的内部,这个类就被称为内部类。
内部类的分类
内部类分为两种,分别为成员内部类和局部内部类:
- 成员内部类:和成员变量和成员方法定义在同级
- 局部内部类:和局部变量定义在同级,包括在构造方法,成员方法体和静态方法体中
class Outer {
class InnerA {//成员内部类
}
{
class InnerB {//局部内部类
}
}
static {
class InnerC {//局部内部类
}
}
public Outer() {
class InnerD { //局部内部类
}
}
public void show() {
class InnerE {//成员内部类
}
}
}
成员内部类访问特点
- 内部类可以直接访问外部类的全部成员。
- 外部类要访问内部类的成员,必须创建对象。
- 成员内部类一般多用private修饰和static修饰
class Outer {
private int age = 20;
class Inner {
public void getAge() {
System.out.println(age);
}
}
public void method() {
//找不到符号
//getAge();
Inner inner = new Inner();
inner.getAge();
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner();
inner.getAge();
}
}
上面的例子中,可以直接通过new Outer(). new Inner();来访问内部来,这种访问一般不安全,因为类之所以定义在内部而不定义在外部,肯定有安全性需求,这时候可以在内部类前的修饰符加private,如果类中的成员变量,外部只能通过指定的方法来访问,这个时候在对外的方法可以提供验证,例如:
class Outer {
private class InnerA {
public void play() {
System.out.println("play");
}
}
public void getInner(String name) {
if(name.equals("lili")){
new InnerA().play();
}
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.getInner("lili");
}
}
当然,成员内部类也常用static修饰,这样访问起来便利性比较高,但是静态内部类只能访问静态外部成员变量。
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.getAge();
}
}
class Outer {
private static int age = 20;
static class Inner {
public void getAge() {
System.out.println(age);
}
}
public void method() {
Inner inner = new Inner();
inner.getAge();
}
}
局部内部类访问特点
- 可以直接访问外部类的全部成员
- 在局部位置,可以创建内部类对象来使用局部内部类提供的功能
- 局部内部类访问局部变量必须用final修饰
class Outer {
private String name = "lili";
public void show(){
int phoneNum = 10086;
class Inner {
final int age = 20;
public void getAge() {
// phoneNum = 110;//Error:(13, 17) java: 从内部类引用的本地变量必须是最终变量或实际上的最终变量
int miniPhoneNum = phoneNum;//可以访问
System.out.println(age);
System.out.println(phoneNum); System.out.println(name);
}
}
new Inner().getAge();
}
}
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.show();
}
}
为什么局部内部类只能访问final类型的局部变量?
局部变量是随着方法的调用而调用,随着调用完毕而消失。而堆内存的内容并不会立即消失。所以,我们加final修饰。加入final修饰后,这个变量就成了常量。既然是常量。你消失了,我在内存中存储的是数据20,所以,我还是有数据在使用。
内部类中如何区分多层同名变量
class Outer {
public int num = 10;
class Inner {
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);
System.out.println(this.num);
//System.out.println(new Outer().num);
System.out.println(Outer.this.num);
}
}
}
【Java基础】Java内部类的更多相关文章
- java基础---->java中正则表达式二
跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...
- Java基础-Java中的堆内存和离堆内存机制
Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Java基础-Java中的内存分配与回收机制
Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.
- Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)
Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...
- Java基础-Java中的并法库之线程池技术
Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.
- Java基础-Java中23种设计模式之常用的设计模式
Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java基础-Java数据类型
Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...
- java基础之 内部类
Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...
- Java基础(53):内部类(转)
java中的内部类总结 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行 ...
随机推荐
- 两个不同于LR和jmeter的性能测试工具
LR图形界面,更利于使用 jmeter采用java,也能够扩展 相对于上两款工具,下面两款性能测试工具都采用了异步IO模型,扩展性都更强速度也更快 gatling:基于scala,速度相比更快性能压力 ...
- oracle忘记用户密码
在cmd命令行下输入sqlplus / as sysdba alter user system identified by abc; 就可以将system用户的密码改成abc了. alter user ...
- poj 1830 开关问题
开关问题 题意:给n(0 < n < 29)开关的初始和最终状态(01表示),以及开关之间的关联关系(关联关系是单向的输入a b表示a->b),问有几种方式得到最终的状态.否则输出字 ...
- 10.MVC框架开发(Ajax应用)
1.MVC自带的Ajax应用, 使用步骤: 第一步,引入js框架 <script src="../../Scripts/jquery-1.4.4.js" type=" ...
- 一步步学习ASP.NET MVC3 (2)——入门程序
请注明转载地址:http://www.cnblogs.com/arhat 在上一节中,我们只是简单的介绍了什么是MVC及MVC的运行原理.而本节呢,主要来实现下一ASP.NET MVC3的开发流程,并 ...
- 服务器环境搭建系列(一)-Apache篇
一.Apache 1.解压缩tar包httpd-2.2.22.tar.gz,这里默认放在/opt下 tar -zxvf httpd-2.2.22.tar.gz 2.进入解压缩后的文件夹 cd http ...
- 纯JavaScript实现一些小功能
题目链接:http://wenku.baidu.com/link?url=7Gbarr5q9X6h1QFRVAsHmfPp1xXagG209mvrJqBogseb4WLeRqbVKwxQieoh8SL ...
- RubyCritic:一款不错的检测代码质量工具
关注代码质量是高效开发必须要做的一件事,那么在 Ruby 开发的过程中,是否有什么好的代码质量检测工具呢?下面由 Ruby 工程师路英瑞介绍一下 RubyCritic--一款还不错的代码质量检测工具. ...
- http://www.linuxidc.com/Linux/2015-02/114265.htm
http://www.linuxidc.com/Linux/2015-02/114265.htm
- sql 复杂自动编号错误批量修改方案
[一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/5133953.html] 前提:自动编号为18位,前4位是年份,中间10位是XXXX,最后四位 ...