内部类可以是静态(static)的,可以使用 public、protected 和 private 访问控制符,而外部类只能使用 public,或者默认。

成员式内部类

在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员式内部类,它可以直接使用外部类的所有变量和方法,即使是 private 的。外部类要想访问内部类的成员变量和方法,则需要通过内部类的对象来获取。

请看下面的代码:

  1. public class Outer{
  2. private int size;
  3. public class Inner {
  4. public void dostuff() {
  5. size++;
  6. }
  7. }
  8. public void testTheInner() {
  9. Inner in = new Inner();
  10. in.dostuff();
  11. }
  12. }

成员式内部类如同外部类的一个普通成员。

成员式内部类可以使用各种修饰符,包括 public、protected、private、static、final 和 abstract,也可以不写。

若有 static 修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。

非静态内部类中不能声明任何 static 成员。

内部类可以相互调用,例如:

  1. class A {
  2. // B、C 间可以互相调用
  3. class B {}
  4. class C {}
  5. }

成员式内部类的访问

内部类的对象以成员变量的方式记录其所依赖的外层类对象的引用,因而可以找到该外层类对象并访问其成员。该成员变量是系统自动为非 static 的内部类添加的,名称约定为“outClassName.this”。

1) 使用内部类中定义的非静态变量和方法时,要先创建外部类的对象,再由“outObjectName.new”操作符创建内部类的对象,再调用内部类的方法,如下所示:

  1. public class Demo{
  2. public static void main(String[] args) {
  3. Outer outer = new Outer();
  4. Outer.Inner inner = outer.new Inner();
  5. inner.dostuff();
  6. }
  7. }
  8. class Outer{
  9. private int size;
  10. class Inner{
  11. public void dostuff() {
  12. size++;
  13. }
  14. }
  15. }

2) static 内部类相当于其外部类的 static 成员,它的对象与外部类对象间不存在依赖关系,因此可直接创建。示例如下:

  1. public class Demo{
  2. public static void main(String[] args) {
  3. Outer.Inner inner = new Outer.Inner();
  4. inner.dostuff();
  5. }
  6. }
  7. class Outer{
  8. private static int size;
  9. static class Inner {
  10. public void dostuff() {
  11. size++;
  12. System.out.println(“size=” + size);
  13. }
  14. }
  15. }

运行结果:
size=1

3) 由于内部类可以直接访问其外部类的成分,因此当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以在多层调用时要指明,如下所示:

  1. public class Outer{
  2. private int size;
  3. public class Inner{
  4. private int size;
  5. public void dostuff(int size){
  6. size++; // 局部变量 size;
  7. this.size; // 内部类的 size
  8. Outer.this.size++; // 外部类的 size
  9. }
  10. }
  11. }

局部内部类

局部内部类(Local class)是定义在代码块中的类。它们只在定义它们的代码块中是可见的。

局部类有几个重要特性:

  1. 仅在定义了它们的代码块中是可见的;
  2. 可以使用定义它们的代码块中的任何局部 final 变量;
  3. 局部类不可以是 static 的,里边也不能定义 static 成员;
  4. 局部类不可以用 public、private、protected 修饰,只能使用缺省的;
  5. 局部类可以是 abstract 的。

请看下面的代码:

  1. public class Outer {
  2. public static final int TOTAL_NUMBER = 5;
  3. public int id = 123;
  4. public void func() {
  5. final int age = 15;
  6. String str = “http://www.weixueyuan.net”;
  7. class Inner {
  8. public void innerTest() {
  9. System.out.println(TOTAL_NUMBER);
  10. System.out.println(id);
  11. // System.out.println(str);不合法,只能访问本地方法的final变量
  12. System.out.println(age);
  13. }
  14. }
  15. new Inner().innerTest();
  16. }
  17. public static void main(String[] args) {
  18. Outer outer = new Outer();
  19. outer.func();
  20. }
  21. }

运行结果:
5
123
15

匿名内部类

匿名内部类是局部内部类的一种特殊形式,也就是没有变量名指向这个类的实例,而且具体的类实现会写在这个内部类里面。

注意:匿名类必须继承一个父类或实现一个接口。

不使用匿名内部类来实现抽象方法:

  1. abstract class Person {
  2. public abstract void eat();
  3. }
  4. class Child extends Person {
  5. public void eat() {
  6. System.out.println(“eat something”);
  7. }
  8. }
  9. public class Demo {
  10. public static void main(String[] args) {
  11. Person p = new Child();
  12. p.eat();
  13. }
  14. }

运行结果:
eat something

可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用。但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

这个时候就引入了匿名内部类。使用匿名内部类实现:

  1. abstract class Person {
  2. public abstract void eat();
  3. }
  4. public class Demo {
  5. public static void main(String[] args){
  6. // 继承 Person 类
  7. new Person() {
  8. public void eat() {
  9. System.out.println(“eat something”);
  10. }
  11. }.eat();
  12. }
  13. }

