Java面向对象之构造器
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面向对象之构造器的更多相关文章
- Java面向对象04——构造器
类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的.并且构造器有以下两个特点: 必须和类的名字相同 必须没有返回值,也不能写void package oop.demon01.demon02 ...
- java面向对象_构造器
构造器(构造方法):是类中定义的方法. 1)常常用于给成员变量赋值: 2)与类同名,没有返回值类型,也不能写void: 3)在创建对象时被自动调用.所以构造方法的访问修饰符要用public,才能被自动 ...
- JAVA面向对象
JAVA面向对象 对象 我们生活中能看到能摸到的一切事物都是对象.在程序中模拟出生活中的所有东西万物皆对象 只要是对象--属性和行为(方法) 属性 对象有什么 例如:学生有姓名.学 ...
- 【重走Android之路】【Java面向对象基础(三)】面向对象思想
[重走Android之路][基础篇(三)][Java面向对象基础]面向对象思想 1 面向对象的WWH 1.1 What--什么是面向对象 首先,要理解“对象”.在Thinkin ...
- Java——面向对象基础
Java继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类具有父类的各种属性和方法,或子类从父类继承方法,使得子类具 ...
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
- 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class ...
- Java面向对象进阶篇(包装类,不可变类)
一. Java 8的包装类 Java中的8种基本数据类型不支持面向对象的变成机制,也不具备对象的特性:没有成员变量,方法可以调用.为此,Java为这8 种基本数据类型分别提供了对应的 包装类(Byte ...
- Java面向对象(二、继承)
Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法 ...
随机推荐
- iOS13暂时关闭黑暗模式+应用内状态栏无法显示问题解决办法
现象: iOS13黑暗模式开启后,app显示会出现很多意外显示情况.暂时屏蔽是最好的选择.当开启黑暗模式,且在项目的target对应的info.plist中添加以下设置时(禁用黑暗模式): <k ...
- Ubuntu 18.04 LTS上安装NFS服务器和客户端
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器.操作系统以及低层传送协议无关的存取远程文件的操作.RPC采用了XDR的支持.XDR是一种与机器无关的 ...
- 学习ThinkPHP的第20天--MySQL事务操作、查询事件、一对一关联
之所以从20天才开始写随笔记是因为之前没搞自己的博客 从20天开始记录我在ThinkPHP中的点点滴滴 1.MySQL事务操作 /**事务操作*/ //startTrans启动事务.rollback回 ...
- Spring Boot整合Servlet、Filter、Listener
整合 Servlet 方式一: 编写 servlet package com.bjsxt.controller; import javax.servlet.ServletException; ...
- UESTC-1963咸鱼咕咕咕(二分图匹配)
咸鱼咕咕咕 Time Limit: 1000 MS Memory Limit: 64 MB Submit Status 咸鱼有个咕咕笼. 咕咕笼可以划分成m×nm×n个格子,每个小格子可以放下 ...
- 这些C++常用内置函数你会几个??
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Regina520 新手注意:如果你C++学的不好,可以去拿我的C+ ...
- CyAPI环境搭建
http://jingyan.baidu.com/article/e6c8503c0690cee54f1a1893.html
- 基于FPGA的图像开发平台 其他摄像头附件说明(OV5642 OV9655)
基于FPGA的图像开发平台 其他摄像头附件说明 FPGA_VIP_V101 编者 奇迹再现 个人博客 http://www.cnblogs.com/ccjt/ 联系邮箱 Shenyae86@163.c ...
- 从零开始的openGL——四、纹理贴图与n次B样条曲线
前言 在上篇文章中,介绍了如何加载绘制模型以及鼠标交互的实现,并且遗留了个问题,就是没有模型表面没有纹理,看起来很丑.这篇文章将介绍如何贴纹理,以及曲线的绘制. 纹理贴图 纹理加载 既然是贴图,那首先 ...
- 【CuteJavaScript】Angular6入门项目(1.构建项目和创建路由)
本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...