java语言不是不支持多继承吗,这里已经继承了JFrame类,不是靠只能实现Runnable接口来创建线程吗?

java语言不是不支持多继承吗,这里已经继承了JFrame类,不是靠只能实现Runnable接口来创建线程吗?这里的匿名内部类并没有实现Runnable接口啊

首先,不一定需要继承JFrame类,但是继承JFrame类更方便,更容易操作

补充:
不继承JFrame类:

import javax.swing.*;
public class Demo
{
public Demo()
{
JFrame jf=new JFrame("不继承JFrame的窗口");
jf.setBounds(300, 300, 500, 500);
jf.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
补充:
继承JFrame类:

import javax.swing.*;
public class Demo extends JFrame
{
public Demo()
{
this.setTitle("继承JFrame的窗口");
this.setBounds(300, 300, 500, 500);
this.setVisible(true);
}
public static void main(String[] args)
{
Demo d=new Demo();
}
}
界面设计用Swing,事件监测用awt。JFrame是一个大框架。一般在使用时,我们将自己的主类继承JFrame。
public class review_jpanel extends JFrame{
//JPanel mypanel = new JPanel();
static int frame_w = 300;
static int frame_h = 200;
public static void main(String[] args){
review_jpanel test = new review_jpanel();
}
public review_jpanel(){
this.setTitle("review jpanel");
this.setSize(frame_w, frame_h);
this.setLocation(200, 300);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
MyPanel mypanel = new MyPanel();
this.add(mypanel);
Thread xc3 = new Thread(mypanel);
xc3.start();
}
}
在JFrame初始化中,我们需要设置宽度,高度,标题,窗口可伸缩,关闭释放资源(setDefaultCloseOperation,这个一定要加上!),可见。初始化完成后,我们可以在里面添加控件,例如JLabel,JButton,可以进行简单的布局(比较简单,不详细说明)。
JPanel是一个画板,我们可以在上面画图形,(圆,直线,矩形,等等),它只是一个画板,我们要把它添加到我们的JFrame里面去。一般我们自己定义一个类如mypanel,用它继承JPanel。因为如果直接使用类JPanel有很多操作难以完成(例如在JPanel加入监听事件,加入线程)。
class MyPanel extends JPanel implements Runnable{
line myline = new line();
public MyPanel(){
super.paint(null);
Thread xc1 = new Thread(myline);
xc1.start();
}
public void paint(Graphics g){
super.paint(g);
//g.drawLine(this.myline.x, this.myline.y, 230, 320);
g.drawOval(10,10,this.myline.x,this.myline.y);
}
public void run(){
//while(true){
try{
Thread.sleep(10);
}
catch(Exception d){}
this.repaint();
System.out.println("+1\n");
Thread xc4 = new Thread(this);
xc4.start();
//}
}
}
继承了JPanel后,我们要在MyPanel类中,重载paint方法。(方法名不是我取的,参数也不是我取的,都是固定的,记住就行。参数g类似于画笔,它有很多方法)。可以把paint方法理解为你要jpanel去做什么,要它画什么东西,怎么画。
线程,具体的定义以及和进程的区别不是主要的内容,这里主要讲在JPanel中直观的将线程表现出来,比那些理论更容易接受。所谓线程,在我理解就是让一个实例拥有了“运动”的属性,这也就是为什么线程中核心就是run方法。什么叫做“运动”的属性呢?假设我们自己定义一个类,一个矩形类,它的元素有起点坐标,长度,宽度。然后我们在JPanel中将它画出来,它就是一个死的矩形,不会运动,长度,宽度,颜色,位置都不会变。
现在我们赋予它“运动”的属性,(容易理解开启线程时在类的后面需要实现Runnable)让它实现Runnable这个接口。现在它就是可以运动了,那么怎么运动呢?我们还需要重写run方法,告诉它怎么运动。具体例子如下
class line implements Runnable{
int x=0,y=0;
public void run(){
this.x+=10;
this.y+=10;
try{
Thread.sleep(1000);
}
catch(Exception d){}
Thread xc= new Thread(this);
xc.start();
}
}
很简单的一个类,直线类,由于是测试线程,这里只改变它的x和y。在run方法中,我们让x+10,y+10,延迟1秒之后开启本次线程。然后在MyPanel中,开启此类实例化的myline的线程。在JFrame中,开启JPanel的线程。(myline在JPanel中,JPanel镶嵌在JFrame中,全部都要开启线程)。将上面的程序编译后就可以看到一个一秒钟半径改变一次的圆,直观的看到这个圆是可以运动的。
注:
1.让JPanel不断的画圆,除了程序中在run方法中调用repaint方法,然后重新开始此线程,还可以使用我们学51时的while(true)语句,也就是一直重载run方法
2.run方法中的延时方法需要使用抛异常处理(系统这么规定,记住就行)
3.由程序可以看出,开启线程时一般书写习惯在构造方法中开启。
希望可以帮到你,可以一起相互交流交流!!!追问

可这里并不是实现多接口,我奇怪就奇怪在这里,如果是实现接口,我可以理解,可这里却是继承Thread类,继承了JFrame,怎么还能继承Thread类呢?

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-08-17
不支持多继承是不能继承多个父类。 而接口不是类,java可以实现多接口。
你可以这样理解,继承类,会继承类的方法。
而实现接口,所有的方法是需要你重构的追问

可这里并不是实现多接口,我奇怪就奇怪在这里,如果是实现接口,我可以理解,可这里却是继承Thread类,继承了JFrame,怎么还能继承Thread类呢?

追答

你理解错了。 这个代码只是在内部做了一个匿名类去继承thread。本身没有继承thread。
这个匿名类只是里面的一个成员变量。
你这样理解一下。
Class B 继承了Thread。
Class A 继承了 JFrame。 而且A里有个成员 B b 。
只是由于B只用一次。所以简化的写法是吧B的定义放在A里,连B的名称都省略了。 这个就叫做匿名类。
你可以在网上再查一下匿名类的说明

本回答被网友采纳
第2个回答  2020-08-16
匿名内部类是不同于InterrupedSwing类的另外一个类,它也可以继承一个超类,这里就是让匿名内部类继承Thread类。本回答被提问者采纳
第3个回答  2020-08-16
InterruptedSwing继承了JFrame类关thread什么事?

java面试题全集中?
不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。 7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数? 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。 Java中构造函数...

java面试中经常被问到的问题有哪些?
通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。相比扩展Thread,实现Runnable接口可能更优.原因有二:Java不支持多继承。因此扩展Thread类就代表这个子类不能扩展其他类。而实现Runnable接口的类还可能扩展另一个类。类可能只要求可执行即可,因此继承整个Thread类的开销过大。5、Thread类中的star...

java面试题汇总(一)?
2、创建两种线程的方式?他们有什么区别?通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。相比扩展Thread,实现Runnable接口可能更优.原因有二:Java不支持多继承。因此扩展Thread类就代表这个子类不能扩展其他类。3、第三,StaticNestedClass和InnerClass的不同,说得越多越好(面试题有的很笼统)...

高级java面试问题(java中高级面试技术问题)
Java开发面试题自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。Java支持多继承么?不支持,Java不支持多继承。java异常机制的原理与应用\\x0d\\x0a每当程序出现异常之后,如果程序没有进行相应的处理,则程...

java是什么
2、Java语言是一个面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 3、Java语言是分布式的...

JAVA题一份,求答案,满意给高分,时间紧迫,速度!!
Java不支持多重继承,但可通过(实现多个interface)实现多继承。Java源程序经编译生成的字节码文件的扩展名为(.class)Java的核心包中,提供编程应用的基本类的包是(java.lang)每个Java应用程序可以包括许多方法,但必须有且只能有一个(main)方法。当实现Runnable接口时,要实现的方法是(public void ...

JAVA.包 JAVA类 JAVA APPLET ...等跟JAVA挨得上边得都要!
由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是 public static,所有方法...

Java面试题
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap...

Java多线程是什么意思?
Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了...

Java多线程和单线程怎么通俗易懂的理解?
Java的核心特性之一就是支持多线程,线程是程序执行的基本单元,每个线程都有自己的栈空间,虽然可以共享程序的全局资源,但每个线程的执行是独立的。要实现多线程,你可以选择继承Thread类或者实现Runnable接口。前者适用于简单扩展,而后者则避免了Java单继承的限制,但设计上稍显复杂。创建Java线程有三种方法...

相似回答