精华内容
下载资源
问答
  • 我想知道在Java中构造函数重载的最佳实践是什么。 我已经对这个问题有了自己的想法,但我想听听更多建议。我指的是简单类构造函数重载构造函数重载,同时继承已经重载的类(意味着基类具有重载的构造函数)。...

    有一些类似的主题,但我找不到一个有足够答案的主题。

    我想知道在Java中构造函数重载的最佳实践是什么。 我已经对这个问题有了自己的想法,但我想听听更多建议。

    我指的是简单类中的构造函数重载和构造函数重载,同时继承已经重载的类(意味着基类具有重载的构造函数)。

    谢谢 :)

    虽然没有"官方指南",但我遵循KISS和DRY的原则。使重载的构造函数尽可能简单,最简单的方法是只调用它(...)。这样你只需要检查一次并且只处理一次参数。

    public class Simple {

    public Simple() {

    this(null);

    }

    public Simple(Resource r) {

    this(r, null);

    }

    public Simple(Resource r1, Resource r2) {

    // Guard statements, initialize resources or throw exceptions if

    // the resources are wrong

    if (r1 == null) {

    r1 = new Resource();

    }

    if (r2 == null) {

    r2 = new Resource();

    }

    // do whatever with resources

    }

    }

    从单元测试的角度来看,测试类很容易,因为你可以将资源放入其中。如果该类有许多资源(或者像OO-geeks那样调用它的协作者),请考虑以下两种情况之一:

    创建一个参数类

    public class SimpleParams {

    Resource r1;

    Resource r2;

    // Imagine there are setters and getters here but I'm too lazy

    // to write it out. you can make it the parameter class

    //"immutable" if you don't have setters and only set the

    // resources through the SimpleParams constructor

    }

    Simple中的构造函数只需要拆分SimpleParams参数:

    public Simple(SimpleParams params) {

    this(params.getR1(), params.getR2());

    }

    ...或者使SimpleParams属性:

    public Simple(Resource r1, Resource r2) {

    this(new SimpleParams(r1, r2));

    }

    public Simple(SimpleParams params) {

    this.params = params;

    }

    做一个工厂课

    创建一个为您初始化资源的工厂类,如果初始化资源有点困难,这是有利的:

    public interface ResourceFactory {

    public Resource createR1();

    public Resource createR2();

    }

    然后以与参数类相同的方式完成构造函数:

    public Simple(ResourceFactory factory) {

    this(factory.createR1(), factory.createR2());

    }

    将两者结合起来

    是的...你可以混合搭配两种方式,具体取决于你当时更容易。考虑到Simple类它们以相同的方式使用,参数类和简单的工厂类几乎是一样的。

    +1非常好的帖子

    我已经在这个以及其他示例中注意到构造函数定义的编写顺序在构造函数调用中使用最少的参数。这是标准的Java风格吗?为什么?:在我看来,这样做是有意义的,就像你应该看到的第一个构造函数定义那样具有所有细节的那个。

    @JosieThompson据我所知,这在任何标准中都没有定义。我同意首先使用完整的构造函数可以快速查看所有方法参数;但是,通过参数计数对它们进行排序,可以让您按照页面上的重载调用进行操作,当您考虑我们如何读写代码时,这些调用会感觉更自然。

    有多个构造函数可以在每个构造函数上有1个不同类型的参数吗?喜欢 - new Object(int aa)/ new Objec(String bb)?

    我认为最佳实践是通过使用相关参数defaults调用this()来使重载构造函数引用的单个主构造函数。这样做的原因是它使得对象的构造状态变得更加清晰 - 实际上你可以将主构造函数看作唯一真正的构造函数,其他人只是委托给它

    其中一个例子可能是JTable - 主构造函数采用TableModel(加上列和选择模型),其他构造函数调用此主构造函数。

    对于超类已经重载构造函数的子类,我倾向于认为将任何父类的构造函数视为主类并且认为没有单个主构造函数是完全合法的。例如,当扩展Exception时,我经常提供3个构造函数,一个只接受String消息,一个接受Throwable原因而另一个接受两者。这些构造函数中的每一个都直接调用super。

    我认为"已经重载的类"意味着基类有几个重载的构造函数。

    是的,这就是我的意思。

    我已经从这个澄清中修改了我的答案

    我同意第一部分,但不是关于继承已经重载的类的第二部分:让我说我继承Exception到一个新类,我希望Exceptions字符串将以bla开头 - 这意味着我应该在构造函数接收中验证它字符串。如果我不像在基类中那样调用主构造函数,我必须复制此验证的代码。

    我认为这是不必要的限制。

    @Tom - 在某些情况下,我偏离了这种做法,但我总是仔细考虑这样做,因为我相信没有一个主要的构造函数是一个混乱的类设计的良好指标。

    如果您有一个非常复杂的类,其中包含许多选项,其中只有一些组合有效,请考虑使用Builder。在代码方面也很有效但在逻辑上也很好。

    Builder是一个嵌套类,其方法仅用于设置字段,然后ComplexClass构造函数仅将此类构建器作为参数。

    编辑:ComplexClass构造函数可以确保Builder中的状态有效。如果你只是在ComplexClass上使用setter,这很难做到。

    非常同意使用构建器模式,像OP这样的加载构造函数是非常糟糕的主意,因为它不符合最小惊喜的原则。

    它实际上取决于类的类型,因为并非所有类都是相同的。

    作为一般准则,我建议2个选项:

    对于值和不可变类(Exception,Integer,DTO等),请使用上面答案中建议的单个主构造函数

    对于其他所有内容(会话bean,服务,可变对象,JPA和JAXB实体等),只使用默认构造函数,并在所有属性上使用合理的默认值,以便无需其他配置即可使用

    好吧,这是重载构造函数的一个例子。

    public class Employee

    {

    private String name;

    private int age;

    public Employee()

    {

    System.out.println("We are inside Employee() constructor");

    }

    public Employee(String name)

    {

    System.out.println("We are inside Employee(String name) constructor");

    this.name = name;

    }

    public Employee(String name, int age)

    {

    System.out.println("We are inside Employee(String name, int age) constructor");

    this.name = name;

    this.age = age;

    }

    public Employee(int age)

    {

    System.out.println("We are inside Employee(int age) constructor");

    this.age = age;

    }

    public String getName()

    {

    return name;

    }

    public void setName(String name)

    {

    this.name = name;

    }

    public int getAge()

    {

    return age;

    }

    public void setAge(int age)

    {

    this.age = age;

    }

    }

    在上面的示例中,您可以看到重载的构造函数。构造函数的名称相同,但每个构造函数具有不同的参数。

    这里有一些资源可以更好地解释java中的构造函数重载,

    构造函数。

    构造函数说明。

    似乎写这个答案的努力非常少。 OP知道什么是构造函数重载。答案就是这样解释的。

    展开全文
  • Java 构造函数Java中构造函数重载除了重载方法外,我们还可以在java中重载构造函数。基于新执行时指定的参数调用重载的构造函数。我们什么时候需要构造函数重载?有时候需要用不同的方式初始化一个对象。这可以...

    Java 构造函数

    Java中的构造函数重载

    除了重载方法外,我们还可以在java中重载构造函数。基于新执行时指定的参数调用重载的构造函数。

    我们什么时候需要构造函数重载?

    有时候需要用不同的方式初始化一个对象。这可以使用构造函数重载来完成。例如,Thread类有8种类型的构造函数。如果我们不想指定某个线程的任何内容,那么我们可以简单地使用Thread类的默认构造函数,但是如果我们需要指定线程名称,那么我们可以使用String参数来调用Thread类的参数化构造函数,如下所示:

    Thread t= new Thread (" MyThread ");

    让我们举一个例子来理解构造函数重载的需要。考虑以下只有一个构造函数带三个参数的类Box的实现。

    // An example class to understand need of

    // constructor overloading.

    class Box

    {

    double width, height,depth;

    // constructor used when all dimensions

    // specified

    Box(double w, double h, double d)

    {

    width = w;

    height = h;

    depth = d;

    }

    // compute and return volume

    double volume()

    {

    return width * height * depth;

    }

    }

    我们可以看到Box()构造函数需要三个参数。这意味着Box对象的所有声明必须将三个参数传递给Box()构造函数。例如,以下语句目前无效:

    Box ob = new Box();

    由于Box()需要三个参数,因此在没有它们的情况下调用它是错误的。假设我们只需要一个没有初始维度的盒子对象,或者想要通过只指定一个将用于所有三个维度的值来初始化一个多维数据集。从Box类的上述实现中,我们无法使用这些选项。

    这些类型的初始化对象的不同方式的问题可以通过构造函数重载来解决。下面是带构造函数重载的类Box的改进版本。

    // Java program to illustrate

    // Constructor Overloading

    class Box

    {

    double width, height, depth;

    // constructor used when all dimensions

    // specified

    Box(double w, double h, double d)

    {

    width = w;

    height = h;

    depth = d;

    }

    // constructor used when no dimensions

    // specified

    Box()

    {

    width = height = depth = 0;

    }

    // constructor used when cube is created

    Box(double len)

    {

    width = height = depth = len;

    }

    // compute and return volume

    double volume()

    {

    return width * height * depth;

    }

    }

    // Driver code

    public class Test

    {

    public static void main(String args[])

    {

    // create boxes using the various

    // constructors

    Box mybox1 = new Box(10, 20, 15);

    Box mybox2 = new Box();

    Box mycube = new Box(7);

    double vol;

    // get volume of first box

    vol = mybox1.volume();

    System.out.println(" Volume of mybox1 is " + vol);

    // get volume of second box

    vol = mybox2.volume();

    System.out.println(" Volume of mybox2 is " + vol);

    // get volume of cube

    vol = mycube.volume();

    System.out.println(" Volume of mycube is " + vol);

    }

    }

    输出:

    Volume of mybox1 is 3000.0

    Volume of mybox2 is -1.0

    Volume of mycube is 343.0

    在构造函数重载中使用this()

    可以在构造函数重载期间使用this()引用来从参数化构造函数中隐式调用默认构造函数。请注意,this()应该是构造函数中的第一条语句。

    // Java program to illustrate role of this() in

    // Constructor Overloading

    class Box

    {

    double width, height, depth;

    int boxNo;

    // constructor used when all dimensions and

    // boxNo specified

    Box(double w, double h, double d, int num)

    {

    width = w;

    height = h;

    depth = d;

    boxNo = num;

    }

    // constructor used when no dimensions specified

    Box()

    {

    // an empty box

    width = height = depth = 0;

    }

    // constructor used when only boxNo specified

    Box(int num)

    {

    // this() is used for calling the default

    // constructor from parameterized constructor

    this();

    boxNo = num;

    }

    public static void main(String[] args)

    {

    // create box using only boxNo

    Box box1 = new Box(1);

    // getting initial width of box1

    System.out.println(box1.width);

    }

    }

    输出:

    0.0

    正如我们在上面的程序中看到的那样,我们在对象创建期间仅使用框编号调用Box(int num)构造函数。通过在其中使用this()语句,默认的构造函数(Box())将从其中隐式调用,它将使用-1初始化Box的尺寸。

    注意:构造函数调用应该是构造函数体中的第一条语句。例如,以下片段无效并引发编译时错误。

    Box(int num)

    {

    boxNo = num;

    / *构造函数调用必须是第一个

    语句在构造函数中* /

    this(); /*错误*/

    }

    在构造函数重载时要注意的重点:

    调用构造函数必须是Java中构造函数的第一条语句。

    如果我们已经定义了任何参数化构造函数,那么编译器不会创建默认构造函数。反之亦然,如果我们没有定义任何构造函数,编译器在编译过程中会默认创建默认构造函数(也称为no-arg构造函数)

    在java中,递归构造函数调用无效。

    构造函数重载与方法重载

    严格来说,构造函数重载与方法重载有点类似。如果我们想要使用不同数量的参数来初始化一个对象,那么当我们需要基于不同参数的方法的不同定义时,我们必须执行构造函数重载,因为我们会重载方法。

    展开全文
  • 构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有);⑵没有返回值;⑶如果没有输入构造函数,jvm会自动帮我们创建...函数重载:指多个函数可以使用同一个函数名,只要它们参数列表不同,将意义相近...

    构造函数:⑴方法名和类名相同,而且没有返回类型(包括 void 也没有);

    ⑵没有返回值;

    ⑶如果没有输入构造函数,jvm会自动帮我们创建一个不带参数,没有任何函数体的的构造函数;

    如果我们手动的创建了其他构造函数,就不会帮我们创建这个不带参数的构造函数了;

    ⑷一般情况下,如果想要实现自己的构造方法,最好重载一个不带参数的构造方法。

    函数重载:指多个函数可以使用同一个函数名,只要它们参数列表不同,将意义相近的函数,命名为相同的名称。

    重载总结:⑴函数重载是指多个函数使用同一个名称;

    ⑵重载的条件是参数的数量和类型不同;

    ⑶重载作用:降低调用的难度;

    ⑷当调用重载的函数时,计算机层根据实参自己匹配。

    例题:

    public Noddle(){

    this.bowlType = "大碗";

    }

    public Noddle(String b){

    bowlType = b;

    }

    public Noddle(String bowlType, String type, boolean moreMeat){

    this.bowlType = bowlType;

    this.type = type;

    this.moreMeat = moreMeat;

    }

    展开全文
  • 小伙伴们知道构造函数吧,那你们知道构造函数是否能重载吗?这次让我们来详细了解一下构造函数重载吧。------------------构造---------------------什么是构造方法:1、是个方法2、在创建对象时,由new这个关键字...

    小伙伴们知道构造函数吧,那你们知道构造函数是否能重载吗?这次让我们来详细了解一下构造函数和重载吧。

    ------------------构造---------------------

    什么是构造方法:

    1、是个方法

    2、在创建对象时,由new这个关键字自动调用,将属性初始化

    3、类中没写构造,java提供一个默认的无参构造,如果你写了,就以你写为准,默认的无参构造会消失。改写的构造方法如果有参数,那么在new

    时也要提供参数

    构造方法的语法:

    public 类名(){

    }

    1、跟类同名

    2、没有返回类型

    构造与一般函数的区别:

    1、写法上不同

    构造函数没有返回值,方法名必须与类名相同

    2、运行上也不同

    构造函数是在对象一建立时(new)就运行,给对象初始化

    一般方法是对象调用时才执行,是给对象添加具体的功能

    3、执行次数不同

    一个对象建立,构造函数只会执行一次;而一般方法可以调用多次

    构造和set的区别

    1、构造不能手动调用,只能在new对象的时候由系统自动调用一次;set方法能手动调用多次

    2、构造能一次为多个属性赋值,但set方法只能一次为一个属性复制

    3、构造只能用一次,一旦为属性赋值之后再需要修改属性的时候,只能找set帮忙了

    4、一般情况下,既需要一下为多个属性赋值,有需要灵活的修改属性,就把构造和set都写上

    -------------------------重载overload------------------------

    1、什么是方法重载

    同一个人的同一个行为,如果给的东西(参数)不同,就会产生不同的结果,如:

    乞丐张三

    讨钱() {你是个铁公鸡,一毛不拔}

    讨钱(10){你是个好人}

    讨钱(10,"苹果"){你是在世的救星}

    2、重载的好处

    不用起名字

    调用更方便(不用考虑记名字,只要传参数就可以)

    3、方法重载的三大原则

    a.方法同名

    b.参数不一样

    参数的个数不一样

    参数的类型不一样

    参数的顺序不一样(顺序不用的参数要求类型不一样。虽然理论上可以,但一般不用)

    c.同一个类

    注意:返回类型和重载无关

    4、什么时候用重载

    重载一般用在构造上面,普通方法也可以用

    5、示例public class TestMethod

    {

    int a;

    float f;

    public TestMethod()

    { //构造方法初始化

    a = 10;

    f = 1.0 f;

    }

    public TestMethod(int a, float f)

    { //构造方法带参的重载

    this.a = a;

    this.f = f;

    }

    public void method(int b, float x)

    { //普通方法

    //do something……

    }

    public void method(int m, int n, float y)

    { //普通方法的重载

    //do something……

    }

    public static void main(String args[])

    {

    //主方法测试

    }

    }

    以上就是关于构造函数和重载的所有内容,更多相关常见问题可以关注本网站了解详情。

    推荐阅读:

    展开全文
  • 使重载构造函数尽可能简单,最简单的方法是只调用它(...)。这样你只需要检查一次并且只处理一次参数。public class Simple {public Simple() {this(null);}public Simple(Resource r) {this(r, null);}public ...
  • 题目为构造函数重载,可以想到之前一般函数的重载,概念之间总是相互联系的。某一个事物是什么,有什么特点介绍完了之后,下面就是怎么用(初始化),什么时候用?二.什么时候定义构造函数呢?在描述事物时,该事物一...
  • 如果去掉2或3构造函数中的一个,则能够正确执行。执行结果是2和3构造函数去掉后剩下的那个打印出来的。 分析总结: 要分析上述代码,需要先了解java重载的解析过程。Java重载解析过程是以两阶段运行的。 第一阶段...
  • public class Student{ public int stuId; public String stuName; public int stuAge; public int stuScore;...但如果此类有任何构造函数则系统不会创建任何得构造函数 系统创建的构造函数为 : public 类名(){ }
  • java中构造函数是什么

    2021-02-12 11:09:09
    (推荐学习:java课程)一个类如果没有定义过构造函数,那么该类会有一个默认的空参数构造函数。如果在类定义了指定的构造函数,那么该类的默认构造函数就没有了。在描述事物时,该事物已...
  • ※初始化和清除As the computer revolution progress,"unsafe" programming has become oneof the the major culprits that ...×C++为我们引入了构造函数的概念,java也沿用了这一概念,但新增了自己的垃圾收...
  • 同时,构造装有许多的方法,那么构造器也是可以实现重载的功能。下面我们就构造方法格式、注意事项进行简单介绍,然后带来构造起的重载实例。1.构造方法格式public class 类名(){类名(string name);类名 对象=...
  • 今天就来为大家介绍java中构造函数的特点是什么,并且通过图片为大家解析。一起来看看吧。一、首先介绍一下构造函数的概念它是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new...
  • 为什么我将null参数传递给构造函数我是否会得到NullPointerException?这是我的榜样new AttendeeDetail("Gus Goose","1151","15-01-2012",(Integer) null,null)这是班级:public class AttendeeDetail {private ...
  • 构造函数重载对于模拟默认值非常有用,或者从已存在的实例构建对象(复制)这是一个例子:public class Color {public int R, G, B, A;// base ctrpublic Color(int R, int G, int B, int A) {this.R = R;this.G = G;...
  • /***OverloadingConstructors*构造函数重载**创建 Employee 类,属性:姓名,年龄,性别,工资。*方法:显示对象的属性值,工作。*要求属性要封装。*创建 3 个对象。*构造函数重载。***方法以及方法重载* 1、方法...
  • 构造函数在类初始化和实例化的过程发挥什么作用?(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)构造函数与默认构造函数构造函数构造函数,主要是用来在创建对象时初始化对象,一般会跟new运算符一起...
  • 本篇博文主要是为新手、对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法。...
  • 谈谈java中构造函数

    2021-02-27 15:03:39
    本篇博文主要是为新手、对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法。...
  • Java中构造函数能被继承吗发布时间:2020-07-22 11:57:08来源:亿速云阅读:97作者:Leah今天就跟大家聊聊有关Java中构造函数能被继承吗,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,...
  • java构造函数是一个非常重要的作用,首先java里的构造函数是可以重载的,而且因为也是可以继承在父类的构造函数,所以在子类里,首先必然是调用父类的构造函数。可以看下面的两个例子来对比:public class Test{...
  • 抽象类的构造函数若果在父类(也就是抽象类)显示的写了有参数的构造函数,在子类是就必须写一个构造函数来调用父类的构造函数abstract class Person { //定义一个抽象类,必须被继承Person(int i) {}}public ...
  • a.在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制0。b.调用基类构造函数。c....d.最后调用子类的构造函数。...继承体系的所有静态成员初始化(先父类,后...构造函数的调用)d.子类初始化(普通成员-->构...
  • 使重载构造函数尽可能简单,最简单的方法是只调用this(…)。这样,你只需要检查和处理一次参数即可。public class Simple {public Simple() {this(null);}public Simple(Resource r) {this(r, null);}public ...
  • 第二行:很明显,在基类的构造函数中调用的draw()方法被子类的draw()方法覆盖了。但是radius为什么是0呢?为什么!原因据说是这样的~ 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制0 也就是说,我...
  • Java中构造方法重载

    千次阅读 2021-03-14 13:35:39
    Java支持构造函数重载。在构造函数加载,我们创建多个具有相同名称但具有不同参数类型或具有不同参数编号的构造函数。示例publicclassTester{privateStringmessage;publicTester(){message="HelloWorld!";}...
  • Java构造函数重载

    2021-04-28 04:26:03
    这句话是正确的,唯一区分方法重载的是方法的参数列表不同,当参数列表不同时就可改变其返回类型package alltest;public class OverLoadTest {public void m1(int x){}public int m1(int x,int y){return 12;}// ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,168
精华内容 46,067
关键字:

java中构造函数重载

java 订阅