四种内部类详解
内部类分为:成员内部类 、 局部内部类、匿名内部类 、静态内布类
一、成员内部类
位置:定义在外部类内部 , 和成员方法,变量位置 级别 都一样;
成员内部类可以直接访问外部类的 ”所有 “ 成员变量和成员方法,但如果在外部类访问 内部类内 的 属性和方法,则需要在外部类创建内部类的对象访问。
成员内部类的实例化方式:外部类.内部类 对象名 = 外部类对象 . new 内部类();
例:test3 . Inner inner = test . new Inner();
public class test3 {
private String name = "张三";
private Integer age = 22;
public void show(){
System.out.println("调用成员方法");
}
//成员内部类
public class Inner{
//成员内部类可以直接访问外部类的属性和方法
public void innerMethod(){
show();
System.out.println("内部类的成员方法");
System.out.println("输出外部类的属性" +"姓名:"+ name +" "+"年龄: " + age);
}
}
public static void main(String[] args) {
//创建外部类对象
test3 test = new test3();
//创建内部类对象
//test3.Inner inner = test.new Inner();
Inner inner = test.new Inner();
//执行内部类方法
inner.innerMethod();
}
}
二、局部内部类:**
位置:定义在成员方法中
在局部内部类中 可以直接访问外部类的所有成员,包含私有的 也可以直接访问方法中的属性
外部类访问局部内部类只能在局部内部类所在的方法中创建对象访问
局部内部类不可以添加访问修饰符
实例化:局部内部类不能用外部类调用实例化,只能在局部内部类定义的 方法中 实例化
public class test3 {
private String name = "张三";
private Integer age = 22;
public void show(){
System.out.println("调用成员方法");
}
public void method(){
String sex = "男";
//局部内部类
class Inner{
private String desc = "局部内部类本质也是一个类,他内部的属性 和 方法 都可以加访问修饰符";
public void innerMethod(){
//调用外部类方法
show();
//打印外部类的属性
System.out.println("姓名: "+ name + " "+ "性别: "+ sex + " "+ "年龄" + age );
//打印内部类的属性
System.out.println("============================");
System.out.println(desc);
}
}
//局部内部类的实例化
Inner inner = new Inner();
inner.innerMethod();
}
public static void main(String[] args) {
test3 test = new test3();
test.method();
}
}
三、匿名内部类
内名内部类是一个没有类名的类 , 他是一个类的同时也是一个对象
匿名内部类是定义在外部类的方法中 ,
匿名内部类中 ,可以直接访问外部类的所有成员,包含私有的 也可以直接访问方法中的属性
public class test3 {
private String name = "张三";
private int age = 22;
public static void main(String[] args) {
Thread thread = new Thread(){
public void run(){
System.out.println("这是匿名内部类");
pong();
}
};
thread.run();
}
public static void pong(){
System.out.println("这是外部类的成员方法,可以直接被匿名内部类访问");
}
}
四、静态内部类
在类中以static修饰符编写的类 位置和成员内部类类似
静态内部类中只能访问静态的方法 或者 静态的变量 ,不能访问外部类中非静态的方法,变量
如果外部类和静态内部类的成员重名时,静态内部类访问的时,默认遵循就近
原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问
实例化:静态内部类可以直接实例化 或者可以直接使用 (静态内部类类名 . 方法名 )调用
public class test3 {
private static String name = "张三";
private static int age = 22;
public static void pong(){
System.out.println("这是外部类的成员方法,可以被静态内部类访问");
}
//定义一个静态内部类
public static class Inner{
//定义静态内部类属性
private static String desc = "这是静态内部属性";
//定义静态内部的方法
public static void inner(){
System.out.println("调用静态内部类属性:" + desc );
System.out.println("===========================");
System.out.println("打印外部类的静态属性" + "姓名: "+ test3.name + "年龄: "+ age);
//访问外部类的静态方法
test3.pong();
}
}
public static void main(String[] args) {
//创建静态内部类对象
Inner inner = new Inner();
inner.inner();
//Inner.inner();
}
}