重载:  

  如果多个方法(包含构造方法)有相同的名字、不同的参数,便产生重载。编译器必须挑选出具体执行哪个方法,它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配挑选出相对应的方法。

如果编译器找不到匹配的参数,就会产生编译时错误。(此过程称为重载解析)

    注意:方法的返回类型并不属于重载的条件,因为不能有两个名字相同、参数相同而返回类型不同的方法。否则会编译报错。我在大学的时候就是傻逼逼的一直把返回类型当做重载条件的一部分。

重载例子如下:

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.对象构造的更多相关文章

  1. [Java核心技术]第四章-对象与类(4.1-4.6总结)

    4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通 ...

  2. Java核心技术第四章——2.final 和 static

    final实例域 实例域(对象的属性)可修饰为final.修饰为final后,在构建对象时必须初始化这个实例域.若没有在实例域进行初始化,那么必须在每个构造器内初始化这个实例域(否则会编译错误). 表 ...

  3. Java核心技术第四章——1.封装性

    封装性(有时称为数据隐藏): 实现封装的关键在于绝对不能让类中的方法直接地访问其他类的实例域值.程序仅通过对象的方法与对象的数据进行交互. 给对象赋予了"黑盒"的特征,提高了重用性 ...

  4. 《Java程序设计》第四章-认识对象

    20145221<Java程序设计>第四章-认识对象 总结 教材学习内容总结 类与对象 定义:对象是Java语言中重要的组成部分,之前学过的C语言是面向过程的,而Java主要是面向对象的. ...

  5. Java核心技术第五章——1.类、超类、子类(2)

    继上一篇Java核心技术第五章——1.类.超类.子类(1) 6.重载解析 假如调用ClassName.Method(args) 1.编译器列出类ClassName所有名为Method的方法. 2.编译 ...

  6. “全栈2019”Java多线程第四章:设置和获取线程名称

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java异常第四章:catch代码块作用域详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  8. “全栈2019”Java第九十四章:局部内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. “全栈2019”Java第十四章:二进制、八进制、十六进制

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Python并发编程之从生成器使用入门协程(七)

    大家好,并发编程 进入第七篇. 从今天开始,我们将开始进入Python的难点,那就是协程. 为了写明白协程的知识点,我查阅了网上的很多相关资料.发现很难有一个讲得系统,讲得全面的文章,导致我们在学习的 ...

  2. InnoDB存储引擎结构介绍

    Ⅰ.InnoDB发展史 时间 事件 备注 1995 由Heikki Tuuri创建Innobase Oy公司,开发InnoDB存储引擎 Innobase开始做的是数据库,希望卖掉该公司 1996 My ...

  3. Spring Cloud @HystrixCommand和@CacheResult注解使用,参数配置

    使用Spring Cloud时绕不开Hystrix,他帮助微服务实现断路器功能.该框架的目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力.Hystrix具备 ...

  4. 系列博文-Three.js入门指南(张雯莉)-静态demo和three.js功能概览

    一:一个最简单的静态DEMO //body加载完后触发init() //WebGL的渲染是需要HTML5 Canvas元素的,你可以手动在HTML的<body>部分中定义Canvas元素, ...

  5. Android 5.x Theme 与 ToolBar 实战

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45303349: 本文出自:[张鸿洋的博客] 1.概述 随着Material D ...

  6. testng生成自定义html报告

    转自:https://blog.csdn.net/kdslkd/article/details/51198433 testng原生的或reportng的报告总有些不符合需要,尝试生成自定义测试报告,用 ...

  7. Java借助CountDownLatch完成异步回调

    public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World&quo ...

  8. BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序

    BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...

  9. 发送email

    package com.rjj.d; import java.security.GeneralSecurityException; import java.util.Date; import java ...

  10. 【填坑纪事】一次用System.nanoTime()填坑System.currentTimeMills()的实例记录

    JDK提供了两个方法,System.currentTimeMillis()和System.nanoTime(),这两个方法都可以用来获取表征当前时间的数值.但是如果不仔细辨别这两个方法的差别和联系,在 ...