有人说,你应该关注时事、财经,甚至流行的电影、电视剧,才有可能趁着热点写出爆文;有人说,你别再写“无聊”的技术文了,因为程序员的圈子真的很小,即便是像鸿洋那样的招牌大牛,文章是那么的干货,浏览量有多少?不到万吧;有人说,你别妄想在写作上面知识变现了,因为你写的文章真的很不优秀,我都不爱看!

我想说,你们说的话我都不爱听!我也懒得反驳,因为我没有成功,也就没有话语权,多说无益。我只想做一名执拗的程序员,静静地写文,哪怕只有一个读者——有时候,做一件事,并不是想要结果,仅仅只是因为心底那种狂热的喜欢。

今天,我打算聊聊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的垃圾回收机制。

要想学好Java编程,构造器、方法重载、this关键字、垃圾回收机制,这4关一定要过!的更多相关文章

  1. 【转载】Java性能优化之JVM GC(垃圾回收机制)

    文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...

  2. Java内存模型(JMM)以及 垃圾回收机制 小结

    内存模型: 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节,对象最终是存储在内存里面的,这点没有错,但是编译 ...

  3. java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析的属实到位

    前言 JVM 内存模型一共包括三个部分: 堆 ( Java代码可及的 Java堆 和 JVM自身使用的方法区). 栈 ( 服务Java方法的虚拟机栈 和 服务Native方法的本地方法栈 ) 保证程序 ...

  4. Java性能优化之JVM GC(垃圾回收机制)

    Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...

  5. 巩固java(二)----JVM堆内存结构及垃圾回收机制

    前言:        我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构   ...

  6. Javascript高级编程学习笔记(11)—— 垃圾回收机制

    垃圾回收机制 垃圾回收机制,是保证脚本能长时间运行的重要机制 JS具有自动垃圾收集机制,也就是说执行环境会负责管理代码执行过程中使用的内存 与一些偏底层的语言(c.c++)不同,我们不需要手工地去管理 ...

  7. Java虚拟机(三):JVM垃圾回收机制

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...

  8. 浅析 Java 与 C++ 的垃圾回收机制

        Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...

  9. Java 垃圾回收机制方法,判断对象存活算法

    垃圾回收机制: 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回 ...

随机推荐

  1. recyclerview嵌套GridView去屏蔽后者的点击事件,而是前者响应到事件。

    无论是标题中的嵌套方式,还是其它列表控件之间的嵌套,都适用. 1.在GirdView的所在布局的根布局中设置改属性: android:descendantFocusability="blac ...

  2. 基于TensorFlow的手写中文识别(版本一)

    具体效果实现: 第一次由于设备问题所以只训练了是一些个简单的字: 第二选了23个字训练了3000在字迹清晰下能够识别: 类似于默,鼠,鼓,这类文字也能识别,由于训练数据的问题,在测试的时候应尽量写在正 ...

  3. Kafka 安装配置

    1. 下载安装kafka 下载地址:http://apache.fayea.com/kafka/ 解压安装包 tar zxvf kafka_版本号.tgz 2. 配置 修改kafka的config/s ...

  4. sqlzoo:3

    顯示1980年物理學(physics)獲獎者,及1984年化學獎(chemistry)獲得者. select yr,subject,winner from nobel ) ) 查看1980年獲獎者,但 ...

  5. Do-Now—团队冲刺博客三

    Do-Now-团队 冲刺博客三 作者:仇夏 前言 不知不觉我们的项目已经做了三个多礼拜了,团队冲刺博客也写到了这第三篇,看着一个基本成型的APP安装在自己的手机上,一种喜悦感油然而生.好了,现在来看看 ...

  6. vue 源码学习三 vue中如何生成虚拟DOM

    vm._render 生成虚拟dom 我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._ ...

  7. 关于Django字段类型中 blank和null的区别

    blank 设置为True时,字段可以为空.设置为False时,字段是必须填写的.字符型字段CharField和TextField是用空字符串来存储空值的. 如果为True,字段允许为空,默认不允许. ...

  8. python语法_模块_re(正则表达)

    字符串操作方法有: s = 'hello word' s.find('l') 查询第一个l的索引 s.replace('ll','xx') 替换 s.split('w') 以w进行分割 这些都是完全匹 ...

  9. leetcode-比特位计数

    一.题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 ...

  10. 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)

    第10章     RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...