3

前言:

今天要分享的是关于《Head First Java》这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇多。正如书名所说的,它是一本重视大脑的学习指南。无论你是Java开发工程师,还是android开发工程师,这本书都是良师益友。下面让我们一起看看,我会以零碎的列表方式呈现,并以通俗的方式讲解那些你迷糊不清的细节?

正文:

[1]无论你的程序有多大(也可以说不管有多少个类),一定都会有一个main()来作为程序的起点。
[2] System.out.printSystem.out.printIn的区别,很多人其实一直没注意,快捷键用习惯了吧,?。都是在控制台打印结果,区别就是:前者打印后不换行,后者(带In的)打印后自动会换行。
[3]写代码如果你老是只会写一个个不相关类组合在一起,来完成功能,也许你会缺失设计的灵性,有种设计手法叫“继承“大家都知道,子类会继承父类的方法,也就是说,子类会自动获取父类的功能(提高了类的重用性)注:当父类被final修饰的时候,它无法当爹,它是无法被继承的(为什么要用这个来修饰类,为了保持类的严谨性,避免被篡改,使用的场景:String类就是最好的例子)。当父类的方法被final修饰的时候,它是可以被子类继承使用,但是请注意你是无法重写(Override) 该方法。
[4]类跟对象的关系:类不是对象,却是用来创建对象的模型,也可以说类是对象的蓝图。对象是已知的事物,对象会执行的动作。对象本身已知的事物被称为:实例变量(instance variable)俗称属性。对象可以执行的动作称为:方法(methods)。
[5]真正的面向对象的Java应用程序只会让对象与对象交互,所以请多多以对象的角度考虑问题,编码。
[6]变量根据作用域分为:全局变量,局部变量。根据类型分类:primitive主数据类型和引用。主数据类型主要有:boolean char byte short int long float double。注:编译器不允许将大杯的内容放到小杯中,但是反过来可以。
[7]关于引用我觉得有必要拿出来特别讲讲:如Dog d = new Dog();事实上没有对象变量这样的东西存在,只有引用(reference)到对象的变量,对象引用变量保存的是存取对象的方法,它并不是对象的容器,而是类似指向对象的指针(你可以这么理解,它就是这个对象的遥控器,而不是这个对象本身)。
[8]无论被声明来承载的是primitive主数据类型或对象引用,数组永远都是对象。
[9]对象有状态和行为两种属性,状态影响行为,行为影响状态。大家可以好好理解这句话。
[10]在声明方法的时候,方法的参数叫做形参,如:void bark(int numOfBarks),numOfBarks就是形参。当我们调用方法的时候我们会传入实参,:Dog d = new Dog();d.bark(3);,这里的3就是实参。注:对于传入的实参如果是主数据类型的时候,无论方法内部执行什么,都不会改变这个实参,传入的时候的值。但是传入的实参如果是引用的时候,就会改变这个对象,特别注意引用是这个对象的遥控器,当然可以改掉这个对象的东西。
[11]方法有声明返回的类型,void这代表没有返回任何东西,其他的声明类型的话,说好了要返回,就是要返回相应的数据结果。
[12]传入与传出方法的值类型可以隐含地放大或是明确地缩小。这句话大家也好好思考一下哈。
[13]封装的基本原则:将你的实例变量标记为私有的,并提供公用的gettersetter来控制存取动作。封装的意义:可以保护你的对象状态不会随意的被乱修改,如果要修改你的对象的状态,他必须要调用你的setter方法,在这个setter方法中,你可以添加你想要的数据要求约束条件,来保证你的状态的修改值是合法。
[14]实例变量与局部变量之间的差别:实例变量可以不用初始化就有默认值,局部变量没有默认值!如果在变量被初始化前就要使用的话,编译器会显示错误!
[15] ==equals()的区别:哈哈这也是老问题了,使用==来比较primitive主数据类型,或者判断两个引用是否引用同一个对象。使用equals()来判断两个对象是否在意义上相等。(什么?不好懂?通常的用法就是如果比较字符串就用equals,如果比较数字是不是相等就用==。?)
[16]我们在设计编写类的时候,最好遵循下面的顺序:找出类应该做的事情,列出实例变量和方法,编写方法的伪码,编写方法的测试用程序,实现类,测试方法,除错或重新设计,完成。也就是三个大步骤:伪码,测试码,真实码。
[17]关于for循环分为两种:第一种基本(非加强版)的for循环,如:for(int i=0;i<100;i++){};第二种(加强版)的for循环,如:for(String name :nameArray){};注:请多写写不一样的好代码,切莫一个挫代码能用就行的心态,到处写,这会让你的技术停留不前。
[18]关于Java API的小常识:以javax开头的包就会知道他以前曾经是扩展。API是程序员的得力帮手,好工具,所以要善于查询API并熟练的掌握,会让你编码更从容,优雅。大家可以上java.sun.com的网址里面去在线查找API,也可以下载离线到本地。
[19]使用import会把程序变大吗?编译过程会把包或类包进去吗?答案:importCinclude并不相同。运用import只是帮你省下每个类前面的包名称而已。程序不会因为用了import而变大或变慢。
[20]为何我不必importString类或System类?答案:要记得java.lang是个预先被引用的包。因为java.lang是个经常会用到的基础包,所以你可以不必制定名称。java.lang.Stringjava.lang.System是独一无二的classJava会知道要去哪里找。
[21]继承父类,并覆盖(Override)方法后,可以让子类更好的扩展从父类继承下来的功能,如:public void roam(){super .roam();//your code},注意super的作用,它可以让你在父类的方法上,加上额外的行为,这是非常重要的一种写法!一定要学会使用。
[22]继承的意义:避免了重复的程序代码,定义出共同的协议。是多态的一种手法,如:Animal myDog = new Dog();方法的参数跟返回结果都可以使用这种多态的手法,可以大大的提高你的方法的扩展性。
[23]覆盖的原则:参数必须要一样,且返回类型必须要兼容,不能降低方法的存取权限。
[24]还有一种方法叫重载(overload),重载的规则:返回类型可以不同,不能只改变返回类型,可以更改存取权限。注:重载跟多态毫无关系,重载的使用情景在本类中,重写的使用情景在继承的时候体现。
[25]接口是一种100%纯抽象的类,它是多态java的重点。
[26]抽象类的声明方法:在类的声明前面加上抽象类关键词abstract就好,如:abstract class Animal{public void roam()};大家想一想为什么要设计出抽象类,原因就在于:像Animal这样的对象太抽象,不应该被实例化出来,编译器不会让你初始化出现类,如果你要想使用它,那就继承它吧?。
[27]抽象的类代表此类必须要extend过,抽象的方法代表此方法一定要被覆盖过。如果你声明出一个抽象的方法,就必须将类也标记为抽象的。你不能在非抽象类中拥有抽象方法。注:子类也可以不用实现抽象方法,?,只要你把子类也声明为抽象类,让后让你子类去继承你,让它去实现这个抽象方法,这个机制叫抽象机制,将实现的负担转给下层。这个手法很重要。
[28]就算你不知道,但实际上所有的类都是从对象给继承出来的,没有直接继承过其他类的类会是隐含的继承对象。
[29]使用Object类型的多态引用是会付出代价的,因为Object实在是辨识度太低,很多时候都要必须强制转换类型才能用,很不方便。而且最重要的一点就是:就算你知道对象有这个功能,编译器还是会把它当作一般的Object来看待。编译器只管引用的类型,而不是对象的类型。注:(不好懂?哈哈,如:Object o = al.get(index);o.bark();//这个o其实是一个Dog类型的对象,有bark()的方法,但是因为是编译器只知道他现在是Object类型,这个类型是没有该方法的,所以编译器不会通过编译,懂了吧?)。
[30]当你在不知道是不是可以把Object o对象转化成Dog类型,怎么办?简单:if(o instanceof Dog){Dog d = (Dog) o;}
[31] Java为什么不支持多重继承,因为会导致“致命方块”,什么是“致命方块”,举个例子:当你继承两个父类的时候,恰巧两个父类有一样方法,但是里面的实现却不一样,你说做儿子的怎么知道我会继承那个方法,?,这就是问题,编译器也不知道,所以这就是不支持多重继承的原因。
[32]接口可以用来解决多重继承的问题,却又不会产生致命方块这种问题,因为它根本就没有实现,所以木有关系。

总结:

据说每个人在一定时间内接受的信息量都是有限的,因为信息量有点大,毕竟七百页的好书,所以我准备写续集啦,希望大家带着思考的心态去理解阅读,我相信,对大家绝对有好处的。续集将陆陆续续的推出,敬请期待。?


heartFollower
467 声望39 粉丝