内部类
我们学习类与对象后,知道了类的定义和使用
也知道抽象类以及包装器类的用法
类中除了定义成员属性和成员方法外
还能添加内部类
概述
内部类(内置类)(嵌套类):定义在另一个类中的类。
特点
- 内部类是编译时的语法,编译后生成两个独立的类。
- 内部类可以访问外部类的任何成员。
- 外部类不能直接访问内部类的成员。
- 内部类可以为静态,
private
、protected
修饰,外部类只能用public
、default
缺省的包访问。 - 用内部类定义在外部类不可访问的属性,实现必外部类的
private
更小的访问权限。
类别
- 成员内部类
- 局部内部类
- 匿名内部类
- 静态内部类
成员内部类
作为外部类的成员存在,与外部类的属性、方法并列。
class OutClass{
//成员属性
private int i;
//成员方法
void print(){
System.out.println("外部类");
}
//内部类
class Inner{
}
}
创建对象
- 在外部类的内部。
Inner i = new Inner();
- 在外部类的外部。
- 建立一个外部类对象
- 生成一个内部类对象
访问
- 在内部类中访问内部类变量。
内部类.this.属性;
- 访问外部类成员
外部类名.this.属性
- 在外部类的外部访问内部类
内部类对象.对象名
局部内部类
在方法中定义的内部类为局部内部类。
局部内部类不能加修饰符private
、public
、protected
class OutClass{
//外包方法
public void print(){
System.out.println("外部类方法");
//局部内部类
class Inner{
//局部内部类方法
public void method(){
}
}
//创建局部内部类对象
Inner in = new Inner();
//调用局部内部类方法
in.method();
}
}
特点
- 局部内部类可以访问外包方法之外的外部类的所以成员
- 局部内部类可以该访问外包方法的参数
- 局部内部类只能访问局部中被
final
修饰的局部变量 - 局部内部类不能声明为接口
使用
使用局部内部类时,需要
- 生成外部类对象
- 通过外部类对象调用外包方法;在方法中才能调用局部内部类
匿名内部类
匿名内部类是局部内部类的使用扩展
只创建类的一个对象,不用对内部类命名。
interface anonymous{
void print();
}
class{
public void print(){
System.out.println("外部类方法");
//匿名内部类
anonymous an = new anonymous(){
//局部内部类方法
public void method(){
}
};
an.method();
}
}
特点
- 匿名类没有类名,必须继承一个类或实现一个接口。不能有显式的
extends
、implements
- 匿名类不能有构造方法,没有匿名。可通过
new 父类名();
创建对象 - 匿名类的创建和定义同时进行
- 匿名类只能一次性的创建对象
- 匿名类可以在方法体中,可以在参数列表中
- 匿名内部类不能是抽象类。
- 匿名内部类必须实现它的抽象父类或者接口里的所有抽象方法
- 匿名内部类一定是在new的后面,其隐含实现一个接口或一个类,没有类名
静态内部类
静态内部类定义在类中,在方法之外。static
修饰
class OutClass{
public void print(){
System.out.println("外部类方法");
}
//静态内部类
protected static class Inner{
}
}
使用
静态内部类的对象可以直接生成。
public class Demo{
public static void main(String args[]){
OutClass.Inner inner = new OutClass.Inner();
}
}
特点
- 静态内部类直接访问外部类的静态成员,不能直接访问外部类的非静态程序
- 静态内部类可定义静态成员,其他内部类不行
- 内部类有静态成员,其内部类也必须为静态。
博客相关java项目:查看Github项目
对应github项目:Inner
导入项目的方法: Java基础——Java如何导入本地项目