继承:子类的构造函数调用super()有什么意义?

时间:2023-01-19 15:40:03
这是JAVA中RuntimeException的定义摘要:
public class RuntimeException extends Exception {
    static final long serialVersionUID = -7034897190745766939L;

    /** Constructs a new runtime exception with <code>null</code> as its
     * detail message.  The cause is not initialized, and may subsequently be
     * initialized by a call to {@link #initCause}.
     */
    public RuntimeException() {
super();
    }
  从英文注释来看,这个构造子是用来以后加内容的,不过,那一句super(),调与不调,一个样啊,创建子类的时候,自然会去调用父类的构造函数,有什么必要写在哪里?

20 个解决方案

#1


关注中。。

#2


构造器不会被继承
你所说的自动调用super是当用户没有明确写构造器而由编译器自动生成时

#3


to drinkant(喝酒的蚂蚁) :
“构造器不会被继承”--没错,我并没有说其可以继承。这个我知道。
“你所说的自动调用super是当用户没有明确写构造器而由编译器自动生成时”
--对,你也没说错,不过并没有回答我的问题。
  既然调用super(),自然不设计其他带参数的构造函数。就算子类的构造函数有内容,super()从我所做的试验来看都是可有可无的。

#4


super()是不有可无,但其可以简化程序

#5


也同上,可以简化程序,当某个参数不同时,将该参数修改,然后用super()重写一次就ok了。

#6


简化程序?是用在别的地方吧,就
    public RuntimeException() {
super();
    }
有什么简化吗?

#7


super();用来调用父类的构造方法.
比如你继承了JTextField类,你必须在你的构造方法中掉用super();

#8


to:zh_baiyu(SkyBay) 
  不是必须的。试验代码如下:

import javax.swing.*;
class test{
    static public class testSuper extends JTextField{
     public String sa;
    }
    public static void main(String[] args){
       testSuper ts = new testSuper();
       ts.sa = "hello";
    }
}
编译通过

#9


试验代码2:
import javax.swing.*;
class test{
    static public class testSuper extends JTextField{
     public testSuper(){
     System.out.println("可以不调用super()");
     }
     public String sa;
    }
    public static void main(String[] args){
       testSuper ts = new testSuper();
       ts.sa = "hello";
    }
}
输出结果:
  可以不调用super()

#10


当你的超类有很多子类的时候,
那根据设计模式的观点,
公共的代码就应该放在超类中。
这时候就能体现出super()的优势,
公共的部分,只需要在超类中实现一次。

#11


如果子类没有定义构造函数,就自动用super()。

#12


调用 super() ,可以完成一些必要的初始功能,如果你需要的话。

#13


如果没人有异议,我就这样总结了:
  1.这个super()和其他子类调用父类的方法一样,如果下面还有代码,就是简化了代码,直接调用父类的功能;
  2.如果像我上面写的那样,只有这一句调用,没有子类的其他增强代码,则仅仅是为了提醒‘有这个方法’,便于以后扩展。

#14


子类的构造函数都会先调用父类的默认构造函数。

#15


如果父类的构造函数是private,那就不可以被任何类所访问,只有public或是protected才可以被子类所访问。

#16


运用super():
public class MessageDemo extends JFrame
{
   ....
    public MessageDemo()
   {
       this.setTitle("Message !");
    }
    //比较
    public MessageDemo()
    {
        super("Message !");
         //这句代码等于new JFrame("Message !");
     }
}
  

#17


总之,super关键字可以去调用父类的方法。

#18


我来说

首先确定一件事情: 子类一定会调用父类的构造方法。

然后再说子类如何调用父类的构造方法。

1. 如果子类的构造方法里没有显示的调用父类的构造方法。则子类的构造方法会自动调用父类的默认构造。

2. 如果子类的构造方法里明确的调用了父类的构造方法。则就按照这个调用。不再调用默认的构造了。

基于这个事实。  楼主的问题就很好回答。他的代码,子类的构造方法里调用了父类的构造方法: super(); 但是他是显式的调用了父类的默认构造方法。所以这种情况下写super();和不写super();是一样的。 

但是假如父类里面还有别的构造方法比如 super(String a); 那在子类里写 
super("myName");
和不写效果就不一样了。不写的话就调用super();了

#19


回复人: baopingle() ( ) 信誉:100  2003-11-06 13:59:00  得分:0 
 
 
  如果父类的构造函数是private,那就不可以被任何类所访问,只有public或是protected才可以被子类所访问。

  
 
如果一个类的默认构造函数是private,那么此类将不能被继承

#20


你是在jbuilder 里吧
可以下结论,super()有时有用,有时没有用,但看情况

#1


关注中。。

#2


构造器不会被继承
你所说的自动调用super是当用户没有明确写构造器而由编译器自动生成时

#3


to drinkant(喝酒的蚂蚁) :
“构造器不会被继承”--没错,我并没有说其可以继承。这个我知道。
“你所说的自动调用super是当用户没有明确写构造器而由编译器自动生成时”
--对,你也没说错,不过并没有回答我的问题。
  既然调用super(),自然不设计其他带参数的构造函数。就算子类的构造函数有内容,super()从我所做的试验来看都是可有可无的。

#4


super()是不有可无,但其可以简化程序

#5


也同上,可以简化程序,当某个参数不同时,将该参数修改,然后用super()重写一次就ok了。

#6


简化程序?是用在别的地方吧,就
    public RuntimeException() {
super();
    }
有什么简化吗?

#7


super();用来调用父类的构造方法.
比如你继承了JTextField类,你必须在你的构造方法中掉用super();

#8


to:zh_baiyu(SkyBay) 
  不是必须的。试验代码如下:

import javax.swing.*;
class test{
    static public class testSuper extends JTextField{
     public String sa;
    }
    public static void main(String[] args){
       testSuper ts = new testSuper();
       ts.sa = "hello";
    }
}
编译通过

#9


试验代码2:
import javax.swing.*;
class test{
    static public class testSuper extends JTextField{
     public testSuper(){
     System.out.println("可以不调用super()");
     }
     public String sa;
    }
    public static void main(String[] args){
       testSuper ts = new testSuper();
       ts.sa = "hello";
    }
}
输出结果:
  可以不调用super()

#10


当你的超类有很多子类的时候,
那根据设计模式的观点,
公共的代码就应该放在超类中。
这时候就能体现出super()的优势,
公共的部分,只需要在超类中实现一次。

#11


如果子类没有定义构造函数,就自动用super()。

#12


调用 super() ,可以完成一些必要的初始功能,如果你需要的话。

#13


如果没人有异议,我就这样总结了:
  1.这个super()和其他子类调用父类的方法一样,如果下面还有代码,就是简化了代码,直接调用父类的功能;
  2.如果像我上面写的那样,只有这一句调用,没有子类的其他增强代码,则仅仅是为了提醒‘有这个方法’,便于以后扩展。

#14


子类的构造函数都会先调用父类的默认构造函数。

#15


如果父类的构造函数是private,那就不可以被任何类所访问,只有public或是protected才可以被子类所访问。

#16


运用super():
public class MessageDemo extends JFrame
{
   ....
    public MessageDemo()
   {
       this.setTitle("Message !");
    }
    //比较
    public MessageDemo()
    {
        super("Message !");
         //这句代码等于new JFrame("Message !");
     }
}
  

#17


总之,super关键字可以去调用父类的方法。

#18


我来说

首先确定一件事情: 子类一定会调用父类的构造方法。

然后再说子类如何调用父类的构造方法。

1. 如果子类的构造方法里没有显示的调用父类的构造方法。则子类的构造方法会自动调用父类的默认构造。

2. 如果子类的构造方法里明确的调用了父类的构造方法。则就按照这个调用。不再调用默认的构造了。

基于这个事实。  楼主的问题就很好回答。他的代码,子类的构造方法里调用了父类的构造方法: super(); 但是他是显式的调用了父类的默认构造方法。所以这种情况下写super();和不写super();是一样的。 

但是假如父类里面还有别的构造方法比如 super(String a); 那在子类里写 
super("myName");
和不写效果就不一样了。不写的话就调用super();了

#19


回复人: baopingle() ( ) 信誉:100  2003-11-06 13:59:00  得分:0 
 
 
  如果父类的构造函数是private,那就不可以被任何类所访问,只有public或是protected才可以被子类所访问。

  
 
如果一个类的默认构造函数是private,那么此类将不能被继承

#20


你是在jbuilder 里吧
可以下结论,super()有时有用,有时没有用,但看情况

#21