Java中super有什么用,什么时候用他,什么时候extends Frame(JFrame)
什么时候extendsFrame或JFrame啊?为什么有的时候又不用继承FramepackageCZYH;importjava.awt.BorderLayout;imp...
什么时候extends Frame 或 JFrame啊?为什么有的时候又不用继承Frame
package CZYH;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class YingChang extends Frame{
private String [] name = { "s","w","e","n","c"};
private String location [] = { BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.WEST,BorderLayout.EAST,BorderLayout.SOUTH};
private Button [] b = new Button[5];
public YingChang( String tie){
//super( tie);
final BorderLayout layout = (BorderLayout) this.getLayout();
ActionListener liste = new ActionListener(){
public void actionPerformed(ActionEvent e) {
for(int i=0;i<b.length; i++){
if(e.getSource()==b[i]){
b[i].setVisible(false);
}else{
b[i].setVisible(true);
}
layout.layoutContainer(YingChang.this);
}
}
};
for(int i=0; i<b.length; i++){
b[i] = new Button(name[i]);
b[i].addActionListener(liste);
add(b[i],location[i]);
}
setSize( 200,200);
setVisible( true);
}
public static void main(String[] args) {
new YingChang( "i done it")
}
package Super;
//这里为什么不用继承 Frame啊,什么时候继承Frame啊???
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Exceple {
private Frame f;
private Panel p;
private FlowLayout fl;
private Button Buttonlefe,ButtonCenter,ButtonRight;
public Exceple(){
f = new Frame( "test");
fl = new FlowLayout();//为什么要new FlowLayout?
ButtonCenter = new Button( "center");
Buttonlefe = new Button( "left");
ButtonRight = new Button( "right");
ButtonCenter.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.CENTER);
fl.layoutContainer(f);
}
});
Buttonlefe.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.LEFT);
fl.layoutContainer(f);
}
});
ButtonRight.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.RIGHT);
fl.layoutContainer( f);
}
});
f.setLayout(fl);
f.add(ButtonCenter);
f.add(Buttonlefe);
f.add(ButtonRight);
f.setSize(200,200);
f.setVisible(true);
}
public static void main(String[] args) {
new Exceple();
}
} 展开
package CZYH;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class YingChang extends Frame{
private String [] name = { "s","w","e","n","c"};
private String location [] = { BorderLayout.CENTER,BorderLayout.NORTH,BorderLayout.WEST,BorderLayout.EAST,BorderLayout.SOUTH};
private Button [] b = new Button[5];
public YingChang( String tie){
//super( tie);
final BorderLayout layout = (BorderLayout) this.getLayout();
ActionListener liste = new ActionListener(){
public void actionPerformed(ActionEvent e) {
for(int i=0;i<b.length; i++){
if(e.getSource()==b[i]){
b[i].setVisible(false);
}else{
b[i].setVisible(true);
}
layout.layoutContainer(YingChang.this);
}
}
};
for(int i=0; i<b.length; i++){
b[i] = new Button(name[i]);
b[i].addActionListener(liste);
add(b[i],location[i]);
}
setSize( 200,200);
setVisible( true);
}
public static void main(String[] args) {
new YingChang( "i done it")
}
package Super;
//这里为什么不用继承 Frame啊,什么时候继承Frame啊???
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Exceple {
private Frame f;
private Panel p;
private FlowLayout fl;
private Button Buttonlefe,ButtonCenter,ButtonRight;
public Exceple(){
f = new Frame( "test");
fl = new FlowLayout();//为什么要new FlowLayout?
ButtonCenter = new Button( "center");
Buttonlefe = new Button( "left");
ButtonRight = new Button( "right");
ButtonCenter.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.CENTER);
fl.layoutContainer(f);
}
});
Buttonlefe.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.LEFT);
fl.layoutContainer(f);
}
});
ButtonRight.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
fl.setAlignment( FlowLayout.RIGHT);
fl.layoutContainer( f);
}
});
f.setLayout(fl);
f.add(ButtonCenter);
f.add(Buttonlefe);
f.add(ButtonRight);
f.setSize(200,200);
f.setVisible(true);
}
public static void main(String[] args) {
new Exceple();
}
} 展开
4个回答
展开全部
复合优与继承,所以不用继承。
http://tonylian.javaeye.com/blog/385450
继承(指的是子类扩展超类,并不包含接口)是实现代码重用的有力手段,但它并不总是完成这项工作的最佳工具。不适当地使用继承会导致脆弱的软件。
与方法调用不同的是,继承打破了封装性。换句话说子类依赖于超类中特定功能的实现细节。超类的实现可能随着发行版本而变化,就有可能影响子类。因此,子类必须要跟着超类的更新而发展。除非超类是专门为扩展而设计的,并且具有很好的说明文档。
那么继承回来带什么不安定因素呢?书中第62-65页(潘爱民的中译版,下同)给出了一个扩展HashSet的例子,由于篇幅问题,这里就不摘抄了。
从本条的题目看,是有一种叫做复合的技术,更适合。事实上,书中的例子正是举出继承的脆弱性,又给出使用复合的处理方法。其实,所谓复合就是在原来的“子类”中,不再继承“超类”,而是声明一个私有的域,并使用“超类”类型。
我在以前的帖子中,也曾在讨论“自造控件”时提到过 继承 与 复合(http://bbs.airia.cn/FLEX/thread-2978-1-1.aspx)。那时候我给它们分别起了个非常具有比喻意味的别名——改装 和 组装。是以汽车为例的,比如我们要给一辆量产车上加上一个大号的尾翼(最近由于飞车党撞人事件,网络上都在声讨非法改装,与本例无关,我这里只是举个例子,最终要说明的还是编程技术问题),我们可以理解为以原来的车为基础,在基础之上为了扩展更能而加装了尾翼;另一种思维方式,我们也可以理解为我们是在“制造”一辆赛车,用了两个“零件”,一个是一辆量产车,另一个是赛车尾翼。
这两种“思路”反应在程序上,就是 继承 与 复合 的关系。按照本条的“精神”,如果可以用复合实现,那么就该优先使用复合,而不是继承。从自造Flex控件的工程中,我的一点体会来看,我感觉Flex的控件既不是转为继承而设计的(那些控件的超类除外),也并不明确禁止你去扩展。而在实际中确实发现,如果你不能完全读懂并驾驭原控件的源码,并能很好的改写所有你该改写的方法,那么使用继承确实是一件很危险的事情。比如我就遇到了无法扩展原控件的显示区域的问题。稳妥的办法就是使用复合,当然也会带来一些小麻烦,就如同本条中例子(书第65页)一样也会遇到这样的事情,就是如果你想将原控件(“超类”,例中的HashSet)中的公有成员依然暴露出来的话,就必须逐一为它们写getter方法。
http://tonylian.javaeye.com/blog/385450
继承(指的是子类扩展超类,并不包含接口)是实现代码重用的有力手段,但它并不总是完成这项工作的最佳工具。不适当地使用继承会导致脆弱的软件。
与方法调用不同的是,继承打破了封装性。换句话说子类依赖于超类中特定功能的实现细节。超类的实现可能随着发行版本而变化,就有可能影响子类。因此,子类必须要跟着超类的更新而发展。除非超类是专门为扩展而设计的,并且具有很好的说明文档。
那么继承回来带什么不安定因素呢?书中第62-65页(潘爱民的中译版,下同)给出了一个扩展HashSet的例子,由于篇幅问题,这里就不摘抄了。
从本条的题目看,是有一种叫做复合的技术,更适合。事实上,书中的例子正是举出继承的脆弱性,又给出使用复合的处理方法。其实,所谓复合就是在原来的“子类”中,不再继承“超类”,而是声明一个私有的域,并使用“超类”类型。
我在以前的帖子中,也曾在讨论“自造控件”时提到过 继承 与 复合(http://bbs.airia.cn/FLEX/thread-2978-1-1.aspx)。那时候我给它们分别起了个非常具有比喻意味的别名——改装 和 组装。是以汽车为例的,比如我们要给一辆量产车上加上一个大号的尾翼(最近由于飞车党撞人事件,网络上都在声讨非法改装,与本例无关,我这里只是举个例子,最终要说明的还是编程技术问题),我们可以理解为以原来的车为基础,在基础之上为了扩展更能而加装了尾翼;另一种思维方式,我们也可以理解为我们是在“制造”一辆赛车,用了两个“零件”,一个是一辆量产车,另一个是赛车尾翼。
这两种“思路”反应在程序上,就是 继承 与 复合 的关系。按照本条的“精神”,如果可以用复合实现,那么就该优先使用复合,而不是继承。从自造Flex控件的工程中,我的一点体会来看,我感觉Flex的控件既不是转为继承而设计的(那些控件的超类除外),也并不明确禁止你去扩展。而在实际中确实发现,如果你不能完全读懂并驾驭原控件的源码,并能很好的改写所有你该改写的方法,那么使用继承确实是一件很危险的事情。比如我就遇到了无法扩展原控件的显示区域的问题。稳妥的办法就是使用复合,当然也会带来一些小麻烦,就如同本条中例子(书第65页)一样也会遇到这样的事情,就是如果你想将原控件(“超类”,例中的HashSet)中的公有成员依然暴露出来的话,就必须逐一为它们写getter方法。
展开全部
那个Frame是容器类,如果你继承了Frame或者JFrame的话当你这个类就不需要
New一个Frame对象也能直接把按钮之类的对象用ADD方法加进去.举个例子,比如平时要Frame f=new Frame();
Button b=new Button("确定");
然后用f.add(b);这样添加进去这个f容器对象里
如果继承了Frame的类的代码就可以变成
this.add(b)
那就不需要再New了
至于Super就是调用父类的方法,比如说
A类里面有个方法test,方法里面做一个简单的打印123
B类继承A类,然后他有个也有个方法test里面做个简单的打印321 再加一个super.test()
然后测试一下,B a=new B();
a.test();
从打印出来的结果你就知道Super大概干什么用了,你再把B里面test方法里的super.test()代码去掉再运行一次就知道什么回事了
New一个Frame对象也能直接把按钮之类的对象用ADD方法加进去.举个例子,比如平时要Frame f=new Frame();
Button b=new Button("确定");
然后用f.add(b);这样添加进去这个f容器对象里
如果继承了Frame的类的代码就可以变成
this.add(b)
那就不需要再New了
至于Super就是调用父类的方法,比如说
A类里面有个方法test,方法里面做一个简单的打印123
B类继承A类,然后他有个也有个方法test里面做个简单的打印321 再加一个super.test()
然后测试一下,B a=new B();
a.test();
从打印出来的结果你就知道Super大概干什么用了,你再把B里面test方法里的super.test()代码去掉再运行一次就知道什么回事了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
继承与不继承是一样的,如果继承了,在调用父类方法的时候不用生成对象,也不用写对象名了,如果不继承,就要先生成一个Frame的对象,然后用对象名去引用Frame类里面的方法和属性。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Super就是调用父类的方法,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询