关于用子类创建父类对象的问题

昨天写了一段代码,其中就出现了用子类创建父类对象,却调用不了子类方法的问题

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方法),也就是这个对象只能调用父类已有的方法,而不能调用子类除构造方法之外的方法。

所以后来我就用只定义的子类创建子类自己的对象,这样就解决了问题,希望能给大家带来帮助。

猜你喜欢

转载自blog.csdn.net/zhu_rui/article/details/104634146
今日推荐