第2章 一切都是对象 21

这一章将开始介绍Java程序的基本组成,但是,也会令你“欲仙欲死”。

2.1 用引用操纵对象 21

这里作者用遥控器与电视机作为讲解引用与对象的关系,很符合要义,我们一般是操控遥控器,在程序中我们也是一般操作对象的引用。这一节引出对象。

2.2 必须由你创建所有对象 22

这一节继承上一节,对对象需要初始化,new 关键字表名“给我一个新的对象”

2.2.1 存储到什么地方 22
  • 寄存器:处理器内部,速度最快,我们无法直接控制
  • 堆栈:RAM中,速度仅次于寄存器;堆栈指针向上移动,释放那些内存;向下移动,分配新的内存;引用存于此处。
  • 堆:RAM内,用于存放所有的Java对象。
  • 常量存储:常量值通常直接存放在程序代码内部
  • 非RAM存储:2个基本的例子——流对象以及持久化对象,即存活于程序之外的数据。
2.2.2 特例:基本类型 23

基本数据类型存储于堆栈中

类型分类:

数据类型转换之默认转换顺序:

类型范围:

2.2.3 Java中的数组 24

2.3 永远不需要销毁对象 24

2.3.1 作用域 24

变量定义在哪个大括号内,它就在这个大括号内有效。并且,在同一个大括号内不能同时定义同名的变量。

2.3.2 对象的作用域 25

一般对象在定义的大括号内消失的是其引用,其对象本身继续占据内存空间。这就牵涉到了Java的垃圾回收机制。

2.4 创建新的数据类型:类 25

引出类class关键字

2.4.1 字段和方法 26

字段–>成员变量;方法–>成员方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Java中的参数传递问题:
基本类型:形式参数的改变对实际参数没有影响。
引用类型:形式参数的改变直接影响实际参数。
成员变量和局部变量的区别?
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。
注意事项:
局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
如果你看到了一个方法的形式参数是一个类类型(引用类型),
这里其实需要的是该类的对象。

2.5 方法、参数和返回值 27

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(1)方法:就是完成特定功能的代码块。
注意:在很多语言里面有函数的定义,而在Java中,函数被称为方法。
(2)格式:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) {
方法体语句;
return 返回值;
}

修饰符:目前就用 public static。后面再详细讲解其他修饰符
返回值类型:就是功能结果的数据类型
方法名:就是起了一个名字,方便我们调用该方法。
参数类型:就是参数的数据类型
参数名:就是变量
参数分类:
实参:实际参与运算的数据
形参:方法上定义的,用于接收实际参数的变量
方法体语句:就是完成功能的代码块
return:结束方法
返回值:就是功能的结果,由return带给调用者。
(3)两个明确:
返回值类型:结果的数据类型
参数列表:参数的个数及对应的数据类型
(4)方法调用
A:有明确返回值的方法
a:单独调用,没有意义
b:输出调用,不是很好,因为我可能需要不结果进行进一步的操作。但是讲课一般我就用了。
c:赋值调用,推荐方案
B:void类型修饰的方法
a:单独调用
(6)方法的注意事项
A:方法不调用不执行
B:方法之间是平级关系,不能嵌套定义
C:方法定义的时候,参数是用','隔开的
D:方法在调用的时候,不用在传递数据类型
E:如果方法有明确的返回值类型,就必须有return语句返回。
2.5.1 参数列表 27

2.6 构建一个Java程序 28

2.6.1 名字可见性 28

名字空间,包

2.6.2 运用其他构件 28

import关键字

