前言-

本文是为个人学习做的整理性质的笔记,肯定带有许多不妥的地方,仅供参考。

(第五章·初始化与清理 《Thinking in Java》)

        用构造器确保初始化

正文-

构造器:

  什么是构造器?:C++中引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法,在Java中也是如此,通过提供构造器,来确保每一个对象的初始化。

  为什么要构造器?:使用构造器有助于减少错误,并使代码更容易阅读。

  构造器长什么样子?:构造器采用与类名相同的名称,两者必须完全相同,所以“每个方法首字母小写”的编码风格并不适合构造器。

  

  不接受任何参数的构造器叫做“默认构造器”,Java中通常使用的术语称之为“无参构造器”

  p.s:

    1·从概念上讲,“初始化”/“创建”是彼此独立的,然而在Java代码中你却找不到对initialize()的明确调用。在Java中,“初始化”/“创建”的捆绑在一起的,两者不能分离。

    2·构造器是一种特殊的方法,因为它没有返回值(这与void很像),但是返回值为空(void)尽管方法本身不会自动返回什么,但是你仍可以让他返回一些东西。构造器则不会有任何返回值。

    3·new 表达式确实返回了新建对象的引用,但是构造器本身并没有返回值(假如有返回值,并且可以让人自由选择返回类型,那么势必deranged编译器知道该如何处理此类型)。      

    4·虽然没有显式的使用static关键字,但是构造器实际上也是静态方法(这在初始化顺序里会提到)

public class Lianxi1_2 {
public static void main(String[] args) {
System.out.println("Noteone:"+new Noteone().note);
Notetwo nt=new Notetwo();
System.out.println("Notetwo:"+nt.note1+"||"+nt.note2);
}
} class Noteone{
String note;
} class Notetwo{
String note1="hello";
String note2;
public Notetwo() {
// TODO 自动生成的构造函数存根
note2="hello in constructor";
}
}

练习1和2

方法重载:

  大多数程序设计语言里(尤其是C中),要求为每一个方法(也被称为函数)都提供一个独一无二的标识符。

  在Java(和C++)里,因为构造器的名字已经由类名所确定,方法的重载就显得格外的重要。为了方法名相同而其中的形式参数不同的方法同时存在,就必须用到方法的重载。

  ※形式参数:在定义函数时函数名后面括号中的变量名称称为形式参数(简称形参),即形参出现在函数定义中。

  怎样区分重载:

    1·方法名字相同,参数不同(甚至参数的顺序也可以区分,但最好不要这样做)。

    2·由于基本类型可以从一个“较小”的类型自动的转变成一个“较大”的类型,此过程一旦涉及到重载,就会出现一些混淆。

      ※如果传入的数据类型(实参/实际参数类型)小于方法中声明的形式参数类型,实际数据类型就会被提升。“char”型略有不同,她会直接上升至“int”型。

      ※如果传入的数据类型较大,就得通过类型转化来进行窄化转换(强制转换或其他转换方法)。

    3·切记!!!不能通过返回值的类型区分重载的方法。

      例如:

        void f(){ };

        int f(){return 1};

     在"int i=f();"中的确可以区分,但是有时候你并不关心方法的返回值,像这样调用方法:" f(); "这时候就不能区分该调用哪个方法了。

系统会帮你创建默认构造器

  默认构造器(又名无参构造器),她的作用的创建一个默认对象。如果你写的类中没有构造器,编译器将会自动帮你创建一个无参的默认构造器。

  ※如果你已经写了一个构造器,编译器就不会帮你创建了(如果你只写了一个带有参数的构造器,由于编译器不会帮你创建默认构造器了,所以你在创建对象的时候也必须提供参数。除非你又单独写了一个无参的构造器)。

public class Lianxi3_4 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(new Nothing().s);
new Nothingbut();
new Nothingbut("you");
}
} class Nothing{
String s="Nothing";
//验证系统创建默认构造器
} class Nothingbut{
public Nothingbut() {
// TODO 自动生成的构造函数存根
System.out.println("nothingbut constructor");
}
public Nothingbut(String s) {
System.out.println("nothingbut constructor with "+s);
}
}

练习3和4

public class Lainxi5_6 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Dog dd=new Dog();
dd.barking(" ");
dd.howling(12345);
dd.barkAndHowl(123," ");
dd.barkAndHowl(" ", 122);
} }
class Dog{
void barking(String s) {
System.out.println("dog is barking!");
} void howling(int i) {
System.out.println("dog is howling!");
} void barkAndHowl(String s,int i) {
System.out.println("dog is barking and howling!");
}
void barkAndHowl(int i,String s) {
System.out.println("dog is howling and barking!");
}
}

练习5·6和7

额外内容:重载,重构与重写(三重)

重构:通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理。提高软件的扩展性和维护性。通俗点说,重构就是当你发现代码的不足之处时,去改动它的结构,去优化它。

  • 重构的具体做法:可以通过重写或者重载等,但不限于此,更改注释、更改函数名类名等,都可以称之为重构;
  • 重构的目的       :是为了让软件容易维护, 修改其Bug等。

