内部类
面向对象程序设计中,可以在一个类的内部定义另一个类
内部类的分类
在Java中内部类主要分为成员内部类、静态内部类、方法内部类、匿名内部类
成员内部类
存在于某个类的内部,与全局属性或者方法同级的内部类就是成员内部类。
特征:
- 成员内部类内部不允许存在任何static变量或方法
- 成员内部类是依附外部类的,只有创建了外部类才能创建内部类。
- 虽然是定义在类的内部,但是内部类和外部类并不是继承关系。
- 成员内部类定义在外部类的成员位置上。
- 会生成两个.class文件,一个是Outer.class,一个是Inner.class。
- 成员内部类可以访问外部类的静态和非静态的方法和成员变量。
package com.demo.Inner;
import com.demo.Inner.Outer.Inner;
class Outer {
private String name = "xiaoming";
public static int age = 20;
//成员内部类
class Inner{
public int num = 18;
public void fun(){
System.out.println(name);
System.out.println(age);
}
}
}
class Test{
public static void main(String[] args) {
//只有创建了外部类才能创建内部类
Outer outer = new Outer();
Inner inner = outer.new Inner();
}
}
静态内部类
static修饰的内部类我们称之为静态内部类
特征:
- 静态内部类的创建不需要依赖外部类可以直接创建。.静态内部类不可以使用任何外部类的非static类(包括属性和方法),但可以存在自己的成员变量。
- 静态内部类如果要访问外部的成员变量或者成员方法,那么必须是静态的。
- 会生成两个.class文件,一个是外部的类Outer.class , 另一个是 Outer$Inner.class
- 静态内部类属于外部类,而不是属于外部类的对象。
package com.demo.Inner;
import com.demo.Inner.Outer.Inner;
class Outer {
private static String name = "xiaoming";
public static int age = 20;
//静态内部类
static class Inner{
public int num = 18;
public void fun(){
System.out.println(name);
System.out.println(age);
}
}
}
class Test{
public static void main(String[] args) {
Inner inner = new Outer.Inner();
}
}
方法内部类
方法内部类顾名思义就是定义在方法里的类
特征:
- 方法内部类就是定义在外部类的方法中,方法内部类只在该方法内可以用;
- 由于方法内部类不能在外部类的方法以外的地方使用,所以方法内部类不允许使用访问权限修饰符(public、private、protected)均不允许和static 修饰符。
- 方法内部类对外部完全隐藏,除了创建这个类的方法可以访问它以外,其他地方均不能访问 (换句话说其他方法或者类都不知道有这个类的存在)方法内部类对外部完全隐藏,除了创建这个类的方法可以访问它,其他地方均不能访问。
- 方法内部类如果想要使用方法形参,该形参必须使用final声明(JDK8形参变为隐式final声明)
package com.demo.Inner;
class Outer {
private static String name = "xiaoming";
public static int age = 20;
public void getfun(){
//方法内部类
class Inner{
public int num = 18;
public void fun(){
System.out.println(name);
System.out.println(age);
}
}
}
}
class Test{
public static void main(String[] args) {
Outer outer = new Outer();
//通过调用外部类方法创建
outer.getfun();
}
}
匿名内部类
匿名内部类就是一个没有名字的方法内部类
特征:
- 匿名内部类不能定义任何静态成员、方法。
- 匿名内部类中的方法不能是抽象的;
- 匿名内部类必须实现接口或抽象父类的所有抽象方法。
- 匿名内部类没有类名,因此没有构造方法。
- 匿名内部类访问的外部类成员变量或成员方法必须用static修饰;
- 内部类可以访问外部类私有变量和方法。
package com.demo.Inner;
interface MyInterface {
//接口中方法没有方法体
void test();
}
class Outer {
private static String name = "xiaoming";
public static int age = 20;
public void getfun(){
//匿名内部类,匿名的实现了MyInterface接口
//隐藏的class声明
new MyInterface()
{
public void test()
{
System.out.println("匿名实现MyInterface接口");
System.out.println(age);
}
}.test();
}
}
class Test{
public static void main(String[] args) {
Outer outer = new Outer();
//通过调用方法创建
outer.getfun();
}
}