摘要:对象本身已知的事物被称为实例变量俗称属性。对象可以执行的动作称为方法。变量根据作用域分为全局变量,局部变量。对象有状态和行为两种属性,状态影响行为,行为影响状态。
前言:
今天要分享的是关于《Head First Java》这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇多。正如书名所说的,它是一本重视大脑的学习指南。无论你是Java开发工程师,还是android开发工程师,这本书都是良师益友。下面让我们一起看看,我会以零碎的列表方式呈现,并以通俗的方式讲解那些你迷糊不清的细节?
正文:[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]接口可以用来解决多重继承的问题,却又不会产生致命方块这种问题,因为它根本就没有实现,所以木有关系。
据说每个人在一定时间内接受的信息量都是有限的,因为信息量有点大,毕竟七百页的好书,所以我准备写续集啦,希望大家带着思考的心态去理解阅读,我相信,对大家绝对有好处的。续集将陆陆续续的推出,敬请期待。?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64663.html
摘要:一旦线程执行线程会进入可执行状态,它会在可执行与执行中两种状态中来来去去,同时也有另外一种状态暂时不可执行又称为被堵塞状态。当对象有一个或多个同步化的方法时,线程只有在取得对象锁的钥匙时才能进入同步化的方法。 前言: 今天要分享的是关于 《Head First Java》这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇多。...
摘要:局部变量和方法的参数都是被声明在方法中,它们是暂时的,且生命周期只限于方法在放在栈上的这段期间也就是方法调用至执行完毕为止。让一个类不被实例化的方法有两种一种是将类声明称抽象类,第二种是将其构造函数标记为私有的。 前言: 今天要分享的是关于 《Head First Java》这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习。读完之后发现,受益颇...
阅读 3172·2021-09-30 09:48
阅读 3448·2021-09-22 16:00
阅读 1034·2019-08-30 13:08
阅读 3080·2019-08-30 10:53
阅读 2393·2019-08-29 18:33
阅读 1558·2019-08-29 12:47
阅读 856·2019-08-29 12:16
阅读 1911·2019-08-26 12:02