Java核心技术第四章——3.对象构造
重载:
如果多个方法(包含构造方法)有相同的名字、不同的参数,便产生重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配挑选出相对应的方法。
如果编译器找不到匹配的参数,就会产生编译时错误。(此过程称为重载解析)
注意:方法的返回类型并不属于重载的条件,因为不能有两个名字相同、参数相同而返回类型不同的方法。否则会编译报错。我在大学的时候就是傻逼逼的一直把返回类型当做重载条件的一部分。
重载例子如下:
public class OverLoadingClass {
String id; /*构造器重载*/
public OverLoadingClass(){ } public OverLoadingClass(String id){
this.id = id;
}
/*构造器重载*/ /*方法重载*/
public void Test(String name){
} public void Test(Integer age){ }
/*方法重载*/ }
默认域初始化:
如果在构造器中没有显示的给实例域(全局变量)赋予初值,那么就会被自动赋予默认值:数值的为0、布尔值为false、对象引用为null。
但是在局部变量中则不会自动初始化,若直接调用没有初始化的局部变量则会编译错误。
/**
* 默认域初始化
*/
public class DefaultInitialization { int id; //默认值为0 boolean flag; //默认值为false String name; //默认值为Null public void Test(){
int age;
System.out.println(age);//编译报错
}
}
无参数构造器:
如果在编写一个类时没有编写构造器,那么系统就会自动提供一个无参数的构造器。如果编写了一个带参数的构造器,系统则不会自动提供无参数的构造器。
一般在编写了一个带参数的构造器,都应该编写多一个无参数的构造器。
显示域初始化:
显示域初始化,从文字上就可以知道,可以用眼睛看出他被初始化,并不是系统帮我们初始化(那是上面的默认域初始化了)。
/**
* 显示域初始化
*/
public class DisplayInitialization { int id = 666; String date = getDate(); public String getDate(){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(new Date());
}
}
参数名
在创建带参数的构造器时,参数变量用同样的名字将实例域屏蔽起来。如果参数名为name,那么在方法当中name将引用这个参数。而不是实例域,但是可以使用this关键字指向隐式参数(实例域),例:this.name
public class ParameterClass { String name; public ParameterClass(String name){
this.name = name;
}
}
在一般的程序开发当中应该都会这么写,当然,你也可以有下面的操作(不怕被同事鄙视你代码的话)
public class ParameterClass { String name; public ParameterClass(String n){
name = n;
}
}
看起来是不是很别扭呢?所以代码还是要规范一点的好。
调用另一个构造器
关键字this引用方法的隐式参数外,还能在构造器中调用其他的构造器,当然是同一个类的,别想太多。这样的话对公共的构造器代码部分只编写一次即可。
/**
* 调用其他构造器
*/
public class CallOtherConstructor { public CallOtherConstructor(){
System.out.println("大胸弟,你来new我啦?");
} public CallOtherConstructor(String name){
this();//调用上面那个构造器
System.out.println(name+":对呀对呀,我来啦");
}
}
初始化块
除了在构造器中、声明中赋值以外,java还有第三种机制,称为初始化块,在一个类的生命中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。
public class InitializationBlock { private Integer id; {
id = 1;
System.out.println("进入初始化块");
} public static void main(String[] args){
InitializationBlock block1 = new InitializationBlock();
InitializationBlock block2 = new InitializationBlock();
}
}
输出结果:
进入初始化块
进入初始化块
在初始化对象的时,执行的顺序为:声明 -> 初始化块 -> 构造器 而初始化块一般比较少用,通常都会把初始化代码放在构造器中。
静态初始化块则不同。静态初始化块在类的第一次加载的时候,将会进行静态域的初始化。(注意:第一次加载类的时候才会执行,往后初始化此对象都不会再进入静态初始化块)
public class InitializationBlock { static{
System.out.println("进入静态初始化块");
} public static void main(String[] args){
InitializationBlock block1 = new InitializationBlock();
InitializationBlock block2 = new InitializationBlock();
}
}
输出结果:
进入静态初始化块
好了,这篇文章我大概写了两周,因为断断续续的在写。当然,写这么多除了自己记住之外,也是为了大家能够看懂。所以大伙能不能给我点个推荐呢?~~给点鼓励我吧~谢谢大家的观看~
Java核心技术第四章——3.对象构造的更多相关文章
- [Java核心技术]第四章-对象与类(4.1-4.6总结)
4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...
- Java核心技术第四章——2.final 和 static
final实例域 实例域(对象的属性)可修饰为final.修饰为final后,在构建对象时必须初始化这个实例域.若没有在实例域进行初始化,那么必须在每个构造器内初始化这个实例域(否则会编译错误). 表 ...
- Java核心技术第四章——1.封装性
封装性(有时称为数据隐藏): 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域值.程序仅通过对象的方法与对象的数据进行交互. 给对象赋予了"黑盒"的特征,提高了重用性 ...
- 《Java程序设计》第四章-认识对象
20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...
- Java核心技术第五章——1.类、超类、子类(2)
继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...
- “全栈2019”Java多线程第四章:设置和获取线程名称
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java异常第四章:catch代码块作用域详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第九十四章:局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十四章:二进制、八进制、十六进制
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- Containerd 简介
我们可以把 docker 抽象为下图所示的结构(此图来自互联网): 从图中可以看出,docker 对容器的管理和操作基本都是通过 containerd 完成的. 那么,containerd 是什么呢? ...
- navicat for mysql 破解方法
https://www.cnblogs.com/da19951208/p/6403607.html 破解教程
- 三. 200多万元得到的创业教训--创业并不需要app
摘要:有个点子,研发app或网站,推广,不断改进,探索盈利模式.这个通用的移动互联网创业流程.但我认为,在某些特定的商业模式下,"研发app或网站"这步可以砍掉或推迟. 健生干货分 ...
- Spring IOC知识点一网打尽!
前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工厂模式理解了没有? 在刷Spring书籍的时候花了点时间去学习了单例模式和工厂模式,总 ...
- Python软件目录结构规范
设计项目目录结构和'代码编码风格'一样, 是为了达到以下两点: 可读性高 可维护性高 目录组织方式 Stackoverflow上有一些比较好的范式.
- forwardPort.go
packagemain import( "encoding/json" "flag" "fmt" " ...
- fastjson使用中遇到的
二. fastjson 解析json字符串为四种类型 1. JavaBean Person person = JSON.parseObject(jsonString, Person.class); 2 ...
- bzoj 2242 [SDOI2011]计算器 快速幂+扩展欧几里得+BSGS
1:快速幂 2:exgcd 3:exbsgs,题里说是素数,但我打的普通bsgs就wa,exbsgs就A了...... (map就是慢)..... #include<cstdio> # ...
- Python + Appium 获取当前屏幕的截图方法的封装
使用方法:get_screenshot_as_file(filename),来自于selenium\webdriver\remote\webdiver.py def take_screenShot(s ...
- python——几种截图对比方式!
本次记录的几种截图对比方式,主要是为了在进行手机自动化测试时,通过截图对比来判断测试的正确性,方式如下: # -*- coding: utf- -*- ''' 用途:利用python实现多种方法来实现 ...