内部类概述、成员内部类【了解】
内部类
- 是类中的五大成分之一(成员变量、方法、构造器、内部类、代码块),如果一个类定义在另一个类的内部,这个类就是内部类。
- 场景:当一个类的内部,包含了一个完整的事务,且这个事务没有必要单独设计时,就可以把这个事务设计成内部类。
public class Car{ //内部类 public class Engine{ } }
内部类有四种形式
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
成员内部类的具体形式:
public class Outer{ //成员内部类 public class Inner{ //也可以和外部类一样定义变量 private String name; public static String schoolName; //JDK 16之前,成员内部类是不支持定义静态成员的。 public void test(){ } public String getName(){ return name; } public void setName(String name){ this.name = name; } } }
成员内部类的调用方式:
public class Test{ public static void main(String[] args){ Outer.Inner in = new Outer().new Inner(); //需要new两次 } }
注意:在内部类的成员方法中可以直接访问外部类的成员。
看以下情形:
public class Outer{ private int age = 99; //成员内部类 public class Inner{ //也可以和外部类一样定义变量 private String name; private int age = 88; public static String schoolName; //JDK 16之前,成员内部类是不支持定义静态成员的。 public void test(){ int age = 66; //此处我想要分别打印出66、88和99 //应该如何调用呢? } public String getName(){ return name; } public void setName(String name){ this.name = name; } } }
如代码所示,在外部类的变量、在内部类的变量和在内部类方法内的变量,我们分别把它输出出来:
public class Outer{ private int age = 99; //成员内部类 public class Inner{ //也可以和外部类一样定义变量 private String name; private int age = 88; public static String schoolName; //JDK 16之前,成员内部类是不支持定义静态成员的。 public void test(){ int age = 66; System.out.println(age); // 66 System.out.println(this.age); // 88 System.out.println(Outer.this.age); // 99 } public String getName(){ return name; } public void setName(String name){ this.name = name; } } }
成员内部类中访问其他成员的特点:
- 和前面学过的实例方法一样,成员内部类的实例方法中,同样可以直接访问外部类的实例成员、静态成员。
- 可以在成员内部类的实例方法中,拿到当前外部类对象,格式是:外部类名.this。
静态内部类【了解】
什么是静态内部类?
- 有static修饰的内部类,属于外部类自己持有。
public class Outer{ //静态内部类 public static class Inner{ } }
创建对象的格式:
外部类名.内部类名 对象名 = new 外部类.内部类(...);
Outer.Inner in = new Outer.inner();
静态内部类中访问外部类成员的特点:
- 可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
与静态方法一样的,在静态内部类中,它只能访问外部类的静态成员,但是它不能直接去访问外部类的实例成员。
局部内部类【了解】
- 局部内部类是定义在方法中、代码块中、构造器等执行体中。
public class Test{ public static void main(String[] args){ } public static void go(){ class A{} abstract class B{} interface C{] } }
这里的局部内部类看看就好,本篇了解一些概念性的东西即可,下一篇的匿名内部类是我们学习的重点。
END