在java中调用父构造函数

时间:2014-04-28 06:05:09

标签: java constructor

我有两个课程ParentChild,而Parent有一个需要3个参数的构造函数:

class Parent{
    public Parent(String host,String path,int port){
    }
}

现在我希望Child构造函数只需要一个参数,然后我尝试做这样的事情:

class Child extend Parent{
    public Child(String url){
        String host=getHostFromUrl(url);
        String path=....
        String port=...
        super(host,path,port);
    }
}

但这不起作用。

有什么想法来解决它吗?

顺便说一句,我无法访问Parent课程。

2 个答案:

答案 0 :(得分:12)

super 的调用必须是构造函数体中的第一个语句。来自section 8.8.7 of the JLS

  

构造函数体的第一个语句可能是对同一个类或直接超类(§8.8.7.1)的另一个构造函数的显式调用。

你只需要内联电话:

public Child(String url) {
    super(getHostFromUrl(url), getPathFromUrl(url), getPortFromUrl(url));
}

或者,将解析为一些更清晰的URL表示,并调用同一个类中的另一个构造函数:

public Child(String url) {
    this(new URL(url));
}

// Or public, of course
private Child(URL url) {
    super(url.getHost(), url.getPath(), url.getPort());
}

(我没有检查这些成员是否适用于java.net.URL - 这更多是通过一种方法而不是细节。根据您的实际要求进行调整。)

答案 1 :(得分:1)

尝试类似

的内容
public class Parent {
  public Parent(String host, String path, int port) {
  }
}

class Child extends Parent {
  public Child(String url) {
    super(getHost(url), getPath(url), getPort(url));
  }

  static String getHost(String url) {
    // Logic to calculate host
    return url;
  }

  static String getPath(String url) {
    // Logic to calculate path
    return url;
  }

  static int getPort(String url) {
    // Logic to calculate port
    return 8080;
  }
}