内部类
1. 成员内部类(普通内部类)
- 最常见的内部类之一,其定义也很简单,在一个类里面作为类的一个字段直接定义
public class Outer {
public class inner{
}
}
- 成员内部类可以访问外部类所有的属性和方法。但是外部类要访问成员内部类的属性和方法,必须要先实例化成员内部类。
- 注意点:成员内部类里面不能包含静态的属性和方法
package oop.Demo09;
public class Outer {
public void test1(){
}
private void test2(){
}
public static void test3(){
}
public class inner{
public void test(){
test1();
test2();
test3();
}
}
}
- 实例化成员内部类的代码
package oop.Demo09;
public class Outer {
public int id = 10;
public void run1(){
System.out.println("这是外部类的方法!");
}
public class inner{
public void run2(){
System.out.println("这是内部类的方法!");
}
public void GetId(){
System.out.println("外部类中的id:"+id);
}
//run1(); 报错
public void run(){
Outer.this.run1();
}
}
}
package oop.Demo09;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.run1(); //这是外部类的方法!
Outer.inner inner = outer.new inner();//实例化成员内部类
//调用成员内部类的方法时直接用inner
inner.run2(); //这是内部类的方法!
inner.GetId(); //外部类中的id:10
inner.run(); //这是外部类的方法!
}
}
2. 局部内部类
- 定义在代码块内的一个内部类。在方法里面定义一个内部类,就是局部内部类。局部内部类的使用范围仅在其所在的代码块中
- 不能被public ,protected,private以及static修饰,能被final修饰
- 局部内部类可以访问外部类对象的所有属性和方法,而外部类却不能访问局部内部类中的属性和方法,因为局部内部类的定义只在其所在的代码块中有效,一旦出了这个区域,那么其定义就失效了
代码示例:
package oop.Demo09;
public class Student {
public static void study(){
System.out.println("学生正在学习");
//局部内部类
final class StudentSay{
public void say() {
System.out.println("学生正在说话");
}
}
}
}
package oop.Demo09;
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.study(); //学生正在学习
}
}
3. 静态内部类
- 在成员内部类多加了一个 static 关键字。静态内部类只能访问外部类的静态成员变量和方法,包括private属性和方法
package oop.Demo09;
public class Outer {
public static int id = 10;
public static void run1(){
System.out.println("这是外部类的方法!");
}
static class Inner{
public void run2(){
System.out.println("这是内部类的方法!");
}
public void GetId(){
System.out.println("外部类中的id:"+id);
}
//run1(); 报错
public void run(){
Outer.run1();
}
}
}
package oop.Demo09;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.run1(); //这是外部类的方法!
//静态内部类实例化
Outer.Inner inner = new Outer.Inner();
//调用成员内部类的方法时直接用inner
inner.run2(); //这是内部类的方法!
inner.GetId(); //外部类中的id:10
inner.run(); //这是外部类的方法!
}
}
4. 匿名内部类
- 待补充