一、什么是内部类
定义:把类定义在其他类的内部,这个类被称为内部类(嵌套类)。
内部类的分类:成员内部类、静态内部类、局部内部类、匿名内部类。
二、成员内部类
书写格式:
class outer{
class Inner{
public void method(){
System.out.println("hello world");
}
}
}
创建对象:
格式:外部类名.内部类名 成员内部类对象名 = 外部类对象.new 内部类构造函数();
public class Demo11_InterClass {
public static void main(String[] args){
outer.Inner oi = new outer().new Inner(); //创建内部类
}
}
1.成员内部类可以直接访问其所在的外部类的非静态成员变量和静态的成员变量
2.外部类和内部类成员变量相同时: 获取的变量值采取的是就近原则
3.成员内部类的成员方法可以访问其所在的外部类的所有成员方法(不论是否公有,不论是否静态)
二、静态内部类
格式:
class outer{
static class Inner{
public void method(){
System.out.println("hello world");
}
}
}
创建对象:
格式:外部类名.内部类名 成员内部类对象名 = 外部类对象.静态内部类构造函数();
1.静态内部类中不论是静态的成员方法,还是非静态的成员方法,只能访问其所在的外部类的静态成员变量
2.静态内部类中不论是静态的成员方法,还是非静态的成员方法,只能访问其所在的外部类的静态成员方法
三、局部内部类
格式:
// 外部类
class OuterClass12 {
// 成员方法
public Object showByOuter() {
// 局部内部类
class InnerClass12 {
}
// 在外部类的成员方法中实例化局部内部类
InnerClass12 innerClass12 = new InnerClass12();
return innerClass12;
}
创建对象:
格式:只能通过其所在的外部类的成员方法返回在成员方法中创建出的局部内部类对象
OuterClass12 outerClass12 = new OuterClass12();
System.out.println(outerClass12.showByOuter());
1.局部内部类中可以直接访问其所在的外部类的非静态的成员变量 和 静态的成员变量
2.局部内部类中可以直接访问其所在的外部类的非静态的成员方法 和 静态的成员方法
四、匿名内部类
格式:
interface inter{
public abstract inter print();
}
class Outer2{
class Inner5 implements inter{
public inter print(){
System.out.println("匿名内部类");
return null;
}
}
}
创建格式:
格式:通过调用匿名内部类所在的外部类的成员方法
1.匿名内部类没有构造函数,且使用者无法创建构造函数,但是实际上JDK为匿名内部类生成了构造函数
2.匿名内部类的成员方法中可以访问其所在的外部类的成员变量(不论是否公有私有,不论是否静态非静态),变量相同时也是就近原则