Java面向对象之构造器

利用构造器确保初始化

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

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

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

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

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

先看下面的语句:

Student s0 = new Student();

这是我们之前经常写的,我们管他叫做创建对象,并让引用变量指向这个对象的过程(类的实例化)。

在执行new Student();语句时,系统就会为对象分配内存空间,并调用相应的构造器,执行响应的执行体,确保对象在被我们操作之前,就已经正确初始化。

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

注意

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

关于构造器的访问修饰符

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

其他

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

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

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

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

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

构造器重载

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

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

构造器重载代码演示:

package com.my.pac09;

/**
* @author Summerday
* @date 2019/12/6 18:23
*/
public class Student {
//暂且先把属性设为public
public String name;
public int grade; //重新定义默认构造器,假如输出语句
public Student() {
System.out.println("创建了一个学生");
}
//this的用法之一
public Student(String name) {
this.name = name;
System.out.println("创建了一个名为" + this.name + "的学生"); } public Student(String name, int grade) {
//调用另一个构造器
this(name);
this.grade = grade;
System.out.println("创建了一个名为" + this.name + "的学生," + this.grade + "年级");
}
}

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

package com.my.pac09;

/**
* @author Summerday
* @date 2019/12/6 18:29
*/
public class StudentTest {
public static void main(String[] args) {
//用new创建对象,调用新定义的无参构造器
Student s0 = new Student();
//两个属性值默认初始化
System.out.println(s0.name+","+s0.grade);//null //调用重载构造器,为name赋值
Student s1 = new Student("小明");
System.out.println(s1.name+","+s1.grade);//小明 Student s2 = new Student("小红",2);
System.out.println(s2.name+","+s2.grade);//小红 }
}
//输出
创建了一个学生
null,0
创建了一个名为小明的学生
小明,0
创建了一个名为小红的学生
创建了一个名为小红的学生,2年级
小红,2

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

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

Java面向对象之构造器的更多相关文章

  1. Java面向对象04——构造器

    类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的.并且构造器有以下两个特点: 必须和类的名字相同 必须没有返回值,也不能写void  package oop.demon01.demon02 ...

  2. java面向对象_构造器

    构造器(构造方法):是类中定义的方法. 1)常常用于给成员变量赋值: 2)与类同名,没有返回值类型,也不能写void: 3)在创建对象时被自动调用.所以构造方法的访问修饰符要用public,才能被自动 ...

  3. JAVA面向对象

    JAVA面向对象 对象   我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象   只要是对象--属性和行为(方法)   属性   对象有什么   例如:学生有姓名.学 ...

  4. 【重走Android之路】【Java面向对象基础(三)】面向对象思想

    [重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想   1 面向对象的WWH   1.1 What--什么是面向对象         首先,要理解“对象”.在Thinkin ...

  5. Java——面向对象基础

    Java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类具有父类的各种属性和方法,或子类从父类继承方法,使得子类具 ...

  6. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  7. 【Java学习笔记之十三】初探Java面向对象的过程及代码实现

    理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...

  8. Java面向对象进阶篇(包装类,不可变类)

    一. Java 8的包装类 Java中的8种基本数据类型不支持面向对象的变成机制,也不具备对象的特性:没有成员变量,方法可以调用.为此,Java为这8 种基本数据类型分别提供了对应的 包装类(Byte ...

  9. Java面向对象(二、继承)

    Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...

随机推荐

  1. python 3 mro

    __mro__ 1.只有在python2中才分新式类和经典类,python3中统一都是新式类 2.在python2中,没有显式的继承object类的类,以及该类的子类,都是经典类 3.在python2 ...

  2. Spring 之初识IOC和DI

    下载Spring jar包 Spring官网 下载地址 Sping核心jar包 IOC简介 IOC:控制反转,指以前程序自己创建对象,现在将创建对象的控制权交给了第三方(Spring)了 IoC底层实 ...

  3. 解决Connection to Xxx@localhost failed.

    解决: Connection to jianshu@localhost failed. [08001] Could not create connection to database server. ...

  4. Pandas里面常用的一些数据分析函数总结

    import pandas as pdimport numpy as np pandas 有两个主要的数据结构:Series 和 DataFrame:Series 是一个一维数组对象 ,它包含一组索引 ...

  5. ARTS-S ansible-playbook

    文件a.yml --- - hosts: cluster remote_user: ksotest gather_facts: false tasks: - name: delete dir if e ...

  6. CrazyBingo mini VIP 2.0 视频开发板 NIOS移植例程(原创)

    创建一个NIOS环境 注意事项 前言:(先了解下硬件) 本板卡目前主要适合以下几类人: (1)对FPGA 逻辑开发有强烈的兴趣,并且有一定的HDL基础 (2)计划采用FPGA图像架构,学习并研究图像算 ...

  7. Oracle数据库备份/导出(exp/expd)、导入(imp/impd)

    ​ 常用的oracle数据库备份(导入/导出)有两种,分别是exp/imp和expd/impd,前者是Orace早期版本带有的导入导出工具,后者是Oracle10g后出现的,下面进行分别介绍! 1.e ...

  8. JAVA使用SnakeYAML解析与序列化YAML

    1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...

  9. NodeJS4-2静态资源服务器实战_实现获取文件路径

    实例2 : 实现获取文件路径,判断是文件还是文件夹,如果是文件夹就显示里面的列表文件,如果是文件就显示里面的内容 defaultConfig.js module.exports={ root:proc ...

  10. CMAKE同时编译C++和CUDA文件

    1. 首先是运行环境 Ubuntu 16.04 G++ 5.4.0 CUDA 8.0 2. 文件结构 cv@cv:~/myproject$ tree src src/ |-- CMakeLists.t ...