被学Java,看到书中提到:
1.定义抽象类要在类定义前加abstract;
2.定义抽象方法要在方法定义前加abstract;
3.一个规则:抽象类中至少有一个抽象方法.我觉得有了第3点,第1点是不是多余的了?
根据第3点,定义为抽象类,则必须定义至少一个抽象方法,但反过来呢?定义了至少一个抽象方法的类如果不定义为抽象类,也就是不加abstract关键字,是不是无法通过编译?
1.定义抽象类要在类定义前加abstract;
2.定义抽象方法要在方法定义前加abstract;
3.一个规则:抽象类中至少有一个抽象方法.我觉得有了第3点,第1点是不是多余的了?
根据第3点,定义为抽象类,则必须定义至少一个抽象方法,但反过来呢?定义了至少一个抽象方法的类如果不定义为抽象类,也就是不加abstract关键字,是不是无法通过编译?
继承一个抽象类而没有实现抽象方法又不声明为abstract能让你通过编译?implements ActionListener用过的吧,
public void actionPerformed(ActionEvent e){}
有没有让你提示实现上述方法?没有?能让你通过编译?
我觉得有了第3点,第1点是不是多余的了?
======
不多余根据第3点,定义为抽象类,则必须定义至少一个抽象方法,但反过来呢?定义了至少一个抽象方法的类如果不定义为抽象类,也就是不加abstract关键字,是不是无法通过编译?
=======
同意楼主的理解;无法通过编译
简单的例子就是KeyAdapter,WindowAdapter,MouseAdapterkzh80000(如鱼得水)似乎并不清楚抽象类跟接口的关系
我试了试,能通过编译
import java.awt.event.*;
public class TwoListenInner
{
private Frame f;
private TextField tf;
public static void main(String args[])
{
TwoListenInner that=new TwoListenInner();
that.go();
}
public void go()
{
f=new Frame("Two listeners example");
f.add("North",new Label("Click and drag the mouse"));
tf=new TextField(30);
f.add("South",tf);
f.addMouseMotionListener(new MouseMotionHandler());
f.addMouseListener(new MouseEventHandler());
f.addWindowListener(new WindowEventHandler());
f.setSize(300,300);
f.setVisible(true);
}
public class MouseMotionHandler extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
String s="Mouse dragging:X="+e.getX()+"Y="+e.getY();
tf.setText(s);
}
}
public class MouseEventHandler extends MouseAdapter
{
public void mouseEntered(MouseEvent e)
{
String s="The mouse entered";
tf.setText(s);
}
public void mouseExited(MouseEvent e)
{
String s="The mouse left the building";
tf.setText(s);
}
}
public class WindowEventHandler extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(1);
}
}
}
第3点规则是:有一个以上抽象方法的类必须声明为抽象类.
声明为抽象的类可以不包含抽象方法.
我是觉得既然有一个以上抽象方法的类就必定要声明为抽象类了,那在类声明前加abstract有什么用?也就是说,只要一个类中包含了一个以上的抽象方法,这就绝对是不可以实例化的了,就不需要再加abstract声明它是抽象类不可实例化了.