1.内部类指的是在一个类的内部定义了其他的情况,看一下内部类的基本定义形式.
1.1内部类
内部类属于在一个类内部定义的新的结构,按照类的基本组成讲,一个类中应该由属性和方法所组成,但是这时候又多了一个类,这样结构不好,所以内部类本身最大缺点破坏了程序的结构.
运行结果
1.2类部类也有自己优点,想要发现这个优点将内部类拿到外面来,变成两个类.
这时候代码增多复杂度增加,进行的所有操作都是为了能够让内部类访问外部类msg属性.
内部类的优点:可以方便地访问外部类地私有操作,或者是由外部类方便地访问内部类地私有操作.
运行结构
Hello World
1.3通过外部类访问内部类私有属性.
验证了内部类和外部之间私有属性互相访问,但既然要访问的是属性,之前讲过,只要是访问类中地属性前面都要有"this.",即以上地程序之中内部类访问外部类私有属性应该是"this.msg"才对,但是在内部类使用this表示只是内部类地当前对象,如果要表示外部类地当前对象,使用"外部类.this"来表示.
运行结果
明确指定要访问对象
"内部类访问外部类属性采用了"Outer.this.msg"的形式完成,表示要访问的是当前Outer类的对象msg属性.
上面都是通过外部类的方法操作内部类(在fun()方法中实例化内部对象,并调用了类中的方法)。
在不同类中实例化内部类对象
外部类.内部类 内部类对象=new 外部类().new 内部类();
实例化外部类对象,因为内部类需要访问外部类中的普通属性,那么普通属性只有在对象实例化后才可以被使用.
class Outer{ //外部类
private String msg="Hello World"; //外部类属性
class lnner { //内部类
public void print() {
System.out.println(Outer.this.msg); //输出外部类属性msg
}
}
}
public class TestDeo12 {
public static void main(String[] args) { //定义主方法
Outer.lnner outer=new Outer().new lnner(); //实例化内部类对象
outer.fun(); //调用外部类的fun()方法
}
}
如果一个类不希望被其他类所使用,那么也可以使用private关键字,将这个内部类定义为私有属性.
在android开发中,使用private class定义内部类是常见的.
class Outer{ //外部类
private String msg="Hello World"; //外部类属性
private class lnner { //内部类
public void print() {
System.out.println(Outer.this.msg); //输出外部类属性msg
}
}
}
public class TestDeo12 {
public static void main(String[] args) { //定义主方法
//错误信息:The type Outer.lnner is not visible
Outer.lnner outer=new Outer().new lnner(); //实例化内部类对象
outer.fun(); //调用外部类的fun()方法
}
}
2.使用static定义内部类
在定义内部类时,也可以使用static关键字进行定义,而使用static定义的内部类,就表示为"外部类",并且只能访问外部类中static类型的操作.
使用static定义内部类,实际上这时候的内部类变成外部类,想实例化此时内部类对象,使用下面格式.
实例化static定义的内部类
外部类.内部类 内部类对象=new 外部类.内部类();
class Outer{ //外部类
private String msg="Hello World"; //外部类属性
static class lnner { //内部类
public void print() {
System.out.println(Outer.this.msg); //输出外部类属性msg
}
}
}
public class TestDeo12 {
public static void main(String[] args) { //定义主方法
Outer.lnner outer=new Outer(). lnner(); //实例化内部类对象
outer.fun(); //调用外部类的fun()方法
}
}
实例化内部类对象格式比较:
格式一(非static定义内部类):外部类.内部类 内部类对象=new 外部类().new 内部类();
格式二(static定义内部类):外部类.内部类 内部类对象=new 外部类.内部类();在实例化也不需要先实例化外部类在实例化内部类了.
3.在方法中定义内部类
内部类可以在任何地方定义,包括代码块和普通方法中,在普通方法最多.
在内部类定义在了fun()方法中,并且在fun()实例化类内部类对象,但是此时定义的内部类如果要访问的参数或者是方法中定义变量时,这些参数或变量前一定增加final关键字,否则无法调用.
在方法中增加final
运行结果
定义方法参数x和局部变量info时都加上final,这样内部类lnner才可以进行参数及变量访问.