(1)、 内部类可以声明称public或private,对其访问的限制与成员变量和成员方法相同。
(2)、外部类声明的属性可以被内部类所访问,而外部类无法找到内部类中声明的属性。
(3)、用static声明的内部类会变成外部类,并且不能访问非static的外部类属性。
(4)、内部类也可以通过创建对象同外部类之外被调用,只要将内部类声明为public即可:
(2)、外部类声明的属性可以被内部类所访问,而外部类无法找到内部类中声明的属性。
(3)、用static声明的内部类会变成外部类,并且不能访问非static的外部类属性。
(4)、内部类也可以通过创建对象同外部类之外被调用,只要将内部类声明为public即可:
public class InnerClassDemo3
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display() ;
}
}
(5)、在方法中定义内部类:
class Outer
{
int score = 95;
void inst()
{
class Inner
{
void display()
{
System.out.println("成绩: score = " + score);
}
}
Inner in = new Inner();
in.display();
}
}
public class InnerClassDemo4
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.inst() ;
}
}
注意:在方法中定义的内部类只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期:
void inst(final int s)
{
final int temp = 20 ;
class Inner
{
void display()
{
System.out.println("成绩: score = " + (score+s+temp));
}
}
Inner in = new Inner();
in.display();
}
(6)、匿名内部类:
先看一个简单的例子,
interface A
{
public void fun1() ;
}
class B
{
int i = 10 ;
class C implements A
{
public void fun1()
{
System.out.println(i) ;
}
}
public void get(A a)
{
a.fun1() ;
}
public void test()
{
this.get(new C()) ;
}
}
class TestNonameInner1
{
public static void main(String[] args)
{
B b = new B() ;
b.test() ;
}
}
上面这个还是一个普通的内部类实现,输出结果是10,这个时候换成内部类的写法如下,就能看出区别了:
interface A
{
public void fun1() ;
}
class B
{
int i = 10 ;
public void get(A a)
{
a.fun1() ;
}
public void test()
{
this.get(new A()
{
public void fun1()
{
System.out.println(i) ;
}
}
);
}
}
class TestNonameInner2
{
public static void main(String[] args)
{
B b = new B() ;
b.test() ;
}
}
由此程序可以发现,在程序中并没有明确的声明出实现接口A的类,但是可以发现,程序实现了接口A中的fun1()方法,并把整个的一个实现类,传递到了方法get中,这就是所谓的匿名内部类,它不用声明实质上的类,就可以使用。