Java内部类

java内部类分为两种,静态内部类和非静态内部类。根据使用位置和方式的不同,非静态内部类
可分为:一般内部类、局部内部类(方法区内部类)、匿名内部类。

非静态内部类

    类似于外部类的成员变量或者成员方法(实例变量、实例方法)。

一般内部类

1) 内部类可以访问外部类私有的成员变量

1
2
3
4
5
6
7
8
9
public class OuterClass{
private String name;

private class InnerClass{
public void display(){
System.out.println("out class name is :" + name);
}
}
}

2) 使用内部类必须先实例化外部类
3) 声明内部类时,可加public、protected、private或者默认修饰符,规则同类修饰符一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class OuterClass{
//该类为私有,只能在内部访问,即,不能在OuterClass之外访问
private class InnerClass{
private String text;
public void method(){

}
}

//一般在外部类中声明一个方法访问内部类的方法
public void accessInnerClass(){
InnerClass inner = new InnerClass();
inner.method();
}

public static void main(String[] args){
OuterClass out = new OuterClass();
OuterClass.InnerClass inner = out.new InnerClass();
inner.method();
//或者
OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
innerClass.method();
}
}

局部内部类

1) 写在方法内部的类是局部内部类
2) 局部内部类不能用public、protected、private等修饰
3) 局部内部类只能在方法内部使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class OuterClass{
private String name;

public void method(){
int i = 0;
class MethodClass{
public void sayHello(String name){
System.out.println("Hello : " + name);
}
}

MethodClass mc = new MethodClass();
mc.sayHello("tom");
}
}

匿名内部类

1) 没有名字的类称为内部类
2) 一般用于重写某个类的方法或者实现某个接口
3) 如果一个方法接收一个接口、抽象类或者具体类,一般传递匿名内部类

1
2
3
4
5
6
7
8
9
10
11
12
public class OuterClass{
public static void main(String args[]){

new Thread(new Runable(){

public void run(){
//do something
}

}).start();
}
}

静态内部类

1) 静态内部类是外部类的静态成员
2) 实例化静态内部类不需要先实例化外部类
3) 静态内部类不能访问外部类的实例变量和方法
4) 声明静态内部类时,可加public、protected、private或者默认修饰符,规则同类修饰符一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class OuterClass{
private String name;
private static final int age = 25;

public static class StaticInnerClass{

public void display(){
System.out.println(name);//编译报错,见3条规则
System.out.println(age);
}
}

public static void main(String[] args){
OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass();
inner.display();
}
}
坚持原创技术分享,您的支持将鼓励我的继续创作