廖雪峰Java2-2数据封装-2构造方法
在2-2-1中,创建1个实例需要3步
Person ming = new Person();
ming.setName(" 小明 ");
ming.setAge(16);
问题:能否在创建对象实例时就把内部字段全部初始化为合适的值?
构造方法因此应运而生
1.单个构造方法
- 构造方法可以在创建对象实例时初始化对象实例
- 构造方法名就是类名
- 构造方法的参数没有限制
- 构造方法没有返回值(也没有void)
- 必须用new操作符调用构造方法
Person.java
public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public void info() {
System.out.printf("我是%s,今年%d岁" ,name,age);
}
}
Hello.java
public class Hello {
public static void main(String[] args) {
Person ming = new Person("小明",12);
ming.info();
}
}

如果一个类没有定义构造方法,编译器会自动生成一个默认构造方法:
* 无参数
* 无执行语句
```#java
public Person() { }
```
如果我们定义了构造方法,编译器不会再自动创建默认的构造方法
构造方法初始化顺序:
- 先初始化字段
- 没有赋值的字段初始化为默认值:基本类型=0;引用类型=null
- 再执行构造方法的代码
多个构造方法
可以定义多个构造方法,编译器通过构造方法的参数数量、位置和类型区分
一个构造方法可以调用其他构造放方法,便于代码复用。
调用其他构造方法的语法是this(...)
Person.java
public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public Person(String name) {
this(name,18);
}
public Person() {
this("Unnamed");
}
public void info() {
System.out.printf("我是%s,今年%d岁\n" ,name,age);
}
}
Hello.java
public class Hello {
public static void main(String[] args) {
Person ming = new Person("小明",12);
ming.info();
Person hong = new Person("小红");
hong.info();
Person jun = new Person();
jun.info();
}
}

3.总结:
实例在创建时会调用构造方法
构造方法用于初始化实例
没有定义构造方法时,编译器会自动创建默认的构造方法。
可以定义多个构造方法,编译器根据参数自动判断
廖雪峰Java2-2数据封装-2构造方法的更多相关文章
- 廖雪峰Java2面向对象编程-2数据封装-1方法
1.数据封装 一个class可以包含多个field.直接把field用public暴露给外部可能破坏了封装,例如传入不合理的数值(年龄填入1000).如下 public class Person { ...
- 廖雪峰Java2面向对象编程-2数据封装-1方法重载
方法重载 方法重载Overload是指:多个方法的方法名相同,但各自的参数不同 参数的个数不同 参数的类型不同 参数位置不同 方法返回值类型通常都是相同的 目的:相同功能的方法使用同一名字,便于调用 ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...
- 廖雪峰Java2面向对象编程-3继承和多态-1继承
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通 ...
- 廖雪峰Java2面向对象编程-1面向对象-1面向对象基础
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Pe ...
- 廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...
- 廖雪峰Java2面向对象编程-6Java核心类-4JavaBean
1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { pr ...
- 廖雪峰Java2面向对象编程-6Java核心类-3包装类型
Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types" ...
- 廖雪峰Java2面向对象编程-6Java核心类-2StringBuilder
字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0 ...
- 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码
Java的字符串用String表示 1.String特点: 可以直接使用"..."表示一个字符串,不强制使用new String 内容不可变 String s1 = "h ...
随机推荐
- 《DSP using MATLAB》Problem 5.6
频率采样定理是这样的: 由上述定理可知,一个有限长序列(假设为N)的DTFT等间隔采样,采样数至少大于等于N. 代码: %% +++++++++++++++++++++++++++++++++++++ ...
- spring模拟ioc
非spring 开发 public class UserService { private UserDao userDao=new UserDaoImpl(); public void addUser ...
- java transient 知识点学习
今天看源码的时候看到这个关键字,完全没见过,不懂.好吧!学习一下. 我们都知道实现了Serilizable接口的类,便可以序列化,那么其中某些成员变量不想被序列化怎么办?就是利用transient这个 ...
- .closest 样例收集
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ★ MYSQL隔离级别 通俗理解 + mysql、oracle默认事务隔离级别
★ 脏读 : 读取了前一事务 未提交 的数据 ; 不可重复读 : 读取了前一事务 提交 的数据: ★ 幻读 与 不可重复读 common :都是读取了另一条已经提交的事务(这点与脏读不 ...
- lapis 项目添加prometheus 监控集成grafana
操作很简单,主要是进行界面的配置以及prometheus 服务的配置, 可以和https://www.cnblogs.com/rongfengliang/p/10074044.html &&a ...
- 路由器外接硬盘做nas可行吗?
话说把家里的newifi mini升级到最新版后,又外接了个移动硬盘做nas,第一部就打算吧手机的视频移过去.一试才发现这速度慢的不行.只有几百kb 所以说,用是能用,单着速度也太慢了 再就是貌似硬盘 ...
- [转]从OSI网络模型到TCP/IP协议族简介
OSI七层模型 OSI(Open System Interconnection,开放系统互联)七层网络模型成为开放式系统互联参考模型,是一个把网络通信在逻辑上的定义,也可以理解成为定义了通用的网络通信 ...
- “更新时间”字段的:ON UPDATE CURRENT_TIMESTAMP 含义
"更新时间"字段的:ON UPDATE CURRENT_TIMESTAMP 含义: 表示在数据库数据有更新的时候UPDATE_TIME的时间会自动更新(如果数据库数据值没有变化的话 ...
- Linux下使用Quagga(Zebra)搭建路由器记录(转)
写在前面 从22号中午开始琢磨zebra/quagga的用法,一直到晚上11点多都没有什么头绪.各种Google,百度,几近崩溃.由于网上关于zebra/quagga的配置方法都是在真实的若干台电脑上 ...