无法实例化类型Main

3

每当我用类名创建一个新对象时,都会收到以下错误消息:

"无法实例化类型Main"


这是代码:

import javax.swing.*;
import java.util.Scanner;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;

public abstract class Main extends JPanel implements ActionListener, KeyListener{

Timer t = new Timer(5, this);
double x = 0, y = 0, velX = 0, velY = 0;

public Main() {
    t.start();
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);

}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.fill(new Ellipse2D.Double(x, y, 40, 40));
    }

public void actionPerformed(ActionEvent e) {
    repaint();
    x += velX;
    y += velY;

    }

public void up() {
    velY = -1.5;
    velX = 0;
    }

public void down() {
    velY = -1.5;
    velX = 0;
    }

public void left() {
    velX = -1.5;
    velY = 0;

    }
public void right() {
    velX = -1.5;
    velY = 0;

    }

public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();
    if (code == KeyEvent.VK_UP) {
        up();
        }
    if (code == KeyEvent.VK_DOWN) {
        down();
    }
    if (code == KeyEvent.VK_LEFT) {
        left();
    }
    if (code == KeyEvent.VK_RIGHT) {
        right();
    }

    Main m = new Main();
    JFrame f = new JFrame();
    f.add(m);
    f.setVisible(true);;
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(800,600);

}
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}

}

这是一直出现“错误”的对象:

Main m = new Main();

我非常非常新手制作UI,事实上,这是我的第三个,所以我不知道为什么我无法实例化该类型。


Main是一个抽象类。http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html - Alexis C.
你不能实例化一个抽象类。 - Pradeep Simha
abstract限定符上也一样--把它去掉。同时,似乎需要将public void keyPressed(KeyEvent)方法的最后一部分移动到public static void main(String[])方法中。 - Ted Hopp
3个回答

5

在Java中,您无法实例化抽象类。您的Main类是抽象的,请将其变成具体类,因为似乎您已经拥有所有功能,不需要将其声明为抽象类。

public class Main extends JPanel implements ActionListener, KeyListener { } //abstract keyword removed

如果以下任何陈述适用于您的情况,请考虑使用抽象类:

  • 您希望在几个密切相关的类之间共享代码。
  • 您期望扩展您的抽象类的类具有许多公共方法或字段,或需要除public(例如protected和private)以外的访问修饰符。
  • 您想声明非静态或非最终字段。这使您能够定义可以访问和修改所属对象状态的方法。

1

你的Main类是抽象的。无法实例化抽象类。

移除abstract关键字并确保实现所有必要的方法。


0

以下代码行将解决您的问题

Main m = new Main(){};

代替

Main m = new Main();

特别是针对您的情况。


通过使用 Main m = new Main(){};,您正在创建 Main 的匿名内部类。 - Abimaran Kugathasan
是的,我知道。但它将解决OP提到的问题。 - Braj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接