一. 定义
类与类之间的嵌套关系
1.用于描述类与类之间的关系,内部类为外部类的成员
2.为了保护类的属性的安全
二. 分类
2.1 成员内部类
把一个类当作类中的成员
非静态的成员内部类中不能出现静态的属性和方法,案例中g()为非静态方法,而主方法为静态方法,因此主方法通过创建外部类的对象,进而创建内部类的对象来调用内部类的方法,而非静态方法g(),则直接调用了内部类的方法。
public class test {
int i=10;
class interClass{
int i=100;
void f(){
System.out.println(i);
System.out.println(this.i);
System.out.println(new test().i);
}
}
public void g(){
interClass in=new interClass();
in.f();
}
public static void main(String[] args) {
test t=new test();
t.new interClass().f();
t.g();
}
}
//
100
100
10
100
100
10
2.2 局部内部类/方法内部类
内部类在方法里面
这里注意一点:final修饰形参列表中的参数,该参数是不能改变的,否则编译会报错。
public class Outer1 {
public int i = 0;
public static int j = 1;
public final int k = 2;
public void f(final int a){
int i = 10;
int u = 100;
class Inner{
int i = 1000;
public Inner(int a) {
f1(a);
}
void f1(int a){
System.out.println(i);
System.out.println(this.i);
System.out.println(Outer1.this.i);
System.out.println(u);
System.out.println(k);
System.out.println(j);
System.out.println(a);
}
}
new Inner(a);
}
public static void main(String[] args) {
Outer1 outer = new Outer1();
outer.f(5);
}
}
2.3 静态内部变量
是将static关键字修饰成员内部类,该类将被共享,创建内部类的对象后,可以调用变量和方法。
public class test {
static class f{
int i=0;
void f(){
System.out.println("这是静态内部类的成员方法");
}
}
public static void main(String[] args) {
System.out.println(new f().i);
}
}
2.4 匿名内部类
没有名字,只调用一次,“ ;”是内部类结束的标志。
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写,但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口,但最多只能继承一个父类,或实现一个接口。
关于匿名内部类还有如下两条规则:
1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类定义成抽象类。
2)匿名内部类不等定义构造器(构造方法),因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块。
public class JavaTest2 {
public static void main(String[] args) {
Person per = new Person() {
public void say() {// 匿名内部类自定义的方法say
System.out.println("say方法调用");
}
@Override
public void speak() {// 实现接口的的方法speak
System.out.println("speak方法调用");
}
};
per.speak();// 可调用
per.say();// 出错,不能调用
}
}
interface Person {
public void speak();
}