如何写内部类,内部类中如何调用

如何写内部类,内部类中如何调用,第1张

一般来说,外部类调用内部类的方法分为以下几种情况:
1使用static可以声明一个内部类, 可以直接在外部调用
// 定义外部类
class Outer
{
// 定义外部类的私有属性
private static String info = "hello world";
// 使用static定义内部类为外部类
static class Inner
{
// 定义内部类的方法
public void print()
{
// 直接访问外部类的私有属性
Systemoutprintln(info);
}
};

并不清楚楼主代码需要如何实现。简短例子供参照,如有疑问可追问

public class $ {
    public static void main(String[] args) {
        final A a1 = new A();
        A a = new A(new B() {
            
            @Override
            public void toDo() {
                a1getB();//调用final对象
                Atest();//或尝试调用静态方法
                //agetB(); //错误,a未完成初始化,无法被使用
            }
        });
    }
}
class A {
    B b;
    A(){}
    A(B b) {
        thisb = b;
    }
    static void test() {
    }
    public B getB() {
        return thisb;
    }
}
interface B {
    public void toDo();
}

static 用在类前面只是表示这个内部类与外面的类之间没有实例之间的引用关系,是可以在内部类中直接创建外面的类的实例的。编译器不会为我们自动创建关联引用,但我们可以创建非关联的实例。
这个时候相当于只是给了特定的可见性控制。
你创建两个内部类,一个 static,一个非 static 然后在 eclipse 的 navigator 视图中打开你的类观察,那个非 static 类,编译器自动创建了一个成员变量用来在外部类和内部类之间建立关联。

public class OuterClass{private List listeners = new LinkedList();public void addListeners(IListener listener){thislistenersadd(listener);}private OuterClass outer = this; (1)private class InnterClass{public void publish(){//将事件发布出去 (2)for(int i=0;i < listenerssize();i ){IListener listener = (IListener) listenersget(i);listenerreceiveEvent(outer);}}}public void execute(){InnterClass in = new InnterClass(); (3)inpublish();}}public interface IListener{public void receiveEvent(OuterClass obj);}你可能觉得这个例子很别扭,在哪里让你觉得难受呢?其实问题的关键就在于接口IListener的定义,这里需要给receiveEvent方法传递的参数是外部对象!(别激动,下面我会说明需要传递的一个场景)场景在一个GUI系统中,我们要在画板WorkSpace(WorkSpace实现了IListener接口)上产生一颗树,但树中的每个节点的产生(绘图)是我们不知道的算法,系统只为我们提供了一些绘图的接口,并返回元素的句柄!看来我们需要"包装"一下这个绘图的句柄Brush(其实我把它叫做笔刷,因为它只知道如何"刷"出图像来,就这点本事!)并对外提供节点Node这样一个通用的类。此时Node与Brush的关系就很微妙了,不过我们可以抛开这些外表,看到Node与Brush其实就是外部类与内部类的关系!-第一步完成了:确定了两者的关系然而,事情没有这么简单,Node类必须处理一些事件,而这些事件理所当然只有Brush能够看懂,而Node根本不知道这样的事件处理过程,现在有两个办法:办法一,让Node实现Brush所有的事件;办法二,把Brush返回回去,让它来处理自己的事件,看来办法二是个好主意,因为我可以不关心事件的种类!-第二步完成了:确定了事件处理的责任还没完呢,你肯定不希望画板WorkSpace面对的是绘图的句柄Brush这样的对象,相反你只希望WokSpace只知道Node的存在!IListener接口中receiveEvent方法的参数定义为OuterClass 就由此而来!-第三步完成:接口的定义

class Outer
{
 int x = 3;
 static class Inner//静态内部类
 {
  void fun()
  {
   
   Systemoutprintln("inner--" + new Outer()x);
  
  }
 }
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10361571.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-08
下一篇 2023-05-08

发表评论

登录后才能评论

评论列表(0条)

保存