什么是内部类

把类定义在其他类的内部,这个类就被称为内部类。

内部类的分类

内部类分为两种,分别为成员内部类和局部内部类:

  1. 成员内部类:和成员变量和成员方法定义在同级
  2. 局部内部类:和局部变量定义在同级,包括在构造方法,成员方法体和静态方法体中
class Outer {

    class InnerA {//成员内部类
} {
class InnerB {//局部内部类
}
} static {
class InnerC {//局部内部类
}
} public Outer() {
class InnerD { //局部内部类
}
} public void show() {
class InnerE {//成员内部类
}
}
}

成员内部类访问特点

  1. 内部类可以直接访问外部类的全部成员。
  2. 外部类要访问内部类的成员,必须创建对象。
  3. 成员内部类一般多用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();
}
}

局部内部类访问特点

  1. 可以直接访问外部类的全部成员
  2. 在局部位置,可以创建内部类对象来使用局部内部类提供的功能
  3. 局部内部类访问局部变量必须用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内部类的更多相关文章

  1. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  2. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  4. Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock)

    Java基础-Java中的并法库之重入读写锁(ReentrantReadWriteLock) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在学习Java的之前,你可能已经听说过读 ...

  5. Java基础-Java中的并法库之线程池技术

    Java基础-Java中的并法库之线程池技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是线程池技术 二.

  6. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  7. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  8. Java基础-Java数据类型

    Java基础-Java数据类型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据类型的作用 数据类型就是一组值,以及这一组值上的操作,数据类型可以决定数据的存储方式,取值范围 ...

  9. java基础之 内部类

    Java中的内部类共分为四种: 静态内部类static inner class (also called nested class) 成员内部类member inner class 局部内部类loca ...

  10. Java基础(53):内部类(转)

    java中的内部类总结 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行 ...

随机推荐

  1. Django数据操作

    1.一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录. 2.管理器和查询集. 查询集QuerySet表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤 ...

  2. java单例模式使用及注意事项

    1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstan ...

  3. lettcode-102:Binary Tree Level Order Traversal (Java)

    Binary Tree Level Order Traversal 二叉树的层序遍历 两种方式: 1.用两个queue交替表示每一层的节点 2.用两个node,一个表示当前层的最后一个节点,一个表示下 ...

  4. bzoj 4004: [JLOI2015]装备购买 拟阵 && 高消

    4004: [JLOI2015]装备购买 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 337  Solved: 139[Submit][Status ...

  5. easyui源码翻译1.32--panel(面板)

    前言 昨天发布了表格datagrid的翻译源码 ,easyui的许多插件有依赖关系  比如datagrid 的渲染需要panel.resizable.linkbutton.pagination   今 ...

  6. H2O与Java线程同步

    Java 5以前的线程同步采用syncronized和wait,notify,notifyAll来实现,比较粗糙.之后有了Lock和Condition.ReentrantLock的简单lock,unl ...

  7. Android网络请求心路历程

    HTTP请求&响应 既然说从入门级开始就说说Http请求包的结构.一次请求就是向目标服务器发送一串文本.什么样的文本?有下面结构的文本.HTTP请求包结构 例子: 1 2 3 4 5 6 7 ...

  8. Shell编程学习---第五篇:Shell的输入和输出

    在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或 者指定一个文件作为输入.对于输出也是一样:如果不指定某个文件作为输出,标准输出总 是和终端屏幕相关联.如果所使用命令 ...

  9. wzplayer V1.6正式版(无限制)不支持加密版本 2014-07-08

    2014-07-08 修复部分视频倾斜问题,同时给受影响的客户给予更新. wzplayer V1.6正式版(无限制)不支持加密版本 发布于官方,下载地址wzplayer V1.6正式版(无限制)不支持 ...

  10. MPlayer

    名称   mplayer − 电影播放器 mencoder − 电影编解码器 概要   mplayer [选项] [文件|URL|播放列表|−] mplayer [选项] 文件1 [指定选项] [文件 ...