可以看到,匿名类继承了 Person 类并在大括号中实现了抽象类的方法。

内部类的语法比较复杂,实际开发中也较少用到,本教程不打算进行深入讲解,各位读者也不应该将内部类作为学习Java的重点。

六. 异常处理
1.异常处理基础
2.异常类型
3.未被捕获的异常
4.try和catch的使用
5.多重catch语句的使用
6.try语句的嵌套
7.throw:异常的抛出
8.throws子句
9.finally块
10.Java的内置异常
11.创建自己的异常子类
12.断言
七. 多线程编程
1.线程的概念
2.Java线程模型
3.主线程
4.创建线程
5.创建多线程
6.isAlive()和join()的使用
7.线程优先级
8.线程同步
9.线程间通信
10.线程死锁
11.线程的挂起、恢复和终止

Java静态内部类、匿名内部类、成员式内部类和局部内部类相关推荐

  1. 浅谈 Java中的静态内部类、匿名内部类、成员式内部类和局部内部类

    内部类可以是静态(static)的,可以使用 public.protected 和 private 访问控制符,而外部类只能使用 public,或者默认. 成员式内部类 在外部类内部直接定义(不在方法 ...

  2. 匿名内部类和局部内部类访问的外部类的局部变量必须是final的

    从java8开始,如果一个外部类的局部变量被匿名内部类访问了,那么系统会自动为该变量加上一个final修饰符,则该变量就不能被重复赋值了. 可参考下面链接中,步骤5处的解释: http://how2j ...

  3. java中有几种内部类,Java中的四种内部类

    四种内部类 在Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的 内部类一般来说包括这四种:静态内部类.匿名内部类.成员内部类和局部内部类,下面我们一一介绍 ...

  4. Java面向对象编程篇4——内部类

    Java面向对象编程篇4--内部类 1.内部类的概念 当一个类的定义出现在另外一个类的类体中时,那么这个类叫做内部类 (Inner),而这个内部类所在的类叫做外部类(Outer). 类中的内容:成员变 ...

  5. Java中的四种内部类

    Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...

  6. JAVA编程学习记录(内部类)

    第四周:内部类 概念:将一个类定义在另一个类中或方法里面,这样的类称为内部类.    //在A类中定义一个B类,B就属于A的内部类 分类:成员内部类.局部内部类.匿名内部类.静态内部类 访问特点: 1 ...

  7. Java面向对象(21)--内部类

    当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类. 在Java中,允许一个类的定义位于另一个类的内部,前者称 ...

  8. 匿名内部类 可以访问外部类_Java 内部类与外部类的互访使用小结

    内部类又称为嵌套类,可以把内部类理解为外部类的一个普通成员. 内部类访问外部类 里面的可以自由访问外面的,规则和static一样.(访问非静态时必须先创建对象) 具体如下: 非静态内部类的非静态方法 ...

  9. java静态内部类单例模式

    public class Singleton {/*** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例* 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载*/priv ...

最新文章

  1. Git Fetch vs Pull:Git Fetch和Git Pull命令之间有什么区别?
  2. .NET Excel 2003 批量插入数据很慢的解决办法
  3. 新手vue构建单页面应用实例
  4. java筑基期(9)----ajaxjson(1)
  5. 我们坚持专业与创新,U can U up
  6. android内部通信handler
  7. hadoop-1.1.2 在Windows环境下的部署
  8. python递归汉诺塔详解_汉诺塔在python中递归,理解磁盘目的地的变化
  9. 大家都在看的公众号是哪几个?
  10. POJ1256 (C++ compare函数)
  11. MyEclipse 2017 CI 10 发布(附下载)
  12. Mobius反演定理-BZOJ2154
  13. iOS底层探索之KVO(三)—自定义KVO
  14. WINDOWS.H already included.MFC apps must not #include windows.h
  15. Unomi 成为 Apache 软件基金会顶级项目
  16. 连连看游戏寻找能成功消除的算法
  17. 随便说说,关于电吉他这个爱好
  18. 计算机专业软件工程的二本大学有哪些,全国软件工程专业大学排名 一本二本大学名单...
  19. 辅音字母组合功能音中的浊化现象
  20. cesium 直接加载 geotiff 影像图

热门文章

  1. 0-1背包问题优化算法详解
  2. 四维空间引发-维度空间(0-10)来自我的教授的班长
  3. tp论坛 分页(三)
  4. 【uiautomator】UiDevice
  5. 工预-Navicat for MYSQL
  6. Python读入CIFAR-10数据库
  7. Win10:tensorflow 学习笔记(1)
  8. 程序基础:数据结构(郝斌讲解)(4)
  9. synergy在Windows和Linux下使用全攻略(多台PC共享一套键盘鼠标)
  10. USTC English Club Note20171022