有人说, 你应该关注时事, 财经, 甚至流行的电影, 电视剧, 才有可能趁着热点写出爆文; 有人说, 你别再写 "无聊" 的技术文了, 因为程序员的圈子真的很小, 即便是像鸿祥那样的招牌大牛, 文章是那么的干货, 浏览量有多少? 不到万吧; 有人说, 你别妄想在写作上面知识变现了, 因为你写的文章真的很不优秀, 我都不爱看!
我想说, 你们说的话我都不爱听! 我也懒得反驳, 因为我没有成功, 也就没有话语权, 多说无益. 我只想做一名执拗的程序员, 静静地写文, 哪怕只有一个读者 -- 有时候, 做一件事, 并不是想要结果, 仅仅只是因为心底那种狂热的喜欢.
今天, 我打算聊聊 Java 编程中的初始化.
01, 使用构造器来确保对象初始化
在 Java 编程中, 无论是对象, 还是基本类型, 都不允许在未经初始化的情况下使用它们; 否则, Java 编译器就会热情地提醒你 -- 请初始化后再使用.
那, Java 是通过什么机制来确保对象初始化呢?
答案就是 "构造器"-- 类的对象要被正确的初始化, 就必须先过构造器这一关.
程序清单 1-1: 一个带有构造器的简单类
- class Writer {
- public Writer() {
- System.out.println("我是一名写作爱好者");
- }
- public static void main(String[] args) {
- new Writer();
- }
- }
当使用关键字 new 来创建一个对象 Writer 时, 就会调用构造器 (与类名 Writer 相同的方法 Writer()) 进行初始化, 因此上述程序就会输出 "我是一名写作爱好者".
构造方法 Writer()没有参数, 因此被称为无参构造器; 事实上, 无参构造器是可以省略的 -- 编译器会自动创建一个无参构造器, 被称为 "默认构造器"(Java 设计者真的无比明智啊 -- 帮助程序员省去了创建默认构造器的麻烦).
程序清单 1-2: 默认构造器
- class Writer {
- public static void main(String[] args) {
- new Writer();
- }
- }
默认构造器并不会一直 "默认" 存在, 如果已经定义了一个构造器, 无论有参还是无参, 编译器将不再自动创建默认构造器.
程序清单 1-3: 不会一直存在的默认构造器
- class Writer {
- public Writer(String name) {
- System.out.println(name + "是一名写作爱好者");
- }
- public static void main(String[] args) {
- new Writer();
- new Writer("沉默王二");
- }
- }
一旦定义了一个有参构造器, 那么在创建对象的时候就必须传递构造器需要的参数, 否则编译器会提示 "The constructor Writer() is undefined"(使用 new Writer()创建对象对)-- 这样做的好处就是, 确保对象在初始化的时候符合类设计的初衷(上例中, Writer 需要指定作者姓名, 所以你在创建 Writer 对象时不能不传递作者姓名).
02, 参差不齐乃幸福本源
读王小波的《沉默的大多数》, 我喜欢上了一句话:"参差不齐乃幸福本源". 王小波的意思可能是想说: 一个能容忍不同观点与不同的生活方式的社会, 才是一个幸福的社会. 那么, 在 Java 的世界里, 也有一个幸福的社会.
由于构造器的特殊性(不能与其他成员方法的名字冲突), 导致构造器的名字必须和类名保持一致, 也就是说, 一个类, 只能有一个构造器名. 这似乎局限了构造器的使用方式. 但其实不然, Java 允许方法重载 -- 可以只有一个方法名, 但方法的参数列表可不尽相同; 哎, 问题就这么巧妙的解决了.
程序清单 2-1: 构造方法的重载
- class Writer {
- private String name;
- private String bookName;
- public Writer(String name) {
- this.name = name;
- System.out.println(name + "是一名写作爱好者");
- }
- public Writer(String name, String bookName) {
- this.name = name;
- this.bookName = bookName;
- System.out.println(name + "不仅是一名写作爱好者, 还出版了书籍" + bookName);
- }
- public static void main(String[] args) {
- new Writer("沉默王二");
- new Writer("沉默王三", "《web 全栈开发进阶之路》");
- }
- }
你看, 沉默王二没出版书籍, 可以是一名写作爱好者; 沉默王三虽然出版了书籍《Web 全栈开发进阶之路》, 但仍然和王二是好兄弟, 并没有看不起王二(从来没说过:"王二, 你个渣渣, 连本书都没有出版, 好意思说自己是写作爱好者?"). 是不是很和谐?
Java 该如何区分重载方法 (毕竟参数名相同) 呢? 上例中, 你也看到了, 参数个数的不同就可以区分; 另外, 参数的类型和顺序 (不建议使用, 因为这样做会让代码难以维护, 见下例) 也可以用来作为区分的条件.
程序清单 2-2: 难以维护的方法重载(靠顺序, 别这样!)
- class Writer {
- private String name;
- private int age;
- public Writer(String name, int age) {
- this.name = name;
- this.age = age;
- }
- public Writer(int age, String name) {
- this.age = age;
- this.name = name;
- }
- }
03, 返回当前对象引用的 this 关键字
在很长一段时间里, 我对 this 关键字都避而不见, 因为我搞不懂它到底在干嘛, 我所使用它的场合仅限于程序清单 2-1(this.name 指的是类的成员变量, 而 name 指的是当前方法的参数). 直到我遇见了 jQuery(一个快速, 简洁的 JavaScript 框架)的链式调用.
程序清单 3-1:jQuery 的链式调用
- $("#canvas").append("我是一块抹布")
- .show();
方法后面还能再紧跟一个方法, 就好像一个胯下运球再接一个后仰跳投, 超自然超连贯超燃的一连串动作, 令人心情感到愉悦. 这背后是什么原理呢?
程序清单 3-2:jQuery 的链式调用的背后
- var MyJQ = function(){
- }
- MyJQ.prototype = {
- append : function(content){
- console.log("添加内容");
- return this;
- },
- show : function(){
- console.log("将元素显示");
- return this;
- }
- };
- var myjq = new MyJQ();
- myjq.append("我是一块抹布").show();
看完程序清单 3-2 之后, 你就会恍然大悟, 原来方法的内部返回了一个 this, 而这个 this 就是当前对象的引用; 也就是说, myjq.append("我是一块抹布").show(); 就相当于: myjq.append("我是一块抹布");myjq.show();.
理解了 jQuery 的链式调用, 我们来模拟一下 Java 当中的链式调用(写作者做完运动后去睡觉).
程序清单 3-3:Java 的链式调用
- class Writer {
- public Writer sleep() {
- System.out.println("睡一觉");
- return this;
- }
- public Writer ml() {
- System.out.println("做运动");
- return this;
- }
- public static void main(String[] args) {
- new Writer().ml().sleep();
- }
- }
04, 理想国中的 Java 垃圾回收
对象要想被正确使用, 必须先被初始化, 这是一切的开端; 那么, 当对象不再被使用后, 它就需要被清理掉, 要善始善终. 假如你遇到一个面试官, 他要 "强行" 问你关于 Java 垃圾回收的一些问题, 你可以提前做好下面这些准备.
Q: 为什么要进行垃圾回收?
A: 如果不进行垃圾回收, 内存迟早都会被消耗空. 除非内存无限大, 我们可以任性的分配而不回收, 但是事实并非如此. 所以, 垃圾回收是必须的.
Q: 哪些内存需要回收?
A: 所谓 "要回收的垃圾" 无非就是那些不可能再被任何途径使用的对象.
Q:Java 是如何回收垃圾的?
A: 深入理解 Java 垃圾回收机制
不过, 在我的印象里, 有一副爆笑的动态图令我印象深刻, 它隐喻的是 Java 的垃圾回收机制.
[写在最后]
喜欢就推荐分享, 因为你的参与让我在写作的道路上不再感到孤单.
来源: https://www.cnblogs.com/qing-gee/p/10005401.html