Подтвердить что ты не робот

Какой файл $1 в классе?

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet

2009-07-02  23:54              .
2009-07-02  23:54              ..
2004-09-06  14:57               582 WelcomeApplet.html
2004-09-06  15:04             1,402 WelcomeApplet.java
               2 File(s)          1,984 bytes
               2 Dir(s)   2,557,210,624 bytes free

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>javac WelcomeApplet.java

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
 Volume in drive C has no label.
 Volume Serial Number is 2041-64E7

 Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet

2009-07-02  23:54              .
2009-07-02  23:54              ..
2009-07-02  23:54               975 WelcomeApplet$1.class
2009-07-02  23:54             1,379 WelcomeApplet.class
2004-09-06  14:57               582 WelcomeApplet.html
2004-09-06  15:04             1,402 WelcomeApplet.java
               4 File(s)          4,338 bytes
               2 Dir(s)   2,557,202,432 bytes free

C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>

Вот содержимое этого java файла:

/**
   @version 1.21 2002-06-19
   @author Cay Horstmann
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class WelcomeApplet extends JApplet
{
   public void init()
   {
      setLayout(new BorderLayout());

      JLabel label = new JLabel(getParameter("greeting"), SwingConstants.CENTER);
      label.setFont(new Font("Serif", Font.BOLD, 18));
      add(label, BorderLayout.CENTER);

      JPanel panel = new JPanel();

      JButton cayButton = new JButton("Cay Horstmann");
      cayButton.addActionListener(makeURLActionListener(
         "http://www.horstmann.com"));
      panel.add(cayButton);

      JButton garyButton = new JButton("Gary Cornell");
      garyButton.addActionListener(makeURLActionListener(
         "mailto:[email protected]"));
      panel.add(garyButton);

      add(panel, BorderLayout.SOUTH);
   }

   private ActionListener makeURLActionListener(final String u)
   {
      return new
         ActionListener()
         {
            public void actionPerformed(ActionEvent event)
            {
               try
               {
                  getAppletContext().showDocument(new URL(u));
               }
               catch(MalformedURLException e) 
               { 
                  e.printStackTrace(); 
               }
            }
         };
   }
}
4b9b3361

Ответ 1

Это файлы .class, содержащие анонимные внутренние классы.

В вашем примере WelcomeApplet.java содержится класс верхнего уровня (называемый WelcomeApplet) и анонимный внутренний класс, который будет храниться в WelcomeApplet$1.class.

Обратите внимание, что точное имя файлов, содержащих анонимные внутренние классы, не стандартизировано и может отличаться. Но на практике я еще не вижу никакой другой схемы, кроме описанной здесь.

Составляющие значение тела для enum также являются анонимными внутренними классами:

Необязательное тело класса константы enum неявно определяет анонимное объявление класса (§15.9.5), которое расширяет сразу включаемый тип перечисления.

Ответ 2

$1 - это анонимные внутренние классы, определенные вами в файле WelcomeApplet.java.

например. компиляции

public class Run {
    public static void main(String[] args) {
        System.out.println(new Object() {
            public String toString() {
                return "77";
            }
        });
    }
    private class innerNamed {
    }
}

приведет к созданию Run.class, Run$1.class и Run$innerNamed.class

Ответ 3

Они генерируются из внутреннего и статического вложенных классов в файле WelcomeApplet.java компилятором java.

Смотрите также этот похожий вопрос и ответ.

Ответ 4

Именно из этой "строки" кода:

return new
    ActionListener()
    {
        public void actionPerformed(ActionEvent event)
        {
            try
            {
                getAppletContext().showDocument(new URL(u));
            }
            catch(MalformedURLException e) 
            { 
                e.printStackTrace(); 
            }
        }
    };

Как вы объявляете ActionListener, вы делаете экземпляр анонимного внутреннего класса каждый раз, когда вызывается этот метод.

Даже если метод не вызывается, указанная выше строка все равно скомпилируется в анонимный внутренний класс независимо от того, что.

Ответ 5

Файл WelcomeApplet$1.class создается для анонимного класса в источнике WelcomeApplet.java(анонимный класс генерируется в вызове метода makeURLActionListener, вызывая new new ActionListener() {...})

Чтобы более ясно объяснить, анонимные классы генерируются во время компиляции в любое время, когда у вас есть экземпляр конкретного именованного класса, который переопределяет некоторое или все поведение конкретного класса (или интерфейса) в виде строки следующим образом:

class HelloInternalClass {
  public static final void main(String[] args) {
    // print in another thread
    new Thread(new Runnable() {
      public void run() {
        System.out.println("Printed from another thread");
      }
    }).start();
  }
}

В приведенном выше примере кода компилятор javac будет генерировать 2 файла класса, как в вашем примере: HelloInternalClass.class и HelloInternalClass$1.class.

Анонимный класс в этом экземпляре будет подклассом Runnable и будет скомпилирован в HelloInternalClass$1.class. Кстати, если вы спросите имя класса из исполняемого экземпляра в приведенном выше примере (вызывая getClass().getName()), вы обнаружите, что он считает себя "HelloInternalClass $1".

Ответ 6

Создать:

public class A {
    public static void main(String[] args) {
        X x=new X();
        X x2=new X(){   
        };
        Class<? extends Object>c2=x2.getClass();
        Class<? extends Object>s2=x2.getClass().getSuperclass();

        boolean b=false;
    }
    private static class X{     
    }
}

Трудно видеть из кода (new X{}() было бы лучше, чем new X(){}), но x2 является экземпляром подкласса A$X. Этот подкласс A$1.