为什么重写了paint方法,就要用super语句才能访JPanel

java_wangyang 2016-05-02 01:34:04
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Project2 extends JFrame {
wdmb4 mb=null;
public Project2(){
mb=new wdmb4();
mb.setBackground(Color.yellow);//这样的话这句代码可以执行
this.add(mb);
this.setTitle("");
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){

Project2 pro=new Project2();
}

}
class wdmb4 extends JPanel{

//public void paint(Graphics g){
//super.paint(g);
//System.out.println("print方法被运行");
//}
}

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Project2 extends JFrame {
wdmb4 mb=null;
public Project2(){
mb=new wdmb4();
mb.setBackground(Color.yellow);//使用super语句,这样的话这句代码也可以执行
this.add(mb);
this.setTitle("");
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){

Project2 pro=new Project2();
}

}
class wdmb4 extends JPanel{

public void paint(Graphics g){
super.paint(g);
System.out.println("print方法被运行");
}
}

但是
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Project2 extends JFrame {
wdmb4 mb=null;
public Project2(){
mb=new wdmb4();
mb.setBackground(Color.yellow);//这样的话这句代码,就不执行
this.add(mb);
this.setTitle("");
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public static void main(String[] args){

Project2 pro=new Project2();
}

}
class wdmb4 extends JPanel{

public void paint(Graphics g){
//super.paint(g);
System.out.println("print方法被运行");
}
}

这是什么原因,
继承之后,不重写paint方法,可以访问mb.setBackground(Color.yellow);
而重写之后为什么必须要写super语句?????
...全文
293 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼上说的很明白
HerveyHall 2016-05-11
  • 打赏
  • 举报
回复
引用 2 楼 java_wangyang 的回复:
[quote=引用 1 楼 hhv_01 的回复:] 层主不才,感谢邀请 从控制台的输出看paint()方法被调用了,那么LZ的这几个程序正说明了setBackground()方法调用了paint()方法并通过paint()方法实现JPanel背景颜色的绘制;而LZ在wdmb4类重写了paint()方法,setBackground()又调用的是wdmb4中的paint()方法,所以背景颜色不变,这里的paint()方法的作用只是输出一句话。要绘制背景颜色,就要调用父类的paint()方法,即
super.paint(g);
问题提问好久,感谢回答,我明白一点: setBackground()方法不是Jpanel父类的方法,继承之后可以用子类对象调用; 还有我自API文档中看到,要使用轻级组件,就要调用super方法 要学习的知识很多 还请多多请教[/quote]指教不敢,楼下说得也很明白,就是说当一个方法被覆写了之后,它就是一个全新的方法,如果想执行父类的同名方法,就要去特意调用父类的那个方法;当然,如果这个方法没被覆写,那子类的该方法就和父类的该方法的内容相同。
awusoft 2016-05-05
  • 打赏
  • 举报
回复

public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		子类 子类对象=new 子类();
		子类对象.请说话();
	}
}
class 父类
{
	public void 说话(){
		System.out.println("父类说话,你好");
	}
	public void 请说话(){
		说话();
	}
}
class 子类 extends 父类
{
	public void 说话(){
		//不想说,让父类说
		//super.说话();
		//拦截了,不让说,或者说自己的话
		System.out.println("子类说自己的话....");
		
	}
}
awusoft 2016-05-05
  • 打赏
  • 举报
回复

public class Test {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		子类 子类对象=new 子类();
		子类对象.请说话();
	}
}
class 父类
{
	public void 说话(){
		System.out.println("父类说话,你好");
	}
	public void 请说话(){
		说话();
	}
}
class 子类 extends 父类
{
	public void 说话(){
		//不想说,让父类说
		super.说话();
	}
}
awusoft 2016-05-05
  • 打赏
  • 举报
回复
方法被覆盖了,就是只执行你的方法的内容啊.你设置颜色,本来应该在paint里执行的,可以你没执行. 你可以调用super.paint()去执行.重写方法本来就是为了要执行另外的东西,你不执行,你可以按父类的行为去执行
java_wangyang 2016-05-05
  • 打赏
  • 举报
回复
引用 1 楼 hhv_01 的回复:
层主不才,感谢邀请 从控制台的输出看paint()方法被调用了,那么LZ的这几个程序正说明了setBackground()方法调用了paint()方法并通过paint()方法实现JPanel背景颜色的绘制;而LZ在wdmb4类重写了paint()方法,setBackground()又调用的是wdmb4中的paint()方法,所以背景颜色不变,这里的paint()方法的作用只是输出一句话。要绘制背景颜色,就要调用父类的paint()方法,即
super.paint(g);
问题提问好久,感谢回答,我明白一点: setBackground()方法不是Jpanel父类的方法,继承之后可以用子类对象调用; 还有我自API文档中看到,要使用轻级组件,就要调用super方法 要学习的知识很多 还请多多请教
HerveyHall 2016-05-05
  • 打赏
  • 举报
回复
层主不才,感谢邀请 从控制台的输出看paint()方法被调用了,那么LZ的这几个程序正说明了setBackground()方法调用了paint()方法并通过paint()方法实现JPanel背景颜色的绘制;而LZ在wdmb4类重写了paint()方法,setBackground()又调用的是wdmb4中的paint()方法,所以背景颜色不变,这里的paint()方法的作用只是输出一句话。要绘制背景颜色,就要调用父类的paint()方法,即
super.paint(g);

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