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. 2019-2020-1 20199304《Linux内核原理与分析》第六周作业

    第五章 系统调用的三层机制(下) 1.往MenuOS中添加命令 (1)首先进入LinuxKernel文件夹,将menu目录删除.然后再git clone克隆下载更新了版本之后的menu目录(包含tim ...

  2. C#语法--委托,架构的血液

    委托的定义 什么是委托? 委托实际上是一种类型,是一种引用类型. 微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样.都是声明用的. 下面先看下声 ...

  3. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. python实现十大核心算法(桶排没实例)

    # author:sevenduke # 2019-06-11 # 一.交换排序 # 排序算法的温故:冒泡排序 def dubblesort(arr): for i in range(0, len(a ...

  5. [TimLinux] myblog 数据表格显示

    1. 设计 2. 数据 创建数据库用户: CREATE USER IF NOT EXISTS 'user1'@'MyBlogPwd123'; GRANT ALL ON d1.* TO 'user1'@ ...

  6. mac版 sublime快捷键大全

    按这几大类分类:文件 编辑 选择 查找 视图 去往 工具 项目 窗口 帮组一.文件cmd + N 新建文件cmd + S 保存文件cmd + shift + S 文件另存为cmd + alt + S ...

  7. Bless You Autocorrect!

    题目链接: https://odzkskevi.qnssl.com/0c87453efec2747f8e8a573525fd42f9?v=1533651456 题解: 这是一道Trie+BFS的题目: ...

  8. CodeForces1006A - Adjacent Replacements

    A. Adjacent Replacements time limit per test 1 second memory limit per test 256 megabytes input stan ...

  9. C#异步编程看这篇就够了

    随着.NET Core的流行,相信你现在的代码中或多或少的会用到async以及await吧!毕竟已成标配.那么我们为什么要用async以及await呢?其实这是微软团队为我们提供的一个语法糖,让我们不 ...

  10. 捅娄子了,写个bug被国家信息安全漏洞共享平台抓到了?

    摸不了鱼了 2019 年 11 月 26 日,本来应该是无比平静的一天,开开会,改改bug,摸摸鱼之后等着下班.刷着新闻的间隙,手机的消息提示音响了起来,收到了一条邮件,平时收到邮件我都会选择稍后处理 ...