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语句?????

解决方案 »

  1.   

    层主不才,感谢邀请
    从控制台的输出看paint()方法被调用了,那么LZ的这几个程序正说明了setBackground()方法调用了paint()方法并通过paint()方法实现JPanel背景颜色的绘制;而LZ在wdmb4类重写了paint()方法,setBackground()又调用的是wdmb4中的paint()方法,所以背景颜色不变,这里的paint()方法的作用只是输出一句话。要绘制背景颜色,就要调用父类的paint()方法,即
    super.paint(g);
      

  2.   

    问题提问好久,感谢回答,我明白一点:
    setBackground()方法不是Jpanel父类的方法,继承之后可以用子类对象调用;
    还有我自API文档中看到,要使用轻级组件,就要调用super方法
    要学习的知识很多
    还请多多请教
      

  3.   

    方法被覆盖了,就是只执行你的方法的内容啊.你设置颜色,本来应该在paint里执行的,可以你没执行.
    你可以调用super.paint()去执行.重写方法本来就是为了要执行另外的东西,你不执行,你可以按父类的行为去执行
      

  4.   


    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.说话();
    }
    }
      

  5.   


    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("子类说自己的话....");

    }
    }
      

  6.   

    问题提问好久,感谢回答,我明白一点:
    setBackground()方法不是Jpanel父类的方法,继承之后可以用子类对象调用;
    还有我自API文档中看到,要使用轻级组件,就要调用super方法
    要学习的知识很多
    还请多多请教指教不敢,楼下说得也很明白,就是说当一个方法被覆写了之后,它就是一个全新的方法,如果想执行父类的同名方法,就要去特意调用父类的那个方法;当然,如果这个方法没被覆写,那子类的该方法就和父类的该方法的内容相同。