目录
1. 内部类
概述
就是在一个类中定义一个类,例如:类A就是外部类.类B在外部类中,称为内部类
格式:
public class 类A{
修饰符 class 类B{
}
}
内部类的访问特点
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
package com.itheima;
public class Outer {
//内部类访问特点:
//内部类可以直接访问外部类的成员,包括私有
//外部类不能访问内部类的成员,必须创建对象
private int num = 10;
public class Inner {
public void show() {
System.out.println("内部类的show方法");
}
}
public void method() {
//show();报错
//创建内部类对象
Inner i= new Inner();
i.show();
}
}
成员内部类
在类的成员位置:
格式:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
package com.itheima;
//创建一个外部类
public class Outer1 {
//私有一个成员变量
private int num = 10;
//创建一个外部类方法
public void show(){
System.out.println("外部类的show方法");
}
//创建一个内部类
public class Inner{
public void method(){
System.out.println("创建一个内部类的method方法");
}
}
}
//创建一个测试类
class OuterDemo{
public static void main(String[] args) {
//创建对象,调用外部类方法
Outer1 outer = new Outer1();
outer.show();
// 创建内部类对象,调用内部类方法
//格式:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
Outer1.Inner oi = new Outer1().new Inner();
oi.method();
}
}
当内部类被private(私有),想要访问内部类,如果想要访问
1.要先创建一个方法,创建内部类对象访问内部类
2.再通过创建外部类对象访问方法间接实现的访问内部类
package com.itheima;
//创建一个外部类
public class Outer1 {
//私有一个成员变量
private int num = 10;
//创建一个私有内部类,其他类不能访问,只能在本类中访问
private class Inner{
public void method(){
System.out.println(num);
}
}
//1.创建一个方法,创建内部类对象访问内部类方法
public void show(){
Inner i = new Inner();
i.method();
}
}
//创建一个测试类
class OuterDemo{
public static void main(String[] args) {
//2.创建对象,调用外部类方法,从而实现访问私有内部类
Outer1 outer = new Outer1();
outer.show();
}
}
局部内部类
是在方法中定义的类,所以外界无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以直接访问方法内的局部变量
package com.itheima;
//局部内部类,在类的方法中
public class Outer2 {
//私有一个成员变量1
private int num = 10;
//创建一个成员方法
public void show(){
//外部类成员变量2
public int num2 = 20;
//创建局部内部类
class Inner{
//方法内局部变量3
int num3 = 30;
public void method(){
System.out.println(num);
System.out.println(num2);
System.out.println(num3);
}
}
//因为是在方法中定义的类,外部无法直接使用,需要在方法内创建对象来调用内部类的方法
Inner i = new Inner();
i.method();
}
}
//测试类
class Demo{
public static void main(String[] args) {
//创建对象,调用方法
Outer2 outer2 = new Outer2();
outer2.show();
}
}
匿名内部类
前提:存在一个类或者接口,这个类可以是具体类也可以是抽象类
位置:外部类的方法中同局部内部类
特点:
-
匿名内部类是一个没有名字的内部类
-
匿名内部类写出来就会产生一个匿名内部类的对象
-
匿名内部类的对象类型相当于是当前new的那个类型的子类类型
格式:
new 类名或接口名(){
重写方法;
};
本质:是一个继承了该类的子类匿名对象,或者是一个实现类该接口的实现类匿名对象
package com.itheima;
//外部类
public class Out {
public void method(){
//匿名内部类,本质上是对象,
Inter i = new Inter() {
@Override
public void show() {
System.out.println("匿名内部类中的show方法");
}
};
//调用匿名内部类的方法
i.show();
}
}
//测试类
class OutDemo{
public static void main(String[] args) {
//创建外部类对象
Out out = new Out();
out.method();
}
}