【推荐】【Java核心技术 卷Ⅰ】【笔记】

1,860 阅读11分钟

工欲善其事必先利其器!

再快不能快基础,再烂不能烂语言!

第一章 Java程序设计概述

Java“白皮书”的关键术语

1. 简单性   2. 面向对象     3. 分布式   4. 健壮性

5.安全性    6. 体系结构中立  7. 可移植性    8. 解释性

9. 高性能   10. 多线程      11. 动态性

Java语言的发展状况

版本 年份 语言新特性 类与接口的数量
1.0 1996 语言本身 211
1.1 1997 内部类 477
1.2 1998 strictfp修饰符 1524
1.3 2000 1840
1.4 2002 断言 1524
5.0 2005 泛型类,“for eash”循环,可变元参数,

自动装箱,元数据,枚举,静态导入
3279
6 2006 3793
7 2011 基于字符串的switch,钻石操作符,

二进制字面亮,异常处理改进
4024
8 2014 lambda表达式,包含默认方法的接口,

流和日期/时间库
4240

第2章 Java程序设计环境

  • JDK(Java Development Kit)-编写java程序的程序员使用的软件
  • JRE(Java Runtion Envionment)-运行java程序的用户使用的软件
  • SDK(Software Development Kit)-一个过时的术语,用于描述(1998-2006)之间的JDK
  • SE-用于桌面或简单服务器应用的java平台
  • EE-用于复杂服务器应用的java平台
  • ME-用于手机和其他小型设备的java平台

第3章 Java的基本程序设计结构

3.1 一个简单的Java应用程序

  • Java区分大小写
  • 关键字class表明java程序中的全部内容都包含在类中。类作为一个加载程序逻辑的容器,程序逻辑定义了应用程序的行为。
  • 类名必须是以大写字母开头的名词。如果字母有多个单词组成,每个单词的第一个字母都应该大写(驼峰命名法)。
  • 在类的源文件中必须有一个main方法。
  • 在javaSE1.4及以后的版本中强制main方法是public的。
  • java中的main方法必须是静态的。

3.3 数据类型

  • java是一种强类型的语言,必须为每一个变量声明一种类型。
  • java没有任何无符号的类型。
  • float类型的数值有一个后缀F或f(例如:3.14F)。没有后缀F的浮点数值(例如:3.14)默认为double类型,也可以在浮点数值后面添加后缀D或d(例如:3.14D)。
  • 浮点型数值不适用于无法接受舍入误差的金融计算中,建议使用BigDecimal。
  • 声明一个变量后,必须用赋值语句对变量进行显式初始化。
  • 关键字final表示这个常量只能被赋值一次,一旦被赋值之后,就不能再改了。常量名使用全大写。
  • 可以使用equals方法检测两个字符串是否相等,一定不要用== 检测两个字符串是否相等!这个只能确定两个字符串是否放在同一个位置上(内存地址)。
  • 在jdk5.0中引入StringBuilder类。这个类的前身是StringBuffer,其效率有点低,但允许采用多线程的方式执行添加或删除字符的操作。
  • 每一个以%字符开始的格式说明符都可以用相应的参数替换,其中f表示浮点数,s表示字符串,d表示十进制整数。
  • 块(即复合语句)是指由一对大括号括起来的若干条简单的java语句。块确定类变量的作用域。一个块可以嵌套在另一个块中。
  • 如果在case分支语句中的末尾没有break语句,那么就会接着执行下一个case分支语句。这种情况相当危险,常常会引发错误。
  • BigIntger类实现类任意精度的整数运算,BigDecimal实现了任意任务精度的浮点数运算,静态的valueOf方法可以将普通的数值转换成大数值!
    • add(加)
    • subtract(减)
    • multiply(乘)
    • divide(除)
  • 如果创建了一个100个元素的数组,并且视图访问元素a [ 100 ] (或任何在0~99之外的下标),程序就会引发“array index out of bounds”异常而终止。

第4章

4.1 面向对象程序设计概述

  • 面向对象程序设计(OOP)是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中很多对象来自标准库,还有一些是自定义的。
  • java是完全面向对象的。
    • 类(class)是构造对象的模版或蓝图。

    • 由类构造对象的过程称为创建类的实例。

    • 封装(有时称为数据隐藏): 封装是将数据和行为组合在一个包里,并对对象的使用者隐藏了数据的实现方式。

      实现 封装 的关键在于绝对不能让类中的方法直接地访问其他类的实例域,程序仅通过对象的方法与对象数据进行交互。

    • 对象中的数据称为实例域。

    • 操纵数据的过程称为方法。

    • 对于每个特定类实例(对象)都有一组特别的实例域值。这些值的集合就是这个对象的状态。

    • OOP的另一个原则会让用户自定义java类变得轻而易举:通过扩展一个类来建立另一个新的类。扩展后的新类具有所扩展的类的全部熟悉和方法。扩展一个类的过程称为继承

  • 对象
    • 对象的三个主要特征:
      • 对象的行为: 对象的行为是用可调用的方法定义的。
      • 对象的状态: 描述当前特征的信息。对象的状态必须通过调用方法实现。
      • 对象标识: 每个对象都有一个唯一的身份。 就算是两个数据一摸一样的对象也有不同之处。 作为一个类的实例,每个对象的标识永远是不同的,状态常常也存在着差异。
  • 类之间的关系
    • 依赖(“uses-a”): 如果一个类的方法操作另一个类的对象,我们就说一个类依赖于另一个类。应该尽可能地将相互依赖的类减至最少,也就是低耦合。
    • 聚合(“has-a”): 一个类中包含另一个类的对象。也称为“关联”。
    • 继承(“”is-a): 在一个类的基础上扩展一个新类。

