美文网首页Java服务器端编程
要想学好Java编程,构造器、方法重载、this关键字、垃圾回收

要想学好Java编程,构造器、方法重载、this关键字、垃圾回收

作者: fad2aa506f5e | 来源:发表于2018-11-23 14:42 被阅读2次

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

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

    今天,我打算聊聊Java编程中的初始化。

    01、使用构造器来确保对象初始化

    在Java编程中,无论是对象,还是基本类型,都不允许在未经初始化的情况下使用它们;否则,Java编译器就会热情地提醒你——请初始化后再使用。

    那,Java是通过什么机制来确保对象初始化呢?

    答案就是“构造器”——类的对象要被正确的初始化,就必须先过构造器这一关。

    程序清单1-1:一个带有构造器的简单类

    classWriter {

    publicWriter() {

    System.out.println("我是一名写作爱好者");

    }

    publicstaticvoidmain(String[] args) {

    new Writer();

    }

    }

    当使用关键字new来创建一个对象Writer时,就会调用构造器(与类名Writer相同的方法Writer())进行初始化,因此上述程序就会输出“我是一名写作爱好者”。

    构造方法Writer()没有参数,因此被称为无参构造器;事实上,无参构造器是可以省略的——编译器会自动创建一个无参构造器,被称为“默认构造器”(Java设计者真的无比明智啊——帮助程序员省去了创建默认构造器的麻烦)。

    程序清单1-2:默认构造器

    classWriter {

    publicstaticvoidmain(String[] args) {

    new Writer();

    }

    }

    默认构造器并不会一直“默认”存在,如果已经定义了一个构造器,无论有参还是无参,编译器将不再自动创建默认构造器。

    程序清单1-3:不会一直存在的默认构造器

    classWriter {

    publicWriter(String name) {

    System.out.println(name +"是一名写作爱好者");

    }

    publicstaticvoidmain(String[] args) {

    new Writer();

    new Writer("沉默王二");

    }

    }

    一旦定义了一个有参构造器,那么在创建对象的时候就必须传递构造器需要的参数,否则编译器会提示“The constructor Writer() is undefined”(使用new Writer()创建对象对)——这样做的好处就是,确保对象在初始化的时候符合类设计的初衷(上例中,Writer需要指定作者姓名,所以你在创建Writer对象时不能不传递作者姓名)。

    02、参差不齐乃幸福本源

    读王小波的《沉默的大多数》,我喜欢上了一句话:“参差不齐乃幸福本源”。王小波的意思可能是想说:一个能容忍不同观点与不同的生活方式的社会,才是一个幸福的社会。那么,在Java的世界里,也有一个幸福的社会。

    由于构造器的特殊性(不能与其他成员方法的名字冲突),导致构造器的名字必须和类名保持一致,也就是说,一个类,只能有一个构造器名。这似乎局限了构造器的使用方式。但其实不然,Java允许方法重载——可以只有一个方法名,但方法的参数列表可不尽相同;哎,问题就这么巧妙的解决了。

    程序清单2-1:构造方法的重载

    classWriter {

    private String name;

    private String bookName;

    publicWriter(String name) {

    this.name = name;

    System.out.println(name +"是一名写作爱好者");

    }

    publicWriter(String name, String bookName) {

    this.name = name;

    this.bookName = bookName;

    System.out.println(name +"不仅是一名写作爱好者,还出版了书籍" + bookName);

    }

    publicstaticvoidmain(String[] args) {

    new Writer("沉默王二");

    new Writer("沉默王三","《Web全栈开发进阶之路》");

    }

    }

    你看,沉默王二没出版书籍,可以是一名写作爱好者;沉默王三虽然出版了书籍《Web全栈开发进阶之路》,但仍然和王二是好兄弟,并没有看不起王二(从来没说过:“王二,你个渣渣,连本书都没有出版,好意思说自己是写作爱好者?”)。是不是很和谐?

    Java该如何区分重载方法(毕竟参数名相同)呢?上例中,你也看到了,参数个数的不同就可以区分;另外,参数的类型和顺序(不建议使用,因为这样做会让代码难以维护,见下例)也可以用来作为区分的条件。

    程序清单2-2:难以维护的方法重载(靠顺序,别这样!)

    classWriter {

    private String name;

    privateint age;

    publicWriter(String name,int age) {

    this.name = name;

    this.age = age;

    }

    publicWriter(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("添加内容");

    returnthis;

    },

    show :function(){

    console.log("将元素显示");

    returnthis;

    }

    };

    var myjq =new MyJQ();

    myjq.append("我是一块抹布").show();

    看完程序清单3-2之后,你就会恍然大悟,原来方法的内部返回了一个this,而这个this就是当前对象的引用;也就是说,myjq.append("我是一块抹布").show();就相当于:myjq.append("我是一块抹布");myjq.show();。

    理解了jQuery的链式调用,我们来模拟一下Java当中的链式调用(写作者做完运动后去睡觉)。

    程序清单3-3:Java的链式调用

    classWriter {

    public Writersleep() {

    System.out.println("睡一觉");

    returnthis;

    }

    public Writerml() {

    System.out.println("做运动");

    returnthis;

    }

    publicstaticvoidmain(String[] args) {

    new Writer().ml().sleep();

    }

    }

    04、理想国中的Java垃圾回收

    对象要想被正确使用,必须先被初始化,这是一切的开端;那么,当对象不再被使用后,它就需要被清理掉,要善始善终。假如你遇到一个面试官,他要“强行”问你关于Java垃圾回收的一些问题,你可以提前做好下面这些准备。

    Q:为什么要进行垃圾回收?

    A:如果不进行垃圾回收,内存迟早都会被消耗空。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

    Q:哪些内存需要回收?

    A:所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。

    Q:Java是如何回收垃圾的?

    A:深入理解 Java 垃圾回收机制

    不过,在我的印象里,有一副爆笑的动态图令我印象深刻,它隐喻的是Java的垃圾回收机制。

    【写在最后】

    喜欢就推荐分享,因为你的参与让我在写作的道路上不再感到孤单。

    加Java架构师进阶交流群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。

    性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 

    都是大牛带飞 让你少走很多的弯路的 群号是: 810309655对了 小白勿进 最好是有开发经验 

    注:加群要求

    1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

    2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

    3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

    4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

    5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

    相关文章

      网友评论

        本文标题:要想学好Java编程,构造器、方法重载、this关键字、垃圾回收

        本文链接:https://www.haomeiwen.com/subject/egejqqtx.html