重写:子类通过@override来实现方法重写。在父类里声明了一个模糊的方法,并不给出详细的行为,在子类里,通过重写父类(同方法名,參数,返回值等)中的这种方法,让这种方法实例化,去适合子类。

  • override(Overwrite):是子类覆盖基类的方法。
  • 重写的特点:

    1、必须是在继承里,

    2、方法名、返回值类型、参数个数和参数类型 都必须相同

    3、派生类重写的方法的访问权限不能低于基类的权限

    4、派生类抛出的异常应该和基类相等或比基类更小

重载:是通过方法的参数识别不同的函数 。比如你有一个AMethod()不带参数,然后你用了一个另外相同名称的方法,带一个参数AMethod(String para), 这个过程就叫做重载。

重写与重载的区别:

  1.重写必须继承,重载不用。

  2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。

  3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。

  4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常。

总结:

  重写:是对方法本身重新编写。

  重载:函数名相同 参数个数不同。

  重构:重写算是重构的一部分,但重构还包括对程序结构的优化。

※重构居然会出现在软件工程的卷纸上,给我整蒙了,今天看到重载,联想到她,特此记录。

                              参考链接:1.重写、重构、重载区别

                                   2.java中,重构、重载、重写

[Thiinking in Java]自闭学习之路(一)构造器的更多相关文章

  1. Java程序员学习之路

    1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

  2. Java自学编程学习之路资源合集

    Java Web学习 STEP.1---Java基础最重要 工欲善其事,必先利其器.想要学好Java Web,或者说想要开始学Java Web,Java的基础是必不可少. 基本语法(★★★★★) 数组 ...

  3. 转: 一个程序员的Java和C++学习之路(整理)

    http://blog.csdn.net/ajian005/article/details/8003655 http://m.blog.csdn.net/xugangwen/article/detai ...

  4. Java架构师学习路线

    Java架构师,首先要是一个高级java攻城狮,熟练使用各种框架,并知道它们实现的原理.jvm虚拟机原理.调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池--   Java ...

  5. (转)如何学习Java技术?谈Java学习之路

    51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...

  6. Java学习之路:不走弯路,就是捷径

    1.如何学习程序设计? JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅仅适用于JAVA,对C++等其他程序设计语言也一样管用.有编程高手认为,JAVA也好C也好没什么分别,拿来就用.为 ...

  7. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. crowdfunding项目01——感人的错误

    四十搭环境,半个小时下载jar包,网速感人,一个半小时找bug真是感动 首先SSM项目,主要功能进行增删改查 建立父工程和子工程,产生依赖关系 父工程:pom 子工程:jar.war(web工程) 错 ...

  2. 图解SOAPUI解析WSDL文件

    本文链接:https://blog.csdn.net/qq_16234613/article/details/53143279 新建项目 添加WSDL文件 查看方法 查看XML格式 运行测试  

  3. 发送数据给sap和接收

    1.确保已经连通sap 2.发送数据:这是以表的形式发送,而且是批量发送给sap 3.接收sap返回信息:这个比较特别,碰到时试一试 package com.yiyezhiqiu.lyh.utils; ...

  4. 每天进步一点点------Xilinx IP 内核

    ISE 设计套件 11.1 版本中提供了众多全新的 IP 内核.数学函数:Multiply Adder v2.0 —— 执行两个操作数的乘法,并采用 XtremeDSP™ 解决方案切片将完全精确的乘积 ...

  5. select poll和 epoll

    select .poll.epoll 都是多路io复用的机制,i/o多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知乡音的程序进行相应的读写操作.但s ...

  6. linux 下查看Tomcat的状态,以及开启停止服务命令

    1.首先进入你的tomcat 的bin目录下 cd /你的安装目录/tomcat/bin 查看服务启动情况 ps -ef|grep java 此条命令具体含义 ps:将某个进程显示出来 -A 显示所有 ...

  7. apache+SSL 搭建https

    简单介绍 一般情况下,我们打开网站默认的是使用明文传输方式,但在日常生活中,当我们在登录或者支付交易时,网站就会自动跳转至SSL(Secure Sockets Layes)加密传输模式,SSL的功能就 ...

  8. es8中对string补白的方式

    //允许将空字符串或其他字符串添加到原始字符串的开头或结尾for(let i = 1; i < 32; i++) { if(i < 10) { console.log(`0{i}`) }e ...

  9. SpringCloud 设置多个运行实例的端口号

    使用SpringCloud做集群,开发.测试阶段,经常要运行一个模块的多个实例,要修改端口号. 有3种方式. 方式一:配置文件 server.port=9001 方式二.修改引导类,控制台输入参数值 ...

  10. Git的基本使用 -- 历史版本、版本回退

    查看提交的日志(历史版本) git log 不能查看已删除的commit记录 git reflog 可以查看所有分支的所有操作记录,包括已删除的commit记录 版本回退 git reset --ha ...