如果我创建一个新对象并将其放在main方法中,java是运行构造函数还是运行整个类?

如果我创建一个新对象并将其放在main方法中,java是运行构造函数还是运行整个类?,java,Java,假设我有一个名为Panel的类 public class Panel extends JPanel implements ActionListener{ public Board(){ setFocusable(true); setBackground(Color.black) setDoubleBuffered(true); timer= new Timer(16,this);

假设我有一个名为Panel的

 public class Panel extends JPanel implements ActionListener{
       public Board(){
            setFocusable(true);
            setBackground(Color.black)
            setDoubleBuffered(true);
            timer= new Timer(16,this);
            timer.start();
       }
       public void actionPerformed(ActionEvent e){
            //.........some codes here...//

       }
       public void render(Graphics2D g){
            //....some code here....//
       }
}
我在主
类中运行它

public class Main extends JFrame{
public Main(){
    add(new Panel());
    //....some code....//
}
public static void main(String[] args){
    new Main();
}
}

由于构造函数中不包含
actionPerformed()
render()
方法。

创建新对象时,将只执行构造函数(及其调用的任何方法)。通常,方法只有在被代码或框架调用时才运行(通常是在响应事件时,事件是
计时器
延迟时间的流逝)

请注意,您最初发布的代码中有一个输入错误:

public void actionPerfomred(ActionEvent e){
应该是

public void actionPerformed(ActionEvent e){

如果使用
@Override
注释被重写的方法,编译器将为您捕获类似的错误。这样,您就不必在运行时弄清楚为什么没有调用您的方法。

它显然只调用构造函数。若你们并没有任何构造函数,那个么编译器将调用默认的空构造函数。但是当您只创建一个对象并且只调用构造函数时。

Java将只运行构造函数。我还注意到Panel类的构造函数名称与其构造函数不匹配。它必须是相同的名字。 而不是这个

public class Panel extends JPanel implements ActionListener{
       public Board(){
            setFocusable(true);
            setBackground(Color.black)
            setDoubleBuffered(true);
            timer= new Timer(16,this);
            timer.start();
       }

}
是吗

public class Panel extends JPanel implements ActionListener{
   public Panel(){
        setFocusable(true);
        setBackground(Color.black)
        setDoubleBuffered(true);
        timer= new Timer(16,this);
        timer.start();
   }
}
另外,对于
actionPerformed
事件方法,您必须手动将它们与您必须执行某些操作的按钮/列表关联起来


但是调用actionPerformed方法时未在构造函数中编写

现在这是一个更好的问题。这是你第一次问问题时应该说明的行为,所以我们猜不出你为什么要问这个问题


这是因为您使用的是
计时器。当计时器启动时,将调用添加到计时器中的
ActionListener
。您的类实现ActionListener,以便调用类的
actionPerformed()
方法。

它将仅调用构造函数

java将运行构造函数还是整个类

没有。它不会运行整个班级

此外,当类加载时,它将运行静态块中的填充(如果存在)

if i create a new object and put it in the main method, is java going to run
the constructor or the entire class?
首先,您所说的java将要运行是什么意思。当您使用类名调用
javac
时,例如
javac*.java
所有java文件都将编译为中间字节码。现在,当您调用
javamain
java解释器时,它将从
publicstaticvoidmain(stringargs[])
函数开始解释您的字节码。Java只是编程语言的一个名称,您可以说jvm是执行构造函数还是执行整个类?

其次,执行整个类是什么意思。这有两个方面

  • 创建新对象
    :无论何时创建新对象(通过使用关键字new),都会调用相应的构造函数并创建对象。当构造函数被执行时,如果您正在从构造函数调用任何方法,那么它们也将被执行
  • 调用函数/方法
    :如果您的方法不是私有的,那么您可以在创建它们的对象后调用这些方法(取决于使用的访问修饰符) 你的案子

    new Panel();
    
    创建了新的面板对象(调用了相应的构造函数)。不会单独执行其他方法

    my question is that render and actionPerformed are not in the constructor,
    how are they being executed? it is because of Timer?
    
    这是你不应该问的问题。你是程序员,你必须为你的需求编写代码。至于用例,我可以告诉你

       public void actionPerformed(ActionEvent e){
            //.........some codes here...//
    
       }
    
    您可以创建一个JButton或任何组件,并向其中添加ActionListner。ActionListner具有此方法。因为类面板实现了ActionListner,所以您实现的是actionPerformed()函数。例如


    actionPerformed
    将由计时器触发器调用

    render
    方法将不会调用。如果要在swing
    JPanel
    中绘制某些内容,应覆盖
    paint(Graphics g)
    中定义的
    JComponent
    方法


    看看

    试试看,看看会发生什么。在每个方法中添加System.out.println(…)语句以查看它们何时执行。我的问题是render和actionPerformed不在构造函数中,它们是如何执行的?这是因为计时器?这是你在问题中最初应该说的,所以我们不必猜测你在想什么。不管怎样,你的问题已经得到了回答。所以,是时候接受答案了。对不起,我不得不拿出一个例子。我确实把actionPerformed()和render()方法放在了构造函数中。所以在发言前先读一读。你问“会发生什么”。这意味着你不知道会发生什么。阅读答案。在您澄清调用了
    actionPerformed
    方法之前,没有人理解您真正的问题。然后人们更仔细地看了你的代码来解释计时器的用法。编程的关键是你需要逻辑思考。那么,当一个类被构造时,所有的方法都会自动执行,这有意义吗?填鸭式喂养无助于OP独立思考。学习一些基本的解决问题的技能是每个程序员都需要学习的。但是actionPerformed方法是在没有编写构造函数的情况下调用的。@camickr-它确实有助于解释基本的规则。只有当您有一些事实需要处理时,逻辑思维才有效。@Bango-
    actionPerformed
    在事件(如鼠标单击)发生时由框架调用。如果没有操作,将不会调用该方法。@Bango-计时器仅调用
    actionPerformed
    方法。此时不会自动调用
    render
    方法。但是,
    actionPerformed
    中的代码可能会触发框架调用
    render
    (例如,如果您调用
        JButton button = new JButton();
        button.addActionListener(new Panel());