内部类分四种:成员内部类、静态内部类、局部内部类和匿名内部类。
其中,成员内部类和静态内部类可以类比。
- 相同点:成员内部类和静态内部类都是定义在一个类中,并且与该类的成员变量是同一级别的内部类。
- 不同点:1)成员内部类是非静态类,而静态内部类是静态类。2)在Outer类内部的方法中调用时,成员内部类必须生成对象才能调用其中的方法,而静态内部类则可以直接通过‘类名.方法名’的方式调用。3)在Outer类外部进行调用时,成员内部类必须生成两个对象后才能调用其中的方法:Outer的对象和成员内部类的对象,而静态内部类则只须生成静态内部类的对象就可以调用其中的方法。
成员内部类测试代码如下:
class MemberInner
{
private int a = 4;
/**
* 定义一个成员内部类(非静态类),注意:要想调用非静态类里的方法,则必须生成这个类的对象,
* 与静态类不一样,成员内部类必须要生成对象才能调用其中的方法。
* @author Rao
*
*/
public class Inner2
{
private int a = 5;
public void doSomething()
{
//就近原则,输出:5
System.out.println(a);
//这里的this仍表示内部类,故调用的仍是内部类的成员变量,输出:5
System.out.println(this.a);
//MemberInner.this表示对外部类的引用
System.out.println(MemberInner.this.a);
System.out.println("--------------------------------");
}
}
//生成成员内部类对象调用其中的方法
public void method()
{
//实际上同main中的一样,也可写成:new Inner2();
Inner2 inner = this.new Inner2();
inner.doSomething();
}
}
public class MemberInnerClassTest
{
public static void main(String[] args)
{
//内部类也要生成对象,也可写成:(new MemberInner()).new Inner2()
MemberInner.Inner2 inner = new MemberInner().new Inner2();
//这两句同上面的一句是一个意思
MemberInner member = new MemberInner();
MemberInner.Inner2 inner2 = member.new Inner2();
inner2.doSomething();
inner.doSomething();
member.method();
}
}
静态内部类测试代码如下:
class StaticInner
{
private static int a = 4;
private int b = 3;
/**
* 定义一个静态内部类,静态的只能访问静态的(包括方法和成员变量),非静态的什么都可以访问。
* 注意:静态的成员变量、方法、内部类都可以通过outClass.innerClass的方式调用,
* 故静态内部类不需要生成外部类对象就可以调用,而只需直接生成静态内部类的对象即可调用。
* @author Rao
*
*/
public static class Inner
{
public void test()
{
System.out.println(a);
// System.out.println(b);//不能访问非静态
}
public static void test2()
{
System.out.println("hello world");
}
}
//直接通过类名调用,不用生成对象
public void method()
{
Inner.test2();
}
}
public class StaticInnerClassTest
{
public static void main(String[] args)
{
//生成内部类对象的方法
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}