学习:仅总结语法
内部类就是在一个类中定义一个类.
1、内部类的访问特点:
内部类可以直接访问外部类的成员,包括私有
外部类要访问内部类的成员,必须创建对象
2、内部类的分类:
按照内部类在类中定义的位置不同,可以分为如下两种方式
- 在类的成员位置:成员内部类
- 在类的局部位置:局部内部类(类定义在方法中),匿名内部类是局部内部类的一种特殊形式.
3、成员内部类,外界如何创建对象使用?
格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();
一、成员内部类
如果是私有的成员内部类,外界无法直接访问。在方法内部创建成员内部类对象调方法,通过外部类对象调用成员方法
public class Outer {
private int num = 10;
//私有的成员内部类
private class Inner{
public void show(){
System.out.println(num);
}
}
public void method(){
//调用成员内部类,创建对象
Inner i =new Inner();
//在外界无法访问私有的,但是在同一个类中可以访问私有的类
i.show();
}
}
//测试类
public class OuterDemo {
public static void main(String[] args) {
Outer oi = new Outer();
oi.method();
}
}
二、局部内部类
局部内部类是在方法中定义的类,所以局部内部类方法调用外界是无法直接使用,也是间接调用,通过外部类对象调用成员方法,在方法内部创建局部内部类对象调方法
局部内部类类可以直接访问外部类的成员,也可以直接访问方法内的成员变量
//局部内部类
public class Outer {
private int num = 10;
public void method(){
int num2 = 20;
//局部内部类
class Inner {
public void show() {
System.out.println(num);
System.out.println(num2);
}
}
//局部内部类方法调用也是间接调用,通过外部类对象调用成员方法,在方法内部创建局部内部类对象调方法
Inner i = new Inner();
i.show();
}
}
//测试类
public class OuterDemo {
public static void main(String[] args) {
Outer oi = new Outer();
oi.method();
}
}
三、匿名内部类
前提:存在一个类或者接口,这里的类可以是具体类也可以是抽象类
public class Outer {
public void method() {
/*
//匿名内部类
new Inter(){//new应该是一个对象,所以是匿名的对象。匿名内部类本质是匿名的对象
@Override
public void show() {
System.out.println("匿名内部类");
}
}.show(); //.show()对象调方法
*/
//多次调用匿名内部类
Inter i = new Inter() {//new应该是一个对象,所以是匿名的对象。匿名内部类本质是匿名的对象
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show();
i.show();
i.show();
}
}
//测试类
public class OuterDemo {
public static void main(String[] args) {
Outer oi = new Outer();
oi.method();
}
}