内部类的主要分类有:1.成员内部类,2.局部内部类,3.静态内部类,4.匿名内部类。下面一一进行说明:
1.成员内部类。
作为外部类的一个成员存在,可以访问外部类的所有属性和方法(privated),实例化过程:作为外部类的一个成员存在,你想一般访问一个类的成员变量,必须先实例化该类,然后再进行访问。所以访问内部类是必须先实例化外部类。
举例:
package day03;
/**
* @author wangpei
* @version
*创建时间:2017年3月2日 上午9:16:38
* 类说明
*/
public class Outer {
private int a;
public void printOuter(){
System.out.println("这是Outer");
}
class Inner{
public void printInner(){
System.out.println("这是Inner");
}
public int getA(){
return Outer.this.a;//return a;
}
}
public static void main(String[] args) {
Outer ot=new Outer();
Outer.Inner a=ot.new Inner();
System.out.println(a.getA());
}
}
注意:当外部类与内部类中的变量重名时,外部内中的变量会被隐藏,在内部类里边调用时,肯定调用的是内部类里边的变量需要通过Outer.this.变量名来访问外部类中的变量
举例:
package day03;
/**
* @author wangpei
* @version
*创建时间:2017年3月2日 上午9:16:38
* 类说明
*/
public class Outer {
private int a=1;
public void printOuter(){
System.out.println("这是Outer");
}
class Inner{
int a=5;
public void printInner(){
System.out.println("这是Inner");
}
public int getA(){
return a;//Outer.this.a;
}
}
public static void main(String[] args) {
Outer ot=new Outer();
Outer.Inner a=ot.new Inner();
System.out.println(a.getA());
}
}
2.局部内部类
局部内部类是在方法内部定义的类,相当于方法的局部变量。
注意:局部内部类是在方法内部进行实例化,然后通过实例化外部类来调用该方法达到调用内部类的目地。
package day03;
/**
* @author wangpei
* @version
*创建时间:2017年3月2日 上午9:16:38
* 局部内部类
*/
public class Outer {
//private int a=1;
public void printOuter(){
int a=5;
class Inner{
public void getA(){
System.out.println(a+1);
}
}
Inner In = new Inner();
In.getA();
}
public static void main(String[] args) {
Outer ot=new Outer();
ot.printOuter();
}
}
3.静态内部类
使用static修饰的内部类。
<1>静态内部类可以直接被外部类调用,而不用实例化外部类。
<2>静态内部类不能访问外部类中非静态的成员和方法。
package day03;
/**
* @author wangpei
* @version
*创建时间:2017年3月2日 上午9:16:38
* 类说明
*/
public class Outer {
private static int a=0;
public void printOuter(){
System.out.println("这是Outer");
}
static class Inner{
public void printInner(){
System.out.println("这是Inner");
}
public int getA(){
//return a;//此处这样访问会报错,必须将设置为static
return a;
}
}
public static void main(String[] args) {
//Outer ot=new Outer();
Outer.Inner a=new Outer.Inner();//直接实例化,不用通过实例化Outer再实例化
System.out.println(a.getA());
}
}
4.匿名内部类
主要是在定义监听器时使用,因为java类实现的是单继承,定义匿名类,可以对多继承做补充。
注意:匿名内部类不可以被static,访问修饰符修饰。匿名内部类没有构造方法。