一.成员内部类
定义在另一个类的内部,而且与成员方法和属性平级叫成员内部类。
注意:1.成员内部类中不能存在static关键字,即,不能声明静态属性、静态方法、静态代码块等。
2.在成员内部类中访问外部类的成员方法和属性,要使用“外部类名.this.成员方法”和“外部类名.this.成员属性”的形式 。
3.创建成员内部类的实例使用“外部类名.内部类名 实例名 = 外部类实例名.new 内部类构造方法(参数)”的形式。在创建内部类实例之前需要先创建外部类的实例对象。
4.内部类的定义文件名形式是“外部类定义名$内部类定义名”
java代码:
public class Girl { //成员内部类 class Boy { public void go(){ System.out.println("女神,我们今晚去约会"); } } public void go(){ Boy boy = new Boy(); boy.go(); } public static void main(String[] args) { Girl girl = new Girl(); girl.go(); } }
运行结果:女神,我们今晚去约会
二.方法内部类
含义:定义在代码块、方法体内、作用域(使用花括号“{}”括起来的一段代码)内的类叫局部内部类。
1.局部内部类只能在代码代码块、方法体内和作用域中使用(创建对象和使用类对象)
2.局部内部类的定义可以使用abstract修饰,声明为抽象类
代码如下:
package com.test.two; public class RestStart { public void soEase(){ System.out.println("没事,可以重装系统"); } }
package com.test.two; public class Computer { //方法内部类 public void play(){ System.out.println("电脑中了病毒"); class A extends RestStart{ } new A().soEase(); System.out.println("完全没有问题"); } public static void main(String[] args) { new Computer().play(); } }
运行结果:
电脑中了病毒
没事,可以重装系统
完全没有问题
三.匿名内部类
1.匿名内部类只能和new连用,用于创建一个实例。匿名内部类只能使用一次,创建实例之后,类定义会立即消失(想要多次使用就要用到反射的知识了)。
2.匿名内部类必须继承一个类(抽象的、非抽象的都可以)或者实现一个接口。如果父类(或者父接口)是抽象类,则匿名内部类必须实现其所有抽象方法。
1.定义一个抽象类
package com.test.three; public abstract class Work { public abstract void night(); }
2.定义一个类继承抽象类
package com.test.three; public abstract class Teacher extends Work{ @Override public void night() { } public void dayTime(){ System.out.println("讲课"); } }
3.执行测试
package com.test.three; public class TestOne { public static void main(String[] args) { Teacher t = new Teacher(){ public void night(){ System.out.println("批改作业"); } }; t.dayTime(); t.night(); } }
4.运行结果:
讲课
批改作业