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. C# 子类与父类构造函数

  2. 第二周选做(myod)

    02.第二周myod(选做) 实验要求: 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Mak ...

  3. hello gulp,使用gulp的第一天。

    昨天花了一天的时间,学习了一下gulp,今天整理一下,也分享给朋友们. 首先当然是去gulp的官网逛一圈了: http://gulpjs.com/ 中文站地址: http://www.gulpjs.c ...

  4. JavaScript新手经常遇到的问题(二)

    1.Form表单只提交数据而不进行页面跳转的方法 <script type="text/javascript" src="js/jquery/jquery-1.8. ...

  5. 【java基础】Thread类之join方法

  6. luogu P3111 [USACO14DEC]牛慢跑Cow Jog_Sliver |贪心+模拟

    有N (1 <= N <= 100,000)头奶牛在一个单人的超长跑道上慢跑,每头牛的起点位置都不同.由于是单人跑道,所有他们之间不能相互超越.当一头速度快的奶牛追上另外一头奶牛的时候,他 ...

  7. 17-Python执行JS代码--PyExecJS、PyV8、Js2Py

    一.Python执行JS代码--PyExecJS.PyV8.Js2Py 1.1.PyExecJS PyExecJS的优点是您不需要照顾JavaScript环境.特别是,它可以在Windows环境中运行 ...

  8. js 防抖、截流

    突发奇想,在触发事件的时候,一些会频繁触发的事件会不会造成资源的浪费或者大量的计算造成页面卡顿,比如onresize,onscroll,onmousemove等事件. 然后就引出了一个新知识点:防抖. ...

  9. EasyUI整合SpringBoot,Spring Data对数据的分页操作

    EasyUI的用法可以看中文官网,看插件是如何使用的 EasyUI中文官网 前端页面 <table id="dg" title="My Users" cl ...

  10. python光标图片获取

    # -*- coding:utf-8 -*- import win32api import win32gui,win32ui import time while True : time.sleep(1 ...