在 Java 中,内部类(Inner Class) 是定义在另一个类内部的类,用于为外部类提供特定服务。
一、成员内部类
成员内部类无static修饰,属于外部类的对象。
特点:成员内部类可以访问外部类的所有成员,包括私有的。成员内部类可以用外部类名.this拿到当前寄生的外部类的对象。
创建成员内部类
外部类名.内部类名 对象名 = new 外部类名(...).new 内部类名(...)
示例
package InnerclassDemo1;
//外部类
public class Outer {
//无static修饰,属于外部类的对象
public static void run(){}
public void run1(){}
public class Inner{
private String name;
public Inner(){ } //无参构造器
//有参构造器
public Inner(String name){
this.name = name;
}
public void show(){
System.out.println("外部类调用内部类方法");
run1();
run();
//内部类访问外部类成员,无论是静态方法还是实例方法都可以访问,成员变量同理
System.out.println(this); //内部类对象this
System.out.println(Outer.this); //外部类对象this
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
package InnerclassDemo1;
public class InnerclassDemo {
//成员内部类创建对象的格式
public static void main(String[] args) {
Outer.Inner oi = new Outer().new Inner();
oi.show();
oi.setName("小明");
//成员内部类访问外部类成员的特点
//1.成员内部类可以访问外部类的所有成员,包括私有的
//2、成员内部类的实例方法中,可以拿到当前寄生的外部类对象,外部类名.this
}
}
class People{
private int HeartBeat=60;
public class Heart{
int HeartBeat=80;
public void beat(){
int HeartBeat=90;
System.out.println("心脏一分钟跳动次数"+HeartBeat); //访问当前方法的变量
System.out.println("心脏一分钟跳动次数"+this.HeartBeat); //访问当前内部类的成员变量
System.out.println("心脏一分钟跳动次数"+People.this.HeartBeat); //访问外部类的成员变量
}
}
}
上述代码定义了一个Outer类,Inner是其的内部类。内部类可以调用Outer外部类的所有成员(实例成员,静态成员,实例方法,静态方法)。内部类若是有一个与外部类名称与类型相同的成员变量,可以用外部类名.this.变量名在内部类中访问外部类对应的成员变量(如上述代码中的People.this.HeartBeat)。
二、静态内部类
静态内部类有static修饰,属于外部类,因此无法调用外部类的实例方法与实例成员,因为他们属于对象。但静态内部类可以直接访问外部类的静态成员与静态方法。
创建静态内部类
外部类名.内部类名 对象名 = new 外部类名.内部类名(...)
示例
package StaticInnerClassDemo;
//外部类
public class Outter {
private String id;
private static String name="CodeBlossom";
public static void run(){
System.out.println("外部类run方法");
}
public void run1(){
System.out.println("外部类run1方法");
}
//静态内部类
public static class Inner{
//静态内部类不能访问外部类的实例成员变量和方法
private String age;
public void show(){
run();
//run1();
//System.out.println(id); //报错,静态内部类不能访问外部类的实例成员变量和方法
System.out.println("外部类name:"+name);
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
}
package StaticInnerClassDemo;
public class StaticInnerClassDemo1 {
public static void main(String[] args) {
//认识静态内部类
Outter.Inner oi = new Outter.Inner();
oi.show();
}
}