4.2 使用预定义类

  • 对象与对象变量

    java程序设计语言中,使用构造器构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。

    • Date deadline;

      这是一个对象变量,但变量deadline不是一个对象,也没有任何引用。

    • Data day = new Date();

      这是一个对象变量,new操作符的返回值也是一个引用。(new会创建一块存储空间,然后将引用与对象关联)

    • 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。对象变量的值是对存储在另外一个地方的一个对象的引用。

  • java类库中包含两个和时间有关的类:

    • Date类: 表示时间点
    • LocalDate类: 表示日历。
  • 只访问对象而不修改对象的方法有时称为访问器方法。

4.3 用户自定义类

  • 构造器与类同名。在构造对象时,构造器会运行并将实例域初始化。
  • 构造器:
    • 构造器与类同名
    • 每个类可以有一个以上的构造器
    • 构造器可以有0个,1个或多个参数。
    • 构造器没有返回值。
    • 构造器总是伴随着new操作一起调用
    • 构造器中不能定义与实例域重名的局部变量。
    • 所有的java对象都是在堆中创建的。
  • 普通方法中的第一个参数被称为隐式参数,一般是调用方法名前的对象,后面的参数术语显示参数,显示参数是明显的列在方法中声明的。
  • 关键字this表示隐式参数。
  • 需要获得或设置实例域的值,需要提供下面几项内容:
    • 一个私有的数据域;
    • 一个公有的域访问器方法;
    • 一个公有的域更改器方法。
  • 在实现一个类时,由于公有数据非常危险,所以应该将所有的数据域都设置为私有的。实现一个私有的方法,只需将关键字public改为private即可。
  • final修饰符大都用于基本类型域,或不可变类的域(如果类中的每个方法都不会改变其对象,这种类就是不可变的类)

4.4 静态域与静态方法

  • 如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。
  • 静态域属于类,不属于任何独立的对象。
  • 静态方法是不能对对象操作的方法。
  • 静态方法是没有this参数的方法。
  • 以下两种情况下可以使用静态方法:
    • 一个方法不需要访问对象状态,其所需参数都是通过显示参数提供。(如:类名.方法名)
    • 一个方法只需要访问类的静态域。(如:类名.静态域名)
  • main方法也是一个静态方法。

4.5 方法参数

  • java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容。
  • java中方法参数的使用情况
    • 在传参过程中,一个方法不能修改一个基本数据类型的参数。
    • 在传参过程中,一个方法可以改变一个对象参数的状态。
    • 若在方法中,对象参数引用类一个新的对象,那么改变的就是新对象的值。

4.6 对象构造

  • 重载:有些类有多个构造器,这种特征叫做重载。如果多个方法有相同的名字,不同的参数,便产生了重载。通过根据参数的不同匹配对应的方法,这个过程被称为重载解析。
  • java允许重载任何方法,而不只是构造函数。
  • 返回类型不作为重载的区别参照。
  • 若构造器中没有显示地给域赋予初值,那么会自动赋为默认值。对象引用为null。
  • 仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器,如果给出了构造器则覆盖默认构造器。
  • 建议将初始化块放在域定义之后。
  • 调用构造器的具体处理步骤:
    1. 所有数据域被初始化为默认值
    2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块。
    3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
    4. 执行这个构造器的主体。
  • 在类第一次加载的时候,将会进行静态域的初始化。所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。
  • 对象析构与finalize方法的区别:
    • 在析构器中,最见的操作是回收分配给对象的存储空间。由于java有自动的垃圾回收器,不需要人工回收内存,所以java不支持析构器。
    • 可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要依赖与使用finalize方法回收任何短缺的资源。(不建议使用)

4.10 类设计技巧

  • 一定要保证数据私有(绝对不要破坏封装性)。

  • 一定要对数据初始化(java不对局部变量初始化,但会对对象的实例域进行初始化)。

  • 不要在类中使用过多的基本类型(可以将多个相关的基本类型用其他类代替)。

  • 不是所有的域都需要独立的域访问器和域更改器(按需设计)。

  • 将职责过多的类进行分解(如果明显地可以将一个复杂的类分解乘两个更为简单的类,就应该将其分解)。

  • 类名和方法名要能体现它们的职责。(例如访问器方法用小写get开头,更改器方法用小写set开发)

  • 优先使用不可变的类。

    更改对象的问题在于,如果多个线程试图同时更新一个对象,就会发生并发更改,其结果是不可预测的。但如果类是不可变的,就可以安全地在多个线程间共享其对象。


【推荐篇】- 书籍内容整理笔记 链接地址
【推荐】【Java编程思想】【笔记】 juejin.cn/post/684490…
【推荐】【Java核心技术 卷Ⅰ】【笔记】 juejin.cn/post/684490…

后期持续更新中。。。。。。

若有书写错误的地方,欢迎留言,希望我们可以一起进步,一起加油!😜😜