什么是内部类 ?
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。可以把内部类理解成寄生,外部 类理解成宿主。
如果一个事物的内部包含了另一个事物,那么这就是一个类内部包含另一个类(面对对象思想)
eg:身体和心脏的关系,汽车和发动机
内部类是Java类的五大成份之一,也是我们后一个需要学习的成份。
什么时候使用内部类
一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用
1. 人里面有一颗心脏。
2. 汽车内部有一个发动机。
3. 为了实现更好的封装性
内部类的分类
按定义的位置来分
1. 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)
2. 实例内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)
3. 局部内部类,类定义在方法内
4. 匿名内部类。一般定义在方法中,或者可执行代码中
静态内部类
静态内部类特点:
有static修饰的内部类,属于外部类本身的。
总结:静态内部类与其他类的用法完全一样。只是访问的时候需要加上外部类.内部类。
拓展:静态内部类可以直接访问外部类的静态成员。
静态内部类对象的创建格式:
外部类.内部类 变量 = new 外部类.内部类构造器;
eg:
// 外部类:Outer01 class Outer01{
private static String sc_name = "外部类";
// 内部类: Inner01
public static class Inner01{ // 这里面的东西与类是完全一样
private String name;
public Inner01(String name) {
this.name = name;
}
public void showName(){
System.out.println(this.name); // 拓展:静态内部类可以直接访问外部类的静态成员。 System.out.println(sc_name);
}
}
}
public class InnerClassDemo01 {
public static void main(String[] args) {
// 创建静态内部类对象。
// 外部类.内部类 变量 = new 外部类.内部类构造器;
Outer01.Inner01 in = new Outer01.Inner01("张三");
in.showName(); }
实例成员内部类
特点
无static修饰的内部类,属于外部类对象的。
宿主:外部类对象
成员内部类的定义格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
//.........
}
//...
}
如何使用成员内部类?有两种方式:
1.间接方式:在外部类的方法中,使用内部类
//外部类
public class Body {
//外部类的成员属性
private String name;
//外部类的构造方法
public Body(String name) {
this.name = name;
}
//成员内部类(类中方法外)
public class Heart{
public void innerShow(){
//内部类可以随意访问外部类的属性与方法
System.out.println("我是内部类:外面类的名称:"+name);
}
}
public void methodBody(){
System.out.println("我是外部类的方法,我要调用内部类的方法:");
//在外部类的方法中,使用内部类
Heart heart=new Heart();
heart.innerShow();
}
}
2.直接方式:公式:外部类名称.内部类名称 对象名=new 外部类().new 内部类()
public class BodyTest {
public static void main(String[] args) {
//1.间接方式使用内部类
Body body=new Body("大壮");
body.methodBody();
//2.直接方式使用内部类
//公式:外部类名称.内部类名称. 对象名=new 外部类名称().new内部类();
Body.Heart heart=new Body("小壮").new Heart();
heart.innerShow();
}
}
运行生成的Class文件:
Body.classt和Body$Heart.class和BodyTest.class
注意:内部类访问外部类,随意访问 外部类访问内部类,需要通过内部类的对象来进行访问
成员内部类的变量与外部类的变量重名分别调用的例子:
//如果出现重名现象,得到外部类的重名变量:外部类名称.this.变量名 public class Outer { //外部类的重名成员变量 private int num=20; public class Inner{ //内部类的重名成员变量 public int num=10; public void methodInner(){ //内部类方法的局部重名变量 int num=30; System.out.println("局部重名变量:"+num);//就近原则 System.out.println("内部类的重名成员变量:"+this.num); System.out.println("外部类的重名成员变量"+Outer.this.num); } } }
/** * 测试外部类与内部类重名属性的调用 * 内部类使用外部类的重名属性的公式:外部类名称.this.属性名 */ public class OuterDemo { public static void main(String[] args) { //直接方式使用内部类:外部类名称.内部类名称 对象名=new 外部类名称().new内部类名称() Outer.Inner inner=new Outer().new Inner(); inner.methodInner(); } }