<Java编程那些事>读书笔记

  1. 解释程序就是运行环境一句一句的读取源代码,然后执行。翻译程序,就是讲源代码一次翻译成计算机系统可以直接执行的机器指令的文件。
  2. Java采用的是先编译、再解释的执行方式。也就是先把Java语言的源代码编译成中间代码class文件,然后再运行时根据class文件的内容解释执行。
  3. 自动类型转换:byteàshort(char)àintàlongàfloat-àdouble
  4. 短路现象,对于&来说,如果左侧条件为false,也会计算右侧条件的值,而对于&&来说,如果左侧的条件为false,则不计算右侧的条件。这种现象称作短路现象。
  5. Instanceof作用是判断对象是否为某个类或接口类型
  6. Switch表达式的类型只能为byte、short、char和int这4种之一
  7. Break语句是结束循环语句的执行
  8. Continue语句只能使用在循环语句内部,功能是跳过该次循环,继续下一次循环结构。
  9. 最大公约数:从两个思路中最小的数字开始循环,每次减一
  10. 在Java语言中,初始化数组时,必须指定数组的长度,而且一旦指定,长度就不能改变,除非再重新初始化该数组
  11. 如果方法的返回值不是void,则可以使用return返回结果的值,要求结果值的类型和方法声明时返回值类型必须一致。如果返回值类型是void时,可以使用return语句实现方法返回,而不需要返回值。当代码执行到return语句时,方法结束。如果返回值类型不是void时,需要保证有值返回。
  12. 当遇到方法调用时,程序的执行流程将跳转到被调用的方法内部,直到被调用的方法返回时,才从调用的位置继续向下执行。
  13. 方法相同指方法名称和参数列表都相同,其中参数列表相同指参数个数、参数类型和参数排列顺序等相同,参数名称可以不相同。相同的方法访问控制符、返回值类型可以不相同。在同一个类内部,不能声明相同的方法,否则将出现语法错误
  14. 方法重载(overload)指在一个类内部出现了多个方法名相同,但是参数列表不同的方法。重载的方法都是不相同的方法
  15. 按值传递(by value)指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的是拷贝出来的值,而原始的值不发生改变。说明:使用该方式传递的参数,参数原始的值不发生改变。
  16. 按址传递(by address)指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。
  17. 按值传递的数据类型:八种基本数据类型和String
  18. 按址传递的数据类型:除String以外的所有符合数据类型,包括数组、类和接口
  19. 面向对象的设计方式采用的是从外到内的设计方式,先设计整个项目的结构,然后根据关联关注内部的每个细节。
  20. 类是Java语言的最小编程单位,类是一组事物共有特征和功能的描述。
  21. 构造方法的给你:实现类这种数据类型的变量的初始化。
  22. 一个类内部的构造方法可以有任意多个,但是要求这些构造方法不能相同。如果一个类声明中不包含构造方法的声明,则系统会自动为该类添加一个构造方法,
  23. 对象相关的语法包含四个部分:对象的声明、对象的初始化、引用对象中的属性和引用对象中的方法
  24. 栈内存:该区域存储基本数据类型;堆内存:存储实际的对象内容
  25. 对象的存储分为两部分:对象的内容、对象内容的起始地址。
  26. 面向对象三大特性:封装、继承和多态
  27. 封装性是指在实际实现时,将复杂的内部结构隐藏起来,并为这组复杂的结构取一个统一的名称进行使用。
  28. 继承性,子类拥有父类的所有属性,在父类中声明的属性在子类内部可以直接调用。说明:如果有访问控制符限制则无法访问。子类拥有父类的所有方法,在父类中声明的方法在子类内部可以直接调用。说明:如果有访问控制符限制则无法访问。
  29. 子类不拥有父类的构造方法,子类类型是父类类型:子类类型的对象可以自动转换为父类类型的对象,父类类型的对象则需要强制转换为子类的对象。
  30. 方法覆盖(override),在子类内部重写父类中的语法现象。在使用子类的对象时,子类内部的方法将覆盖从父类继承过来的方法,也就是说子类的对象调用的是子类的功能方法,而不是父类的方法。
  31. 在进行方法覆盖时,子类内部的方法和父类的方法声明相同。而且子类方法的限制不能比父类的方法严格。
  32. 对象类型的多态是指声明对象的类型不是对象的真正类型,而对象的真正类型由创建对象时调用的构造方法进行决定。例外,按照继承性的说明,子类的对象也是父类类型的对象,可以进行直接赋值。
  33. 在存储一系列不同子类的对象时,可以使用父类的结构来进行声明
  34. 对象方法的多态基于方法的覆盖,也就是该对象调用的方法具体是子类的方法还是父类的方法,由创建对象时使用构造方法决定,而不是由声明对象时声明的类型决定。
  35. Protected修饰的内容可以被同一个包中的类访问也可以在不同包内部的子类中访问,一般用于修饰只开放给子类的属性、方法和构造方法。Private限制最大,使用private修饰的内容只能在当前类中访问,而不能被类外部的任何内容访问,一般修饰不开放给外部使用的内容。
  36. 静态变量:static修饰的变量称作静态变量。一个类在加载到内存时,静态变量只初始化一次。也就是说所有对象的静态变量在内存中都只由一个存储位置,每个对象中的静态变量都指向内存中的同一个地址,它是在所有的对象之间共享的数据。
  37. 非静态变量在每个对象中都需要单独的存储空间,不同对象间,这些值之间没有任何关系,每个对象中非静态变量是隶属于与对象,每个对象中可能是不同的。
  38. Static关键字不能修饰成员方法或构造方法内部的变量。
  39. Static修饰的方法称作静态方法。静态方法内部职能使用静态的成员变量
  40. 静态代码块指位于类声明的内部,方法和构造方法的外部,使用static修饰的代码块。静态代码块在该类第一次被 使用时执行一次,以后再也不执行。
  41. Final修饰的数据是常量,在程序中常量只能赋值一次。
  42. Final方法不能被覆盖,也就是不能在子类的内部重写该方法。
  43. Final类不能被继承,也就是该类不能有子类。
  44. This关键字代表自身:使用this关键字引用成员变量;使用this关键字在自身构造方法内部引用其它构造方法;使用this关键字代表自身类的对象;使用this关键字引用成员方法
  45. Super可以在子类中引用父类中的内容:在子类的构造方法内部引用父类的构造方法;在子类中调用父类的成员方法;在子类中调用父类中的成员变量
  46. 抽象类是指使用abstract关键字修饰的类,其他未使用abstract修饰的类称作实体类。抽象方法是指使用abstract修饰的方法。
  47. 抽象类不能使用自身的构造方法创建对象,但抽象类可以声明对象,只是声明出的对象默认都是null,没法调用其内部的非静态属性和非静态方法。抽象类可以使用子类的构造方法创建对象。
  48. 抽象类内部可以包含任意个(0个,1个或多个)抽象方法,实体类内部不能包含抽象方法。在抽象类内部,可以和实体类一样,包含构造方法、属性和实体方法,这点和一般的类一样。
  49. 抽象方法没有方法体,在声明抽象方法时,不能书写方法体的{},而只能以分号结束方法。
  50. 抽象方法所在的类必须为抽象类。在继承时,如果继承的类是抽象类,而该抽象类还包含抽象方法,则该子类必须声明成抽象类。如果子类需要做成实体类的话,则必须覆盖继承的所有抽象方法(强制子类覆盖某些方法)
  51. 抽象类的主要用途:1.严禁直接创建该类的对象;2.强制子类覆盖抽象方法
  52. 在接口中,只能书写:1.常量数据,所有的常量数据都是public static的。2.抽象方法,接口中的所有方法都只在逻辑上规定该方法的作用,而不能书写方法体。所有接口中的方法都是public abstract的。
  53. 接口可以继承其他接口,使用extends关键字进行继承,多个接口名之间使用逗号进行分隔。和类的继承一样,子接口继承父接口中所有的常量数据和方法,子接口的对象也是父接口的对象,和抽象类一样,接口只能声明对象,而不能创建对象。
  54. 如果子类不实现(覆盖)父接口中的方法,则该类必须声明为抽象类
  55. 抽象类是类,而接口是接口:抽象类内部可以包含的内容(构造方法、方法和属性等)在抽象类内部都可以存在,当然抽象类也受到类的单虫继承的限制。接口内部只能包含常量属性和抽象方法。
  56. 抽象类内部可以包含实体方法,而接口不能,接口内部的每个方法都必须是抽象方法
  57. 抽象类可以继承类,而接口不能。
  58. 抽象类和接口都可以声明对象,但是都只能使用子类的构造方法进行创建。
  59. 抽象类和接口内部都可以包含抽象方法
  60. Object类是所有类的子类。Equals方法实现的功能是判断两个对象的内容是否相同。Hashcode方法的作用是获得一个数值,该数值一般被称作散列码,使用这个数值可以快速判断两个对象是否相同,主要用于集合框架中类的快速判断。两个内容相同的对象,其hashcode方法返回值必须相同,而两个不相同的对象其hashcode的值可能相同。
  61. Clone方法,复制对象。也就是创建一个和该对象的内容完全一样的对象,新的对象拥有独立的内存空间。
  62. getClass方法:主要获得对象的类型,该方法主要用于反射技术的实现。
  63. String和StringBuffer,一般把String看成不可变字符,而把StringBuffer看成可变字符,对String的每次改变(例如字符串连接等)都会生成一个新的字符串,比较浪费内存。而StringBuffer每次都改变自身,不生成新的对象,比较节约内存
  64. String s = new String(“abc”);实际创建了两个String对象,一个”abc”对象,存储在常量空间中,一个是使用new关键字为对象s申请的空间。
  65. Equals判断两个字符串对象的内容是否相同,如果相同则返回true。==比较的是两个对象存储的地址是一样的。String s = “abc”; String s1 = new String(“abc”); s.equals(s1)返回true;s==s1返回false,因为s对象的地址是”abc”的地址,s1使用new关键字申请新的内存,所有内存地址和s的不一样。
  66. StringBuffer和String属于不同的类型,也不能直接进行强制类型转换。StringBuffer sb = new StringBuffer(“abc”)
  67. StringBuffer和String对象之间相互转换的代码:String s = “abc”; StringBuffer sb = new StringBuffer(“123”);Stringbuffer sb2 = new StringBuffer(s); String s1 = sb.toString();
  68. 包装类的作用:作为和基本数据类型对应的类类型存在,方便涉及到对象的操作
  69. List系列,该系列中的类按照索引值来操作数据,允许存放重复的元素
  70. Set系列,该系列中的类按照索引值来操作数据,不允许存放重复的数据
  71. Map系列,该系列中的类按照名称来操作数据,名称不允许重复,值可以重复,一个名称对应一个唯一的值。
  72. ArrayList是以数组为基础实现的List,而LinkedList则是以链表为基础实训的List。
  73. Error类代表错误,指程序无法恢复的异常情况;Exception类代表异常,指程序有可能恢复的异常情况;
  74. 当程序运行时,如果发现异常的情况,通过生成对应的异常对象,并将该异常对象传递给Java的运行时系统,使得系统中包含该异常信息,这样的过程称作抛出异常。Throw 异常对象。该代码书写在方法或构造方法的内部,该语法中,使用throw关键字,后续为代表对应异常情况的异常类类型的对象,当系统执行到该代码时,将终止当前方法的执行,而直接返回到调用该方法的位置。所以在该代码下面不能直接书写其它的代码,因这些代码将永远无法执行到。
  75. 当一个方法在执行时,除了能够完成正常的功能以外,还可以出现一些异常情况,为了提醒调用该方法的程序员注意这些异常情况,需要在方法的声明中将这些异常声明出来,这就是声明异常。Trows 异常类名。该语法使用在方法和构造方法的声明以后,在throws关键字以后,书写该方法或构造方法可能出现的异常。这些异常必须是该方法内部可能抛出的异常,属于RuntimeException子类的异常可以不书写在throws语句以后,但是另外一类异常如果可能抛出则必须声明在throws语句之后。
  76. 程序执行到try-catch语句时,如果没有发生异常,则完整执行try语句块内部的所有代码,而catch语句块内部的代码不会执行;如果在执行时发生异常,则从发生异常的代码开始,后续的try语句代码块不会执行,而跳转到该类型的异常对应的catch语句块中。
  77. 如果异常类存在继承关系,则子类应该书写在上面,父类应该书写在下面。
  78. 语法保证finally语句块内部的代码肯定获得执行,即使在try或catch语句块中包含return语句也会获得执行
  79. 进程(process)指操作系统中一个独立运行的程序。线程(Thread)指同一个程序(进程)内部每个单独执行的流程。
  80. 线程生命周期包括如下阶段:1. 新建状态(New),该状态指线程已经初始化完成,但是还没有启动。2. 运行状态(Run),指线程的正常执行状态,处于该状态的线程在CPU内部执行程序,也就是线程正常运行时的状态。3. 阻塞状态(Block),指线程处于执行状态,但是由于没有获得CPU的执行时间,而处于CPU外部等待线程执行的状态。4. 死亡状态(Dead),指线程执行结束,释放线程占用的系统资源,结束线程执行的状态。
  81. 继承Thread类,线程的代码必须书写在run方法内部或者在run方法内部进行调用
  82. 实现Runnable接口,实现该接口需要覆盖run方法,然后将需要以多线程执行的代码书写在run方法内部或在run方法内部进行调用
  83. 死锁指两个或两个以上的线程为了使用某个临界资源而无限制的等待下去
原文地址:https://www.cnblogs.com/bluescorpio/p/2630780.html