我们经常看到在一个类中定义一个类,这就是内部类,内部类大概可以分为
1:静态内部类
2:成员内部类
3:局部内部类
4:匿名内部类
现在分别讲下 用demo的形式演示
静态内部类
package com.zhimore4;
public class OuterClass {
private static int age = 20;
public static String name = "zhangsan";
static class InnerClass{
public static void show(){
System.out.println(name+"今年"+age+"岁了");
}
}
}
使用:
OuterClass.InnerClass.show();如果静态内部类中的方法是静态的,这样直接调用就可以了,如果方法不是静态方法,那么它不能直接访问外部类的成员,因为内部类有一个很重要的点就是内部类可以直接访问外部类的成员,所以如果想访问外部类的成员,就不能有非静态方法,而且静态内部类不能使用private修饰以及它里面的成员也不能,其他修饰符都可以,如果是非静态方法这样调用,InnerClass innerClass = new OuterClass.InnerClass();innerClass.show();
成员内部类
package com.zhimore4;
public class OuterClass {
private int age = 20;
public static String name = "zhangsan";
protected class InnerClass{
protected void show(){
System.out.println(name+"今年"+age+"岁了");
}
}
}
使用:
package com.zhimore4;、
import com.zhimore4.OuterClass.InnerClass;
public class Client {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
innerClass.show();
}
}
成员内部类可以访问外部类的静态和非静态成员(方法和变量),如果内部类的方法是静态的,那么要求内部类也是静态的,所以成员内部类的方法都是非静态的,
局部内部类
所谓局部内部类就是定义在方法中的类,
package com.zhimore4;
public class OuterClass {
private static int age = 20;
public static String name = "zhangsan";
public void m2(){
class InnerClass {
public void show(){
System.out.println(name+"今年"+age);
}
}
//创建InnerClass对象,调用show方法
InnerClass innerClass = new InnerClass();
innerClass.show();
}
}
使用:
package com.zhimore4;
public class Client {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.m2();
}
}
局部内部类访问局部变量的时候,变量要用final修饰,这是为了再给变量赋值,
匿名内部类
package com.zhimore4;
public class OuterClass {
Listener mListener;
public void show(Listener listener){
System.out.println(listener.getName());
}
interface Listener{
String getName();
}
}
使用:
package com.zhimore4;
import com.zhimore4.OuterClass.Listener;
public class Client {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.show(new Listener() {
@Override
public String getName() {
return "张三";
}
});
}
}
这在android中经常用到!