前言-
本文是为个人学习做的整理性质的笔记,肯定带有许多不妥的地方,仅供参考。
(第五章·初始化与清理 《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"; } }
方法重载:
大多数程序设计语言里(尤其是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); } }
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!"); } }
额外内容:重载,重构与重写(三重)
重构:通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理。提高软件的扩展性和维护性。通俗点说,重构就是当你发现代码的不足之处时,去改动它的结构,去优化它。
- 重构的具体做法:可以通过重写或者重载等,但不限于此,更改注释、更改函数名类名等,都可以称之为重构;
- 重构的目的 :是为了让软件容易维护, 修改其Bug等。
重写:子类通过@override来实现方法重写。在父类里声明了一个模糊的方法,并不给出详细的行为,在子类里,通过重写父类(同方法名,參数,返回值等)中的这种方法,让这种方法实例化,去适合子类。
- override(Overwrite):是子类覆盖基类的方法。
- 重写的特点:
1、必须是在继承里,
2、方法名、返回值类型、参数个数和参数类型 都必须相同
3、派生类重写的方法的访问权限不能低于基类的权限
4、派生类抛出的异常应该和基类相等或比基类更小
重载:是通过方法的参数识别不同的函数 。比如你有一个AMethod()不带参数,然后你用了一个另外相同名称的方法,带一个参数AMethod(String para), 这个过程就叫做重载。
重写与重载的区别:
1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常。
总结:
重写:是对方法本身重新编写。
重载:函数名相同 参数个数不同。
重构:重写算是重构的一部分,但重构还包括对程序结构的优化。
※重构居然会出现在软件工程的卷纸上,给我整蒙了,今天看到重载,联想到她,特此记录。
参考链接:1.重写、重构、重载区别
2.java中,重构、重载、重写