文档章节

如何在Java中从另一个调用一个构造函数?

 技术盛宴
发布于 12/03 20:30
字数 888
阅读 11
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

是否可以从另一个(在同一类中,而不是在子类中)调用构造函数? 如果是,怎么办? 调用另一个构造函数的最佳方法是什么(如果有几种方法可以做到)?


#1楼

[ 注意:我只想添加一个方面,而我在其他答案中没有看到:如何克服this()必须在第一行的要求的限制)。 ]

在Java中,可以通过this()从构造函数中调用同一类的另一个构造函数。 但是请注意, this必须在第一行。

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, 0.0);
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }
}

this有出现在第一线看起来像一个大的限制,但可以通过静态方法构建其他构造函数的参数。 例如:

public class MyClass {

  public MyClass(double argument1, double argument2) {
    this(argument1, argument2, getDefaultArg3(argument1, argument2));
  }

  public MyClass(double argument1, double argument2, double argument3) {
    this.argument1 = argument1;
    this.argument2 = argument2;
    this.argument3 = argument3;
  }

  private static double getDefaultArg3(double argument1, double argument2) {
    double argument3 = 0;

    // Calculate argument3 here if you like.

    return argument3;

  }

}

#2楼

当我需要从代码内部调用另一个构造函数时(不在第一行中),我通常使用如下的辅助方法:

class MyClass {
   int field;


   MyClass() {
      init(0);
   } 
   MyClass(int value) {
      if (value<0) {
          init(0);
      } 
      else { 
          init(value);
      }
   }
   void init(int x) {
      field = x;
   }
}

但是,大多数情况下,我会尽可能尝试通过从第一行中较简单的构造函数中调用较复杂的构造函数来进行另一种方法。 对于上面的例子

class MyClass {
   int field;

   MyClass(int value) {
      if (value<0)
         field = 0;
      else
         field = value;
   }
   MyClass() {
      this(0);
   }
}

#3楼

对的,这是可能的:

public class Foo {
    private int x;

    public Foo() {
        this(1);
    }

    public Foo(int x) {
        this.x = x;
    }
}

要链接到特定的超类构造函数而不是同一类中的构造函数,请使用super代替this 。 请注意, 您只能链接到一个构造函数 ,并且它必须是构造函数主体中的第一条语句

另请参见 C#有关但适用相同原理的相关问题


#4楼

使用this(args) 。 首选模式是从最小的构造函数到最大的构造函数。

public class Cons {

    public Cons() {
        // A no arguments constructor that sends default values to the largest
        this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);
    }

    public Cons(int arg1, int arg2) {
       // An example of a partial constructor that uses the passed in arguments
        // and sends a hidden default value to the largest
        this(arg1,arg2, madeUpArg3Value);
    }

    // Largest constructor that does the work
    public Cons(int arg1, int arg2, int arg3) {
        this.arg1 = arg1;
        this.arg2 = arg2;
        this.arg3 = arg3;
    }
}

您还可以使用最近倡导的valueOf方法或“ of”方法:

public class Cons {
    public static Cons newCons(int arg1,...) {
        // This function is commonly called valueOf, like Integer.valueOf(..)
        // More recently called "of", like EnumSet.of(..)
        Cons c = new Cons(...);
        c.setArg1(....);
        return c;
    }
} 

要调用超类,请使用super(someValue) 。 对super的调用必须是构造函数中的第一个调用,否则会出现编译器错误。


#5楼

正如大家已经说过的,您可以使用this(…) ,这称为显式构造函数调用

但是,请记住,在这样的显式构造函数调用语句中, 您可能不会引用

  • 任何实例变量
  • 任何实例方法
  • 此类中声明的任何内部类或任何超类,或
  • this
  • super

如JLS(第8.8.7.1节)所述。

本文转载自:https://stackoom.com/question/1CBd/如何在Java中从另一个调用一个构造函数

粉丝 0
博文 230
码字总数 0
作品 0
深圳
高级程序员
私信 提问
clojure 新手指南(10):与java交互

clojure是基于jvm的语言,就是说clojure会被编译成字节码被jvm执行。但是clojure能做的可不仅仅是被编译成字节码,它提供了一套API让用户与java交互。因此clojure可以直接调用java世界中那些...

凯奥斯
2013/07/07
2.6K
1
构造函数、构造代码块、this关键字

构造函数、构造代码块、this关键字 一、构造函数 1.构造函数的作用 给对应的对象进行初始化。 2.构造函数的定义格式 3.构造函数要注意的细节 构造函数是没有返回值类型的。 构造函数的函数名...

JS_HCX
2018/12/07
0
0
java多线程系列:通过对战游戏学习CyclicBarrier

CyclicBarrier是java.util.concurrent包下面的一个工具类,字面意思是可循环使用(Cyclic)的屏障(Barrier),通过它可以实现让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一...

huangzd
2018/01/06
0
0
Java finalize方法

《JAVA编程思想》: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4)....

清风伴月
2017/10/22
51
0
从原理来理解继承关系的类初始化和实例化的顺序

就像之前的一个评论.我们学习的是思路. 很多人都知道继承关系的类的初始化和实例化的顺序,但如果忘记了怎么办? 如何找到自己的答案? 又如果遇到的问题是关于泛型的擦除问题,又该如何去分析?...

xpbug
2013/03/03
2.3K
4

没有更多内容

加载失败,请刷新页面

加载更多

CrashReport

CrashReport.initCrashReport(getApplicationContext(), buglyID, false); https://bugly.qq.com/v2/ https://blog.csdn.net/Crystal_xing/article/details/86249373......

shzwork
16分钟前
2
0
OSChina 周日乱弹 —— 吃这个吮指原味小松鼠

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐# 分享Sam Jonsson/Mattafix的单曲《Big City Life (Sam Jonsson Remix)》: 《Big City Life (Sam Jons...

小小编辑
今天
8
0
使用Docker部署第一个Springboot项目

创建springboot项目后pom文件添加 <packaging>jar</packaging> 双击package打包。 双击package即可,最后只要等待控制台输出SUCCESS即可。 我们会在项目中的target文件夹中到自己打包的jar。...

Ryub
今天
7
0
Spring Boot 中使用@DateTimeFormat和@JsonFormat注解

import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import lombok.experimental.Accessors;import org.springframework.format.annotation.DateTimeFormat;......

不再熬夜
昨天
6
0
Qt编写图片及视频TCP/UDP网络传输

一、前言 很多年前就做过类似的项目,无非就是将本地的图片上传到服务器,就这么简单,其实用http的post上传比较简单容易,无需自定义协议,直接设置好二进制数据即可,而采用TCP或者UDP通信...

飞扬青云
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部