“无法实例化Type Main”

时间:2014-03-23 14:47:28

标签: java swing user-interface

每次创建具有类名的新对象时,我都会收到此错误:

"无法实例化Type 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,事实上,这是我的第3个,所以我不知道为什么我无法实例化Type)

3 个答案:

答案 0 :(得分:5)

你不能在java中实例化abstract classes,你的Main类是抽象的,使它成为一个具体的类,因为你似乎拥有所有的功能主义者而不需要将它声明为抽象类。

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

如果这些陈述中的任何一个适用于您的情况,请考虑使用抽象类:

  • 您希望在几个密切相关的类之间共享代码。
  • 您希望扩展抽象类的类有很多 常用方法或字段,或者需要除了以外的访问修饰符 公众(如受保护和私人)。
  • 您想要声明非静态或非最终字段。这使你 定义可以访问和修改对象状态的方法 它们属于哪个。

答案 1 :(得分:1)

你的班级主要是抽象的。无法实例化抽象类。

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

答案 2 :(得分:0)

以下行将解决您的问题

Main m = new Main(){};

取代

Main m = new Main();

特别是你的情况。