【问题标题】:Java Question, From a C++ ProgrammerJava 问题,来自 C++ 程序员
【发布时间】:2011-02-18 03:29:15
【问题描述】:

我正在学习 Java,现在我已经克服了包的问题,​​事情进展顺利。我可以在我正在学习的大多数东西与我已经知道至少概念的东西之间得出相似之处。但是下面这段代码到底发生了什么?它是某种形式的构造函数,还是匿名对象?

Something obj = new Something()
{
  private static final int num = 3;

  public void meth()
  {
    // w/e
  }
};

【问题讨论】:

    标签: java class object


    【解决方案1】:

    你明白了 - 这会创建一个匿名内部类 Something

    另请参阅:Nested Classes (The Java Tutorial)Anonymous Classes

    【讨论】:

    • 这有什么意义?它是否用于扩展类Something,以及向其添加方法和变量,而不实际创建Something2 extends Soemthing 类?
    • 有时,您想定义行为而无需使用全新的类。通常,它只需要一种(可能是两种)方法。出于代码格式化目的,我将把它移到一个新的答案,然后我会告诉你。
    【解决方案2】:
    /**
     * Notice there's only one thing in this that isn't defined:
     * It still needs public abstract void triggerEvent();
     */
    public abstract static class TopButton extends JPanel implements MouseListener {
            protected ButtonPanel parent;
            private String text;
            public TopButton(ButtonPanel bp, String text) { parent = bp; this.text = text; addMouseListener(this); }
            public void mouseClicked(MouseEvent e) { triggerEvent(); }
            public void mouseEntered(MouseEvent e) { }
            public void mouseExited(MouseEvent e) { }
            public void mousePressed(MouseEvent e) { }
            public void mouseReleased(MouseEvent e) { }
            public abstract void triggerEvent();
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Color oldColor = g.getColor();
                Font oldFont = g.getFont();
                    Font newFont = new Font(oldFont.getName(),oldFont.getStyle(),oldFont.getSize());
                    g.setFont(newFont);
                    g.setColor(Color.black);
                    g.drawString(text, 20, 20);
                g.setFont(oldFont);
                g.setColor(oldColor);
            }
        }
    

    现在,当我真正定义我的按钮时,我会这样做。通过提供它需要的一条线,唯一使它与众不同的东西。现在我可以为每个文件创建一个新文件,并为每个文件定义一个新类。这要简单得多。

    private static void loadButtonPanelButtons() {
        /* This button should tell the parent to bring up the save screen */
        TopButton save = new TopButton(buttonPanel,"Save") {
            public void triggerEvent() { parent.triggerSave(); }
        };
        save.setBorder(LineBorder.createBlackLineBorder());
        buttonPanel.add(save);
    
        /* This button should tell the parent to bring up the load screen */
        TopButton load = new TopButton(buttonPanel,"Load") {
            public void triggerEvent() { parent.triggerLoad(); }
        };
        load.setBorder(LineBorder.createBlackLineBorder());
        buttonPanel.add(load);
    
        TopButton addTile = new TopButton(buttonPanel,"Add Tile") {
            public void triggerEvent() { parent.triggerAddTile(); }
        };
        addTile.setBorder(LineBorder.createBlackLineBorder());
        buttonPanel.add(addTile);
    
        TopButton saveTiles = new TopButton(buttonPanel,"Save Tiles") {
            public void triggerEvent() { parent.triggerStyleSave(); }
        };
        saveTiles.setBorder(LineBorder.createBlackLineBorder());
        buttonPanel.add(saveTiles);
    }
    

    现在,当我处理被按下的按钮时,记得回到 TopButton 的定义中......有

        public void mouseClicked(MouseEvent e) { triggerEvent(); }
    

    我们知道triggerEvent() 最终会被定义。我们可以在每个按钮的基础上定义它,当面板被点击时,无论我们定义 triggerEvent() 是什么,它都会被调用。

    【讨论】:

    • 太好了,谢谢! Java 绝对是一头不同的野兽,这是肯定的。
    【解决方案3】:

    这样的构造创建了一个匿名内部类,该类在其中执行该构造,并且派生自Something(不是Something的内部类)。

    这个想法是快速提供抽象类、接口的实现,或者覆盖类的某些功能。

    (new Thread(){ public void run() { System.out.println("在另一个线程上执行"); }}).start();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多