昨天写了一段代码,其中就出现了用子类创建父类对象,却调用不了子类方法的问题
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class Demo extends JFrame {
private JLabel label;
String phoneNums[] = { "13610789516", "15846321694", "15549862315", "15547961368", "17925648951", "18895463256" };
MyThread t ;//*********创建"自定义线程"****
public Demo() {//******在构造方法中调用自定义线程,所以用MyThread,如果是在main()方法中,则调用Thread()
setTitle("手机抽奖号码");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(200, 200, 300, 150);
label = new JLabel("0");//*******创建标签
label.setHorizontalAlignment(SwingConstants.CENTER);// ***设置标签居中
label.setFont(new Font("宋体", Font.PLAIN, 42));// ****标签使用99号字
getContentPane().add(label, BorderLayout.CENTER);// *****将标签放入窗体容器中间
JButton btn = new JButton("暂停");//*****创建按钮
getContentPane().add(btn, BorderLayout.SOUTH);// ***将按钮放入窗口容器的南部区域
t = new MyThread();//******创建自定义线程对象
t.start();//*****线程开始
btn.addActionListener(new ActionListener() {//*******为按钮添加事件监听
public void actionPerformed(ActionEvent e) {
String btnText = btn.getText();// ****获取按钮文本
if (btnText.equals("暂停")) {// ****如果按钮文本为“暂停”
t.toSuspend();//********调用toSuspend()方法,实现对线程的暂停
btn.setText("继续");// ****将按钮文本改为“继续”
;//****是线程暂停
} else {
t.toResume();//********调用toResume()方法,实现对现成的恢复
btn.setText("暂停");//****将按钮文本改为“暂停”
}
}
});
setVisible(true);//**********实现窗口可视化
}
// ***创建内部线程类
class MyThread extends Thread {
private boolean suspend = false;//***创建暂停标志
public synchronized void toSuspend(){
suspend = true;
}
public synchronized void toResume(){
suspend = false;
notify();//****唤醒线程
}
public void run() {
while (true) {
synchronized (this) {
while(suspend){
try {
wait();//****使线程进入等待状态
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
int randomIdex = new Random().nextInt(phoneNums.length);// ********获取数组随机索引******获取0到数组长度的一个随机整数
String phoneNum = phoneNums[randomIdex];
label.setText(phoneNum);// ****修改标签中的值
}
}
}
public static void main(String[] args) {
new Demo();
}
}
其中我创建了MyThread子类,继承Thread父类,起初我是在构造方法中通过子类的构造方法调用父类的对象,但是报错了————method toSuspend() is undefined for the type Thread(Thread没有roSuspend方法),也就是这个对象只能调用父类已有的方法,而不能调用子类除构造方法之外的方法。
所以后来我就用只定义的子类创建子类自己的对象,这样就解决了问题,希望能给大家带来帮助。