聊聊java中的构造器

java中的构造器

java核心技术卷I
java核心技术卷II

构造器是什么

1.构造器,也称构造方法、构造函数。作用是构造出来一个类的实例,确保对象得到初始化。
2.构造器的格式: 权限修饰符 类名(无参/有参){}
3.根据有无参数,可分为无参构造 和有参构造。

构造器的特性

1.与一般方法名不同的是,构造方法名必须和类名保持一致,并且没有返回值。
2.Java编译器会自动创建无参构造函数,因此在类中,无参构造即使没有,我们也可省略不写。实例化对象时无需赋值。
3.倘若类中已存在有参构造函数,则编译器不再提供默认无参构造。实例化对象时需赋值,不然报错。
4.当类实例化一个对象时会自动调用构造方法。

示例代码一:无参构造

学生类
Copypublic class Student { 
   //权限修饰符是public,表示内部属性能被其他类访问到。若使用private,则需要set/get才能访问
   public String name;
   public int age;
   
   //无参构造,编译器自带,可不写。
   public Student(){
       System.out.println("括号内无参数,这就是无参构造");
   }
}
测试类
Copypublic class Test  {
    public static void main(String[] args)  {
        Student st = new Student();//创建对象,括号内无需赋值
        //没赋值的情况下,字符类型默认值为null,数值类型默认值为0
        System.out.println(st.name+" "+st.age);//null,0

        //对属性进行赋值
        st.name="Tom";
        st.age=5;
        System.out.println(st.name+"今年"+st.age+"岁了");
    }
}
结果
Copy括号内无参数,这就是无参构造
null 0
Tom今年5岁了

示例代码二:有参构造

学生类
Copypublic class Student {
   //权限修饰符是public,表示内部属性能被其他类访问到。若使用private,则需要set/get才能访问
   public String name;
   public int age;
   //无参构造最好也写上
   public Student(){     
   } 
   public Student(String name,int age){
       System.out.println("括号内有参数,就是有参构造");
       //将形参变量的值,赋给成员变量。
       this.name = name;
       this.age = age;
     //this.name = "于歌"  若直接在构造方法内部赋值,则优先执行其内部的值,即吴邪会替掉Tom猫  
   }
}
测试类
Copypublic class Test  {
    public static void main(String[] args)  {
        //创建对象。赋值后,定义的值会传递给构造器中的形参变量。
        Student st = new Student("Tom",5);//创建对象,须在括号内赋值,不然报错
        //使用对象调用成员变量(java对象只能调用成员变量)
        System.out.println(st.name+"今年 "+st.age+"岁了");
    }
}
结果
Copy括号内有参数,就是有参构造
Tom今年5岁了

补充一下:

如果你创造了一个带有参数的构造方法,那么无参的构造方法必须显式的写出来,否则会编译失败。这句话该如何理解?

这句话其实有点不妥,应该这么理解:每个类至少要有一个构造函数。如果写了一个有参构造,而没有写无参构造,也是可以的。不过,当你尝试通过一个无参构造来new对象时,编译器会报错。因为找不到这个无参的构造函数。也就是说,当一个类你没有写构造函数时,编译器会自动帮你创建一个无参构造。反之,若是写了有参构造,却想通过无参构造new对象,那么就需要将此无参构造写出来。

java中,子类为什么会自动继承父类的无参构造方法?

其实这句话本身就是错误的。因为构造函数不能继承,只能被调用。 正确的说法应该是,Java中子类会自动调用父类的无参构造方法。那么,子类为什么会自动调用父类的无参构造方法呢?因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。子类在继承父类时,如果没有相同的带参构造方法,那么他就需要在其构造方法中,明确的通过super()调用父类的带参构造方法,否则构造不出父类,从而也构造不出他自己了。如果我们在父类中写个不带参数的构造方法,就可以不用实现父类的带参构造方法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于歌852

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值