今天要分享的是关于《Head First Java》
这本书的读后感,这本书有点小厚差很少有七百页左右,因此我花了几乎整个国庆的时间去阅读,学习。读完以后发现,受益颇多。正如书名所说的,它是一本重视大脑的学习指南。不管你是Java
开发工程师,仍是android
开发工程师,这本书都是良师益友。下面让咱们一块儿看看,我会以零碎的列表方式呈现,并以通俗的方式讲解那些你迷糊不清的细节?java
[1]
不管你的程序有多大(也能够说无论有多少个类),必定都会有一个main()
来做为程序的起点。[2]
System.out.print
与System.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]
封装的基本原则:将你的实例变量标记为私有的,并提供公用的getter
与setter
来控制存取动做。封装的意义:能够保护你的对象状态不会随意的被乱修改,若是要修改你的对象的状态,他必需要调用你的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
会把程序变大吗?编译过程会把包或类包进去吗?答案:import
与C
的include
并不相同。运用import
只是帮你省下每一个类前面的包名称而已。程序不会由于用了import
而变大或变慢。[20]
为什么我没必要import
进String
类或System
类?答案:要记得java.lang
是个预先被引用的包。由于java.lang
是个常常会用到的基础包,因此你能够没必要制定名称。java.lang.String
与java.lang.System
是独一无二的class
,Java
会知道要去哪里找。[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]
接口能够用来解决多重继承的问题,却又不会产生致命方块这种问题,由于它根本就没有实现,因此木有关系。android
听说每一个人在必定时间内接受的信息量都是有限的,由于信息量有点大,毕竟七百页的好书,因此我准备写续集啦,但愿你们带着思考的心态去理解阅读,我相信,对你们绝对有好处的。续集将陆陆续续的推出,敬请期待。?程序员