Java面向对象之构造器

[toc]

Java面向对象之构造器

利用构造器确保初始化

初始化问题是关系编程方式是否安全的一个重要的问题。

功能:在创建对象时执行初始化。

在Java中,每个类至少有一个构造器。格式如下:

1[修饰符] 构造器名(参数列表){ 2 ...执行体 3 }

这时,突然迷惑,之前写过的代码里都没有构造器的说法呀,是怎么回事呢?

先看下面的语句:

Student s0 = new Student();

这是我们之前经常写的,我们管他叫做创建对象,并让引用变量指向这个对象的过程(类的实例化)。 在执行new Student();语句时,系统就会为对象分配内存空间,并调用相应的构造器,执行响应的执行体,确保对象在被我们操作之前,就已经正确初始化。

可是构造器在我们之前的代码中,还是没有出现构造器的影子啊。这是因为,我们在设计类时,<u>如果没有定义任何的构造器的话, 系统默认为类提供默认构造器(即无参构造器),执行体为空。</u>

注意

  • 对象在构造器执行体之前就已经被建立,只不过这个对象只能在内部被this(关于this的用法之后会有专门的篇幅总结)引用。
  • 只有在构造器执行体结束之后才作为返回值被返回。
  • new表达式确实返回了新建对象的引用,但构造器本身是没有返回值的。

关于构造器的访问修饰符

  • 如果允许系统中任何位置的类来创建该类的对象,修饰符需要public。
  • 如果想让子类调用,设置为protected。
  • 如果不想让别人创建该类的实例,设置为private。

其他

  • 构造器名必须与类名相同,这一点表明普通方法的命名规范并不适用于构造器。

  • 构造器是一种特殊的方法,但没有返回值。

  • 系统默认为类提供默认构造器(即无参构造器),执行体为空。

  • 可以自定义构造器,改变默认初始化。

  • 一旦自定义构造器之后,系统默认的无参构造器就不再存在。

构造器重载

假如,我们想要用多种方式创建对象,那么我们需要设计多种构造器,但是构造器名必须和类名相同,那么就自然而然地引出构造器的重载。

构造器重载:同一个类中具有多个构造器,构造器形参列表不同,即为构造器重载。

构造器重载代码演示:

1package com.my.pac09; 2 3/** 4* @author Summerday 5* @date 2019/12/6 18:23 6*/ 7public class Student { 8 //暂且先把属性设为public 9 public String name; 10 public int grade; 11 12 //重新定义默认构造器,假如输出语句 13 public Student() { 14 System.out.println("创建了一个学生"); 15 } 16 //this的用法之一 17 public Student(String name) { 18 this.name = name; 19 System.out.println("创建了一个名为" + this.name + "的学生"); 20 21 } 22 23 public Student(String name, int grade) { 24 //调用另一个构造器 25 this(name); 26 this.grade = grade; 27 System.out.println("创建了一个名为" + this.name + "的学生," + this.grade + "年级"); 28 } 29} 30

重载构造器调用:系统通过new调用构造器时,根据传入的实参列表决定到底用哪个构造器。

1package com.my.pac09; 2 3/** 4 * @author Summerday 5 * @date 2019/12/6 18:29 6 */ 7public class StudentTest { 8 public static void main(String[] args) { 9 //用new创建对象,调用新定义的无参构造器 10 Student s0 = new Student(); 11 //两个属性值默认初始化 12 System.out.println(s0.name+","+s0.grade);//null 13 14 //调用重载构造器,为name赋值 15 Student s1 = new Student("小明"); 16 System.out.println(s1.name+","+s1.grade);//小明 17 18 Student s2 = new Student("小红",2); 19 System.out.println(s2.name+","+s2.grade);//小红 20 21 } 22} 23 24 25 26//输出 27创建了一个学生 28null,0 29创建了一个名为小明的学生 30小明,0 31创建了一个名为小红的学生 32创建了一个名为小红的学生,2年级 33小红,2

关于关键字this(还有些用法在下一篇一起总结):

  • this.name = name;表示把形参name赋值给正在调用构造器方法的对象的name属性赋值。this在这里表示正在调用方法的对象。
  • this(name);表示在该构造器中调用另一个构造器,且this语句必须出现在执行体的第一句,也就是说一个构造器里不能调用两次其他构造器。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java实例化

初始化块实际上,初始化块是一个假象,使用javac命令编译java类后,初始化块会消失,初始化代码被还原到每个构造器中代码的最前面在实例化的过程中:前面的初始化块先执行,后面的后执行初始化块的修饰符只能是static普通初始化块负责对对象执行初始化,静态初始化块负责对类执行初始化初始化块只在创建

java成员变量的初始化

类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值

一文了解 Java 中的构造器

一文了解Java中的构造器C引入了构造器(constructor,也叫构造函数)的概念,它是在创建对象时被自动调用的特殊方法。Java也采用了构造器,并且还提供了一个垃圾收集器(garbagecollector),当不再使用内存资源的时候,垃圾收集器会自动将其释放。构造器定义在Java中,可以通过编写构造器来确保每个对象的初始化。但是这

Java面向对象之构造器 - HelloWorld