内部类是一种类的结构扩充,在一个类的内部除了属性和方法,还可以存在其他的类,就是在一个类的内部继续定义其他内部类结构,并且内部类也可以定义在方法和代码块中。
1.内部类的基本形式
class Outer{
private String ronin="Hello World!";
class Inner{
public void print(){
System.out.println(ronin);
}
}
public void fun(){
new Inner().print(); //实例化内部类对象,并且调用print()方法
}
}
public class TestDemo{
public static void main(String args[]){
Outer out=new Outer(); //实例化外部类对象
out.fun(); //调用外部类方法
}
}
程序执行结果:Hello World!
注意:Inner为定义的内部类,这样做虽然破坏了类的结构性,但是它可以轻松的访问外部类中的私有属性,在开发过程中不建议使用内部类。
2.关于内部类的实例化
内部类实例化语法:外部类.内部类 对象 = new 外部类().new 内部类();
程序示例:实例化内部类对象
class Outer{
private String ronin="Hello World!";
class Inner{
public void print(){
System.out.println(Outer.this.ronin); //外部类.this=外部类当前对象
}
}
}
public class TestDemo{
public static void main(String args[]){
Outer.Inner in=new Outer().new Inner();
in.print();
}
}
定义私有的内部类,即Inner类只能在Outer类中使用,同时无法在外部实例化Inner类对象,这个内部类只为Outer这一个类服务。
class Outer{
private String ronin="Hello World!";
private class Inner{
public void print(){
System.out.println(Outer.this.ronin);
}
}
}
3.使用static定义内部类
如果一个内部类使用static来定义,那么这个内部类就相当于一个“外部类”,并且只能访问外部类中定义的static操作。 static内部类的实例化语法:外部类.内部类 对象 = new 外部类.内部类();
程序:
class Outer{
private String ronin="Hello World!";
static class Inner{
public void print(){
System.out.println(Outer.ronin);
}
}
}
public class TestDemo{
public static void main(String args[]){
Outer.Inner in=new Outer.Inner();
in.print();
}
}
注意:使用static定义的内部类,其完整的名称就是 “外部类.内部类” ,在实例化对象时不需要先实例化外部类。
4.在方法中定义内部类
理论上内部类可以在类的任意位置定义,但是在开发过程中,在普通方法中定义内部类的情况最多。
程序:内部类访问方法中定义的参数
class Outer{
private String ronin="Hello World!";
public void fun(int num){
double score=99.9;
class Inner{
public void print(){
System.out.println("属性:"+Outer.this.ronin);
System.out.println("方法变量:"+score);
System.out.println("方法参数:"+num);
}
new Inner().print();
}
}
}
public class TestDemo{
public static void main(String args[]){
new Outer().fun(100);
}
}
程序执行结果: 属性:Hello World!
方法变量:99.9
方法参数:100
注意:在JDK 1.8之前的版本中,方法中定义的内部类如果想要访问方法的参数或方法中定义的变量,要在定义变量和参数前加上 “final” 标记。