精华内容
下载资源
问答
  • 创建无参构造方法
    2020-04-23 11:32:39

    package com.xjc;
    /创建一个防御塔类(TowerDefense),该类有两个int类型属性x,y分别表示防御塔的横纵坐标。
    在该类中定义一个无参的构造方法和一个有两个参数的构造方法,该方法有两个int类型的参数。
    第一个参数表示横坐标,第二个参数表示纵坐标,代表防御塔所在的坐标位置,
    在默认的构造方法中输出“防御塔已经被实例化了”,而在有参的构造方法中输出当前防御塔的横纵坐标值。
    /

    public class TowerDefense {
    int x;
    int y;

    // 无参构造方法
    public TowerDefense() {
    	System.out.println("防御塔已经被初始化!");
    }
    
    // 有参构造方法
    public TowerDefense(int x, int y) {
    	System.out.println("防御塔的坐标为:(" + x + "," + y + ")");
    }
    
    // 测试一下
    public static void main(String[] args) {
    	TowerDefense T1 = new TowerDefense();
    	TowerDefense T2 = new TowerDefense(123, 456);
    }
    

    }

    更多相关内容
  • 文章目录1. 前言2. 先说结论3. 演示4. 解决方法1. 在实体类上再加上@...当偶然机会发现,如果使用了@Builder,该实体类会失去无参构造方法。 具体现象如下: 当不加任何注解的时候,完成正常: 当加了@

    1. 前言

    1. 在创建实体类的时候,有时候参数过于多,如果使用有参数的构造函数,实在看起来不是很优雅,一般都会想使用@Builder构建者模式来进行创建对象,不仅仅优雅,而且还方便。
    2. 当偶然机会发现,如果使用了@Builder,该实体类会失去无参构造方法
    3. 具体现象如下:
      当不加任何注解的时候,完成正常:
      在这里插入图片描述
      当加了@Builder的时候,则会直接出现下面的错误,提示没有无参的构造函数:
      在这里插入图片描述

    2. 先说结论

    1. 由于没有时间深入查看@Builder的源码,但是可以从编译之后的字节码得出结论:
      1. 实体类使用了@Builder,会有全参构造函数,没有默认无参构造函数,即无法使用默认无参构造函数。
      2. 解决方法:
        1. 在实体类上同时加上:@Builder、@AllArgsConstructor、@NoArgsConstructor

        2. 手写全部有参构造方法,以及 无参构造方法

        3. 手写个默认无参构造方法,并加上@Tolerate

          @Builder
          public class demoBuilderEntry {
              private String name;
              private String sex;
          
              @Tolerate
              public demoBuilderEntry() {
              }
          }
          

    3. 演示

    1. 若不知道怎么查看java反编译字节码内容,可以看一下:
      Java 如何进行反编译生成.java文件(javap、jad下载安装使用)

    2. 当实体类不加任何东西:

      public class demoBuilderEntry {
          private String name;
          private String sex;
      }
      

      可以看见是默认有无参构造函数

      public class demoBuilderEntry {
      
          public demoBuilderEntry() {
          }
      
          private String name;
          private String sex;
      }
      
    3. 当实体类加上@Builder注解:

      @Builder
      public class demoBuilderEntry {
          private String name;
          private String sex;
      }
      

      可以看出:无参构造函数已不存在,只剩全参构造函数

      public class demoBuilderEntry {
          public static class demoBuilderEntryBuilder {
      
              public demoBuilderEntryBuilder name(String name) {
                  this.name = name;
                  return this;
              }
      
              public demoBuilderEntryBuilder sex(String sex) {
                  this.sex = sex;
                  return this;
              }
      
              public demoBuilderEntry build() {
                  return new demoBuilderEntry(name, sex);
              }
      
              public String toString() {
                  return (new StringBuilder()).append("demoBuilderEntry.demoBuilderEntryBuilder(name=").append(name).append(", sex=").append(sex).append(")").toString();
              }
      
              private String name;
              private String sex;
      
              demoBuilderEntryBuilder() {
              }
          }
      
          demoBuilderEntry(String name, String sex) {
              this.name = name;
              this.sex = sex;
          }
      
          public static demoBuilderEntryBuilder builder() {
              return new demoBuilderEntryBuilder();
          }
      
          private String name;
          private String sex;
      }
      
      

      因此,如下图,一定会报错:
      在这里插入图片描述

      有人会说:没有无参怎么了,也没有什么事情,反正需要构造。
      但像spring这种,我们可以从配置文件中注入属性,如@ConfigurationProperties,它们的做法是先创建该类对象,使用无参构造函数,然后再调用set方法,此时,你没有默认无参构造方法,必然会失败,毕竟连对象都没有创建成功。
      具体失败案例可以看:实体类使用@Builder,导致@ConfigurationProperties注入属性失败

    4. 如果需要无参构造函数,那就手动添加,在实体类上,再加上@NoArgsConstructor也无效。
      根据下图可以看见,似乎没有报错
      在这里插入图片描述

      当运行的时候,则报错如下:与实际参数列表不符,显然是无法通过加@NoArgsConstructor创建默认无参构造函数
      在这里插入图片描述

    4. 解决方法

    1. 在实体类上再加上@AllArgsConstructor即可

    1. 根据下图查看,似乎也没有问题:
      在这里插入图片描述

    2. 点击运行,查看结果的时候,居然可以运行成功如下:
      在这里插入图片描述

    3. 反手我们去看一下反编译:

      
      public class demoBuilderEntry {
          public static class demoBuilderEntryBuilder {
              // builder 的代码省略,没有粘出来
          }
          
          public static void main(String args[]) {
              System.out.println(new demoBuilderEntry());
          }
      
          public static demoBuilderEntryBuilder builder() {
              return new demoBuilderEntryBuilder();
          }
      
          public demoBuilderEntry(String name, String sex) {
              this.name = name;
              this.sex = sex;
          }
      	// 无参构造函数有了
          public demoBuilderEntry() {
          }
      
          private String name;
          private String sex;
      }
      
      

    2. 手写个无参构造函数并加上@Tolerate

    1. @Tolerate:中文:容许,通俗来说,被该注解加上的方法,让lombok容许它们存在。

      /**
       * Put on any method or constructor to make lombok pretend it doesn't exist,
       * i.e., to generate a method which would otherwise be skipped due to possible conflicts.
       */
      @Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
      @Retention(RetentionPolicy.SOURCE)
      public @interface Tolerate {
      }
      
    2. 测试:
      在这里插入图片描述

    3. 手写有参无参构造方法

    1. 这种方法是最简单粗暴的,但是代码可能会没有那么简洁:
      在这里插入图片描述
    展开全文
  • Java有参构造方法无参构造方法

    万次阅读 多人点赞 2021-02-12 17:05:28
    (如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效)编写时添加了有参构造方法而未添加无参构造方法,那么编译器只认有参构造方法而不会默认添加无参构造方法!如果需要使用无参构造方法,一定要在...

    1、定义:

    编写一个类时没有添加无参构造方法,那么编译器会自动添加无参构造方法;(如果自己添加构造函数,无论有参数或是没参数,默认构造函数都将无效)

    编写时添加了有参构造方法而未添加无参构造方法,那么编译器只认有参构造方法而不会默认添加无参构造方法!

    如果需要使用无参构造方法,一定要在类里面添加

    2、举例:

    定义四个类(说明四种情况):

    类Person1 自己不手动添加任何无参或有参数构造方法 (实例化对象时:编译通过)

    类Person2 自己添加无参的构造方法 (实例化对象时:编译通过)

    类Person3 有参数的构造方法 (实例化对象时:不通过)

    类Person4 自己添加无参的构造方法,和有参数的构造方法 (实例化对象时:编译通过)

    //定义类Person1 自己不手动添加任何无参或有参数构造方法

    class Person1{

    private int age;

    private String name;

    private String sex;

    }

    //定义类Person2 自己添加无参的构造方法

    class Person2{

    private int age;

    private String name;

    private String sex;

    public Person2(){

    System.out.println("无参构造方法被调用");

    }

    }

    //定义类Person3 有参数的构造方法

    class Person3{

    private int age;

    private String name;

    private String sex;

    public Person3(String name, String sex, int age ){

    this.name = name;

    this.sex = sex;

    this.age = age;

    }

    }

    //定义类Person4 自己添加无参的构造方法,和有参数的构造方法

    class Person4{

    private int age;

    private String name;

    private String sex;

    //不带参数的构造函数,可以被重载

    public Person4(){

    System.out.println("无参构造方法被调用");

    }

    //带参数对的构造函数

    public Person4(String name, String sex, int age ){

    this.name = name;

    this.sex = sex;

    this.age = age;

    }

    }

    public class ObjectInit_2 {

    public static void main(String[] args) {

    Person1 person1 = new Person1();//编译通过;①实例化Person对象 ②自动调用构造方法Person( )

    Person2 person2 = new Person2();//编译通过;打印: 无参构造方法被调用

    // 这样写,编译器会报错,原因是系统默认的无参构造方法被有参构造方法覆盖,编译器不能再提供无参构造方法

    Person3 person3 = new Person3();

    //Person4 person4 = new Person4();//编译通过;打印: 无参构造方法被调用

    Person4 person4 = new Person4("qzz", "man", 18);//编译通过;

    }

    }

    3.使用构造器时需要记住:

    1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名)

    2.每个类可以有一个以上的构造器

    3.构造器可以有0个、1个或1个以上的参数

    4.构造器没有返回值

    5.构造器总是伴随着new操作一起调用

    父类有有参构造方法有两种情况,一只有有参构造,那么子类的构造方法中的第一句必须调用父类的有参构造方法,也就是“super(....);”,....为你传入的参数如:

    class Father {

    public Father(String lastname) {

    }

    }

    class Son extends Father {

    public Son() {

    super("aaaa");// 这句必须有

    // 可以写其他代码

    }

    }

    二有有参也有无参构造方法,这时子类不显示调用super,这会默认自动调用父类无参的构造方法,

    class Father {

    public Father() {

    }

    public Father(String lastname) {

    }

    }

    class Son extends Father {

    public Son() {

    super();// 这句可以有也可以没有,没有写的话会自动调用

    // 可以写其他代码

    }

    }

    展开全文
  • 图1为父类的无参构造方法和有参构造方法,若是将无参构造方法删除,则子类的有参构造方法会报错。 如图2 ![图片说明](https://img-ask.csdn.net/upload/201907/30/1564493578_27738.jpg) 百度后听说父类...
  • @Data @Builder @NoArgsConstructor public class ResourceDetailsResVO { ...如果同时使用了@Data、@Builder,则无法添加此类的无参构造方法。无论是使用@NoArgsConstructor还是直接手动添加参构造器...

     

    @Data
    @Builder
    @NoArgsConstructor
    public class ResourceDetailsResVO {
        private Integer stat;
        private String msg;
    }

    如果同时使用了@Data、@Builder,则无法添加此类的无参构造方法。无论是使用@NoArgsConstructor还是直接手动添加无参构造器,在编译时都会报错。(图片是盗来的*……*)

        解决方案:
        同时使用:@NoArgsConstructor、@AllArgsConstructor,如下

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class ResourceDetailsResVO {
        private Integer stat;
        private String msg;
    }

    具体原因还未深究。

    展开全文
  • Java有参构造方法无参构造方法详解

    万次阅读 多人点赞 2020-12-09 12:05:16
    但是在很多时候觉得这样做很麻烦,最好的做法是在创建对象的时候完成属性的初始化操作,此时需要使用到有参数构造方法方能完成该功能(有人把构造方法叫做构造器)。 DEMO:定义有参数构造方法 上面定义了四...
  • 构造方法当中,主要有无参构造方法以及有参构造方法两种,下面的话就一起来看看详细代码示例吧。publicclassMyClass{...}}这个实例定义了两种构造方法,分别是无参构造方法和有参构造方法。在一个类当中,定义多...
  • IDEA 工具中 如何生成有无参构造方法 按下Alt+ins键
  • 构造方法--无参构造方法

    千次阅读 2021-07-29 18:35:04
    没有指定构造方法: package java_animal; /** * 宠物猫类 * @author Y */ public class Cat { //成员属性:昵称、年龄、体重、品种 String name; //String类型变量默认值是null int month; //int类型变量...
  • 当然你要无参调用的的也可以。你用无参,调用有的。那你有的参数你需要怎么传呢。当然如果换一个角度也可以。我手写下。没经过IDE的。提供下思路。我有两种思路,写同一个功能。public class Person{privat...
  • 为什么要有无参构造方法参构造的运行原理

    万次阅读 多人点赞 2019-09-02 23:00:16
    参构造器也叫无参构造方法,在我们创建类时候,可以不用写构造方法,因为系统会默认给我们提供一个无参构造方法,如果我们自己写了无参构造方法,那么我们这个就将默认的覆盖了。 (这时候你可能回想,既然会默认...
  • 我当是在想应该不行的吧,然后看到那个问问题的同学说:“可以再定义局部类的空参构造方法”,然后自己看了一下关于局部类的知识确实阔以,话不多说,上代码。 package e01; public class jvav { public static ...
  • Java的无参构造函数用法实例分析

    千次阅读 2021-02-12 17:05:27
    本文实例讲述了Java的无参构造函数用法。分享给大家供大家参考,具体如下:一 点睛1 如果一个类没有定义任何构造函数,那么该类会自动生成1个默认的构造函数。默认构造函数没有参数。2 如果一个类定义了构造函数,但...
  • 1.手动创建需要实现构造函数的参数,这个要自己码出来: 2.实现无参构造函数第一步: 3.实现无参构造函数第二步: 4.实现无参构造效果:
  • 参构造方法:alt+ins选择Constructor 无参构造方法:alt+ins选择Constructor然后选择下方的SelectNone
  • 1.通过类的无参构造创建对象 当用最普通方式配置一个<bean>时,默认就是采用类的无参构造创建对象。在Spring容器初始化时,通过<bean>上配置的class属性反射得到字节码对象,通过newInstance()创建对象...
  • C#无参构造方法

    千次阅读 2019-05-31 13:17:23
    *如果没有显示定义构造方法,则会有一个默认的无参构造方法 *如果显示定义了构造方法,则没有默认构造方法 *只能用new 方法名()的形式调用构造方法 *构造方法通常声明为public *构造方法没有返回值类型 *...
  • (一)Eclipse中的快捷键:ctrl+shift+f自动整理选择的java代码alt+/ 生成无参构造器或者提升信息alt+shift+s+o 生成带参构造ctrl+shift+o快速导入包alt+shift+s+r tab+enter-->shift+tab+enter 快速生成get set...
  • // 创建构造方法,在new时就给属性传值 public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return thi
  • class TestA {  public TestA(String s)  {  System.out.println("A");  System.out.println(s);  } ...所以我们在一个类中定义了自己的带参数的构造方法的时候,必须把无参构造函数定义一下。
  • 无参构造方法的作用

    千次阅读 多人点赞 2020-04-15 16:37:54
    无参构造方法的作用 1.无参构造方法一般是用来初始化:如为变量赋处置,初始化对象等。 2.无参构造方法可以去除,JAVA会给每个类一个默认的无参构造方法;当一个类中若存在有参构造方法,若想再使用参的构造方法,...
  • java构造方法:有参构造方法无参构造方法 一、无参构造方法 1、定义: 如果编写一个javaBean时没有添加无参构造方法,那么编译器会自动添加无参构造方法; 但是如果编写时添加了有参构造方法而未添加无参...
  • 创建对象的时候需要对属性值初始化,构造方法,即对象创建时要执行的方法。 要求在实例化的同时,就指定好name,和age的值。这就要用到构造方法。又叫做构造器Constructor. 二、构造方法的定义格式 构造方法在...
  • Java无参构造方法的作用

    千次阅读 2021-06-11 02:26:04
    无参构造函数,主要用于在子类创建对象时使用,java程序在执行子类的构造方法之前,会去调用父类构造方法,可以显示的指定super()某一个父类构造函数,如未显示指定 super(), public class Chinese extends Person ...
  • 如果父类拥有无参构造方法(无论隐式的还是显式的)且子类中的构造方法又没有明确指定调用父类的哪个构造方法,则子类中不必调用该子类其它构造方法的构造方法使用super()隐式调用父类的无参构造方法,...
  • 无参构造方法

    千次阅读 2017-09-22 09:08:06
    /*默认的无参构造方法  * 1,构造方法名称和类名一样  * 2,构造方法没有返回值,不能加上void  * 作用:完成成员变量的初始化*  *   * 带参数的构造方法,完成成员变量的赋值*/ public class Student ...
  • 创建对象的时候需要对属性值初始化,构造方法,即对象创建时要执行的方法。 要求在实例化的同时,就指定好name,和age的值。这就要用到构造方法。又叫做构造器Constructor. 二、构造方法的定义格式 构造方法在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 222,656
精华内容 89,062
关键字:

创建无参构造方法