2.6.3 static 关键字 29
  • (1)静态的意思。

    • 可以修饰成员变量和成员方法。
    • 针对多个对象有共同的这样的成员变量值的时候,Java就提供了一个关键字来修饰:static。
  • (2)静态的特点:

    • A:随着类的加载而加载
    • B:优先与对象存在
    • C:被类的所有对象共享
      这其实也是我们判断该不该使用静态的依据。
      • 举例:饮水机和水杯的问题思考
    • D:可以通过类名调用
      既可以通过对象名调用,也可以通过类名调用,建议通过类名调用。
  • (3)静态的内存图

    • 静态的内容在方法区的静态区
  • (4)静态的注意事项;

    • A:在静态方法中没有this对象
    • B:静态只能访问静态
  • (5)静态变量和成员变量的区别

    • A:所属不同
      • 静态变量:属于类,类变量
      • 成员变量:属于对象,对象变量,实例变量
    • B:内存位置不同
      • 静态变量:方法区的静态区
      • 成员变量:堆内存
    • C:生命周期不同
      • 静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
      • 成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
    • D:调用不同
      • 静态变量:可以通过对象名调用,也可以通过类名调用
      • 成员变量:只能通过对象名调用
  • (6)main方法是静态的

    • public:权限最大

    • static:不用创建对象调用

    • void:返回值给jvm没有意义

    • main:就是一个常见的名称。

    • String[] args:可以接收数据,提供程序的灵活性

    • main方法的格式讲解:

      • public static void main(String[] args) {…}

      • public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。

      • static:静态的,不需要创建对象,通过类名就可以。方便jvm的调用。

      • void:因为我们曾经说过,方法的返回值是返回给调用者,而main方法是被jvm调用。你返回内容给jvm没有意义。

      • main:是一个常见的方法入口。我见过的语言都是以main作为入口。

      • String[] args:这是一个字符串数组。值去哪里了?
        这个东西到底有什么用啊?怎么给值啊?

      这个东西早期是为了接收键盘录入的数据的。
      格式是:

      java MainDemo hello world java
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      class MainDemo {
      public static void main(String[] args) {
      //System.out.println(args); //[Ljava.lang.String;@175078b
      //System.out.println(args.length); //0
      //System.out.println(args[0]); //ArrayIndexOutOfBoundsException
      //接收数据后
      System.out.println(args);
      System.out.println(args.length);
      //System.out.println(args[0]);
      for(int x=0; x<args.length; x++) {
      System.out.println(args[x]);
      }
      }
      }
    • A:在静态方法中是没有this关键字的

      • 如何理解呢?
        • 静态是随着类的加载而加载,this是随着对象的创建而存在。
        • 静态比对象先存在。
    • B:静态方法只能访问静态的成员变量和静态的成员方法

      • 静态方法:
        • 成员变量:只能访问静态变量
        • 成员方法:只能访问静态成员方法
      • 非静态方法:
        • 成员变量:可以是静态的,也可以是非静态的
        • 成员方法:可是是静态的成员方法,也可以是非静态的成员方法。
      • 简单记:
        • 静态只能访问静态。

2.7 你的第一个Java程序 30

2.7.1 编译和运行 31

2.8 注释和嵌入式文档 32

1
2
3
4
 /*
* 多行注释
*/
// 单行注释
2.8.1 注释文档 32

javadoc

2.8.2 语法 33
1
2
3
/**
* @注释文档
*/

javadoc只能为public 和 protected 成员进行文档注释

2.8.3 嵌入式HTML 33

支持html标记

2.8.4 一些标签示例 34
1
2
3
4
5
6
7
8
9
10
11
12
/*
* @see: classname 引用其他类
* @link: package.class#member label 用于行内,类似see
* @docRoot: 产生到文档根目录的相对路径
* @inheritDoc: 从当前类的最直接基类中继承相关文档到当前注释中
* @version: version-information
* @since: 指定代码版本,一般是jdk版本
* @param: 参数
* @return: 返回值
* @throws: 异常
* @Deprecated: 表名已不适用
*/
2.8.5 文档示例 35

2.9 编码风格 36

类首字母大写;驼峰命名法

2.10 总结 36

2.11 练习 37


书籍相关资源:

pdf文档链接:https://pan.baidu.com/s/1yuWb_kI0sB3yHLBndPcyEg 提取码:scvw
书中demo: https://github.com/BruceEckel/TIJ4-code
Thinking in Java 4th英文版的课后习题答案: http://greggordon.org/java/tij4/solutions.htm