浅谈 Java中的静态内部类、匿名内部类、成员式内部类和局部内部类
来源:互联网 发布:网络培训机构排名 编辑:程序博客网 时间:2024/05/16 05:26
内部类可以是静态(static)的,可以使用 public、protected 和 private 访问控制符,而外部类只能使用 public,或者默认。
成员式内部类如同外部类的一个普通成员。
成员式内部类可以使用各种修饰符,包括 public、protected、private、static、final 和 abstract,也可以不写。
若有 static 修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。
非静态内部类中不能声明任何 static 成员。
运行结果:
size=1
局部类有几个重要特性:
运行结果:
5
123
15
注意:匿名类必须继承一个父类或实现一个接口。
运行结果:
eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用。但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
可以看到,匿名类继承了 Person 类并在大括号中实现了抽象类的方法。
成员式内部类
在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员式内部类,它可以直接使用外部类的所有变量和方法,即使是 private 的。外部类要想访问内部类的成员变量和方法,则需要通过内部类的对象来获取。请看下面的代码:
public class Outer{ private int size; public class Inner { public void dostuff() { size++; } } public void testTheInner() { Inner in = new Inner(); in.dostuff(); }}
成员式内部类如同外部类的一个普通成员。
成员式内部类可以使用各种修饰符,包括 public、protected、private、static、final 和 abstract,也可以不写。
若有 static 修饰符,就为类级,否则为对象级。类级可以通过外部类直接访问,对象级需要先生成外部的对象后才能访问。
非静态内部类中不能声明任何 static 成员。
内部类可以相互调用,例如:
class A { // B、C 间可以互相调用 class B {} class C {}}
成员式内部类的访问
内部类的对象以成员变量的方式记录其所依赖的外层类对象的引用,因而可以找到该外层类对象并访问其成员。该成员变量是系统自动为非 static 的内部类添加的,名称约定为“outClassName.this”。1) 使用内部类中定义的非静态变量和方法时,要先创建外部类的对象,再由“outObjectName.new”操作符创建内部类的对象,再调用内部类的方法,如下所示:
public class Demo{ public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.dostuff(); }}class Outer{ private int size; class Inner{ public void dostuff() { size++; } }}
2) static 内部类相当于其外部类的 static 成员,它的对象与外部类对象间不存在依赖关系,因此可直接创建。示例如下:
public class Demo{ public static void main(String[] args) { Outer.Inner inner = new Outer.Inner(); inner.dostuff(); }}class Outer{ private static int size; static class Inner { public void dostuff() { size++; System.out.println("size=" + size); } }}
运行结果:
size=1
3) 由于内部类可以直接访问其外部类的成分,因此当内部类与其外部类中存在同名属性或方法时,也将导致命名冲突。所以在多层调用时要指明,如下所示:
public class Outer{ private int size; public class Inner{ private int size; public void dostuff(int size){ size++; // 局部变量 size; this.size; // 内部类的 size Outer.this.size++; // 外部类的 size } }}
局部内部类
局部内部类(Local class)是定义在代码块中的类。它们只在定义它们的代码块中是可见的。局部类有几个重要特性:
- 仅在定义了它们的代码块中是可见的;
- 可以使用定义它们的代码块中的任何局部 final 变量;
- 局部类不可以是 static 的,里边也不能定义 static 成员;
- 局部类不可以用 public、private、protected 修饰,只能使用缺省的;
- 局部类可以是 abstract 的。
请看下面的代码:
public class Outer { public static final int TOTAL_NUMBER = 5; public int id = 123; public void func() { final int age = 15; String str = "http://www.weixueyuan.net"; class Inner { public void innerTest() { System.out.println(TOTAL_NUMBER); System.out.println(id); // System.out.println(str);不合法,只能访问本地方法的final变量 System.out.println(age); } } new Inner().innerTest(); } public static void main(String[] args) { Outer outer = new Outer(); outer.func(); }}
运行结果:
5
123
15
匿名内部类
匿名内部类是局部内部类的一种特殊形式,也就是没有变量名指向这个类的实例,而且具体的类实现会写在这个内部类里面。注意:匿名类必须继承一个父类或实现一个接口。
不使用匿名内部类来实现抽象方法:
abstract class Person { public abstract void eat();}class Child extends Person { public void eat() { System.out.println("eat something"); }}public class Demo { public static void main(String[] args) { Person p = new Child(); p.eat(); }}
运行结果:
eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用。但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类。使用匿名内部类实现:
abstract class Person { public abstract void eat();}public class Demo { public static void main(String[] args){ // 继承 Person 类 new Person() { public void eat() { System.out.println("eat something"); } }.eat(); }}
0 0
- 浅谈 Java中的静态内部类、匿名内部类、成员式内部类和局部内部类
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- Java静态内部类、匿名内部类、成员式内部类和局部内部类
- Java静态内部类、匿名内部类、成员式内部类和局部内部类
- Java静态内部类、匿名内部类、成员式内部类和局部内部类
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、局部内部类、静态内部类、匿名内部类)
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- Java内部类(成员内部类、静态内部类、局部内部类、匿名内部类)小结
- java成员内部类、局部内部类、静态内部类和匿名内部类
- Lesson_for_java_day18--java中的内部类(成员内部类、局部内部类,静态内部类,匿名内部类)
- Java 各种内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- Java 内部类(分四种:成员内部类、局部内部类、静态内部类和匿名内部类)
- Java 内部类(成员内部类、局部内部类、静态内部类和匿名内部类)
- java入门教程-5.2Java静态内部类、匿名内部类、成员式内部类和局部内部类
- 成员内部类、局部内部类、静态内部类和匿名内部类区别
- java_web 学习记录(五):ServletContext
- Java程序员修炼之道—并发编程
- 红宝书 第10章整理——DOM
- 167. Two Sum II
- C++实验4——输出星号图
- 浅谈 Java中的静态内部类、匿名内部类、成员式内部类和局部内部类
- 解决easyui日期时间框ie的兼容问题
- Codeforces772C
- 【精华分享】【Unity&独立游戏&音效】免费音效网站总览
- uvm之寄存器模型
- Hive 数据导入HBase的2种方法详解
- 稳定排序:插入排序
- 重绘requestLayout() invalidate()和postInvalidate()
- 【2017.04.19】腾讯二面面经