看了楼主的问题:内部类的使用情形?
首先理解内部类的作用
1) 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。
2) 内部类有效的解决了多重继承的问题。
这是一些例子,希望对楼主理解内部类有所帮助
1,在main方法中直接产生内部类对象
package org.zj.sample2;
class Outer {
private int index = 100;
class Inner {
private int index = 50;
void print() {
int index = 30;
System.out.println(index); // 30
System.out.println(this.index); // 50
System.out.println(Outer.this.index); // 100
}
}
}
class Test {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 注意此处变化
inner.print();
}
}
2,在方法中定义内部类
在方法中定义的内部类只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,它的生命周期超出方法运行的生命周期。而且方法体中的内部类不能有访问说明符。
package org.zj.sample;
class InOut {
String str=new String(\"Between\");
public void amethod(final int aArgs){
class Inner{
public Inner(){
System.out.println(\"This is Inner.\");//此句可看出它与匿名内部类用法的不同。
}
public void sayHello(){ [Page]
System.out.println(str);
System.out.println(aArgs);
}
}
Inner inner=new Inner();//此句必须放在定义类Inner的后面
inner.sayHello();
}
public static void main(String[] args){
InOut inOut=new InOut();
inOut.amethod(33);
}
}
在方法体中使用内部类可以使用一个已命名的构造子,或重载构造子。而匿名内部类只能用于实例初始化。
3,内部类的继承
当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:
enclosingClassReference.super();(见下例绿色部分)
package org.zj.sample;
class WithInner{
class Inner{
public void sayHello(){
System.out.println(\"Hello.\");
}
}
}
public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args) {
WithInner wi=new WithInner();
InheritInner ii=new InheritInner(wi);
ii.sayHello();
}
}
结果:
Hello.
4.匿名内部类
未使用匿名内部类的情况:这里单独写了一个内部类Inner。
package org.zj.example;
abstract class A{
abstract public void sayHello();
}
class Outer {
public static void main(String[] args){
class Inner extends A{
public void sayHello(){ [Page]
System.out.println(\"Hello!\");
}
}
new Outer().callInner(new Inner());
}
public void callInner(A a){
a.sayHello();
}
}
使用匿名内部类的情况:直接在new A()中给出Inner的定义。
package org.zj.example;
abstract class A{
abstract public void sayHello();
}
class Outer {
public static void main(String[] args){
new Outer().callInner(new A(){
public void sayHello(){
System.out.println(\"Hello!\");
}
});
}
public void callInner(A a){
a.sayHello();
}
}
希望对你有所帮助。 |