完成第二章的内容

This commit is contained in:
2023-03-04 15:52:20 +08:00
parent f2a40a910e
commit 1fe20bde9f
11 changed files with 994 additions and 337 deletions
+119 -118
View File
@@ -12,25 +12,24 @@
如果从C语言出发,需要建立一个结构体来描述圆。
```c {.line-numbers}
```c
struct Circle
{
float x; // X坐标
float y; // Y坐标
float r; // 半径
float x; // X坐标
float y; // Y坐标
float r; // 半径
};
```
上面只是定义了一个结构体(抽象,代表所有圆),但是还不存在一个真正的圆的实例(具体的对象),因此需要定义一个变量,其类型是Circle这个结构体。
```c {.line-numbers}
```c
struct Circle c1;
```
如果要改变c1这个圆结构变量的值我们有两种方法,首先是直接赋值。
```c {.line-numbers}
```c
struct Circle c1;
c1.x = 0;
c1.y = 1;
@@ -41,7 +40,7 @@ struct Circle c1;
另外还可以用函数的方式来改变结构体的值。
```c {.line-numbers}
```c
/**
* 给圆设定初始值
* @param c 圆结构的指针
@@ -58,7 +57,7 @@ void setCircle(struct Circle *c, float x, float y, float r) {
另外我们一次性的打印整个圆的数据,这样我们最好需要一个函数。
```c {.line-numbers}
```c
/**
* 打印
* @param c
@@ -70,7 +69,7 @@ void printCircle(struct Circle *c) {
把所有代码放在一起:
```c {.line-numbers}
```c
#include <stdio.h>
#include <malloc.h>
@@ -117,22 +116,22 @@ int main() {
### 1.2. C语言描述圆的总结
1. 圆的结构体描述是一个抽象的描述,因为结构体是类型定义,并没有与其对应的变量;这儿描述和后面的Java类的定义很像。
2. 声明一个结构体变量后就有一个真实的内存变量来描述一个特定的圆了,这个变量是圆(抽象描述的)一个实例(实体),也叫做对象;这个概念和Java的对象非常相似;
3. 通过点(.)或者(->)可以操作结构体变量(对象)内部的成员,这点和Java对象的操作也非常相识,只不过Java都是用点(.);
1. 圆的结构体描述是一个抽象的描述,因为结构体是类型定义,并没有与其对应的变量;这儿描述和后面的Java类的定义很像。
2. 声明一个结构体变量后就有一个真实的内存变量来描述一个特定的圆了,这个变量是圆(抽象描述的)一个实例(实体),也叫做对象;这个概念和Java的对象非常相似;
3. 通过点(.)或者(->)可以操作结构体变量(对象)内部的成员,这点和Java对象的操作也非常相识,只不过Java都是用点(.);
这里我们发现,操作结构体的函数是独立定义的,并且需要把结构体变量作为参数进行传递。圆这个结构体是死的,需要外部的函数来对其进行操作。如果把圆这个结构体变量和生活中的对象联系起来,会有些有趣的事情。
例如,人这个对象有固有的特性(性别、年龄、身高、体重。。。)这些和圆的坐标和半径对应,都表示一个对象的特性;但是人可以说话,可以运动(动作、行为,相当于函数);而结构体变量的圆不能自己动作,只能依靠外部的函数进行动作。如果圆可以自己动作,例如让圆这个对象自己打印输出,这样不就可以和生活中的对象联系起来了?
```c {.line-numbers}
```c
struct Circle
{
float x; // X坐标
float y; // Y坐标
float r; // 半径
float x; // X坐标
float y; // Y坐标
float r; // 半径
function void print(){
printf("The position x=%f, y=%f, radius=%f!\n", c->x, c->y, c->r);
printf("The position x=%f, y=%f, radius=%f!\n", c->x, c->y, c->r);
}
};
struct Circle c1;
@@ -151,7 +150,7 @@ c1.print(); // C语言无法做到
接下来我们使用java来实现上述的功能,这里主要是要把相关的函数作为结构体的一个部分。
```c {.line-numbers}
```c
/**
* 定义Circle类
*
@@ -159,19 +158,19 @@ c1.print(); // C语言无法做到
*
*/
class Circle {
float x;
float y;
float r;
float x;
float y;
float r;
public void setCircle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
public void setCircle(float x, float y, float r) {
this.x = x;
this.y = y;
this.r = r;
}
public void printCircle() {
System.out.printf("The position x=%f, y=%f, radius=%f!\n", x, y, r);
}
public void printCircle() {
System.out.printf("The position x=%f, y=%f, radius=%f!\n", x, y, r);
}
}
/**
@@ -182,28 +181,28 @@ class Circle {
*/
public class Circle_Test {
public static void main(String[] args) {
Circle circle = new Circle();
circle.x=0;
circle.y=1;
circle.r=11.2F;
circle.printCircle();
circle.setCircle(1, 1, 3.3F);
circle.printCircle();
}
public static void main(String[] args) {
Circle circle = new Circle();
circle.x=0;
circle.y=1;
circle.r=11.2F;
circle.printCircle();
circle.setCircle(1, 1, 3.3F);
circle.printCircle();
}
}
```
看有什么区别?
1. Java定义一个类是如何的?
2. Java中1316行中的this代表什么?
3. Java的语法和C有什么区别?
4. 注意C中33行和Java中32行代码,代表什么意思?
5. 注意C中给结构体指针成员赋值与Java中对象成员赋值的区别。
6. Java中类包含了函数,这是C中结构体不具备的能力。
7. C和Java都有主函数Main,他们的写法有什么不一样?
1. Java定义一个类是如何的?
2. Java中1316行中的this代表什么?
3. Java的语法和C有什么区别?
4. 注意C中33行和Java中32行代码,代表什么意思?
5. 注意C中给结构体指针成员赋值与Java中对象成员赋值的区别。
6. Java中类包含了函数,这是C中结构体不具备的能力。
7. C和Java都有主函数Main,他们的写法有什么不一样?
#### 1.3.1. 编译和运行Java
@@ -211,11 +210,10 @@ public class Circle_Test {
命令行中执行:
```bash {.line-numbers}
```bash
javac Circle_Test.java
```
发现生成了两个文件
![](img/20230302094127.png)
@@ -223,13 +221,13 @@ javac Circle_Test.java
接下来使用命令行
```bash {.line-numbers}
```bash
java Circle_Test
```
运行刚刚编译后的代码,得到结果
```bash {.line-numbers}
```bash
The position x=0, y=1, radius=11.200000!
The position x=1, y=1, radius=3.300000!
```
@@ -270,9 +268,9 @@ The position x=1, y=1, radius=3.300000!
#### 2.3.1. JDK、API、IDE
1. API: application programming interface,应用编程接口。Java提供了一套最基本的类,包括文件操作、网络操作、数学运算、输出输出、数据结构等,用来简化你的开发。这些其实是最基本的数据结构和操作函数,只不过Java是按照类(class)的方式来组织,的;类比C语言中的标准函数库是按照头文件和C文件来组织的。
2. JDK: Java Developing Kit,是Java的开发套件。类比C语言,可以看作是编译器、链接器这些命令行工具。不同的是,Java没有链接,只有编译工具(Javac);另外Java编译后的代码(.class文件,有叫做bytecode)不能直接运行,需要使用java虚拟机(java)运行。
3. IDE: Integrated Development Environment,这是集成开发环境。一般人不会用写字板和命令行行(Jdk)来开发Java,因为效率太低了。 
1. API: application programming interface,应用编程接口。Java提供了一套最基本的类,包括文件操作、网络操作、数学运算、输出输出、数据结构等,用来简化你的开发。这些其实是最基本的数据结构和操作函数,只不过Java是按照类(class)的方式来组织,的;类比C语言中的标准函数库是按照头文件和C文件来组织的。
2. JDK: Java Developing Kit,是Java的开发套件。类比C语言,可以看作是编译器、链接器这些命令行工具。不同的是,Java没有链接,只有编译工具(Javac);另外Java编译后的代码(.class文件,有叫做bytecode)不能直接运行,需要使用java虚拟机(java)运行。
3. IDE: Integrated Development Environment,这是集成开发环境。一般人不会用写字板和命令行行(Jdk)来开发Java,因为效率太低了。 
## 3. JAVA开发环境
@@ -312,8 +310,8 @@ Eclipse 是一个开放的框架,基于Eclipse框架的有很多不同语言
在弹出的对话框中主要是:
1. Project name:项目名称,建议使用英文,命名规则可以参考C语言的变量命名规则;
2. Use an execution environment JREJava虚拟机的版本,请一定选择1.8这个版本,因为我们书中的例子是按照1.8版本的。
1. Project name:项目名称,建议使用英文,命名规则可以参考C语言的变量命名规则;
2. Use an execution environment JREJava虚拟机的版本,请一定选择1.8这个版本,因为我们书中的例子是按照1.8版本的。
==项目名称最好使用英文,符合C语言变量名命名规则。因为项目名称直接对应到Workspace文件夹中的一个子文件夹,中文可能会造成意想不到的问题。==
@@ -345,40 +343,41 @@ Eclipse 是一个开放的框架,基于Eclipse框架的有很多不同语言
![](img/20230302095740.png)
1. Name:类名,上面名称的规则。在Java中,一个类**一般**是一个文件(一个文件可以包含多个类,一般不建议)。一个类的定义如同C中结构体类型的定义。Java推荐类名的首字母大写;
2. Modifiers:可视等级,这个以后解释,这里选择 public 就可以了;
3. Superclass:父类,这个以后解释,保持缺省;
4. public static void main(String[] args):如果C语言需要一个main的主函数作为启动入口,如果你需要,请勾选,会自动给你建立一个空的main函数。因为我们需要这个类可以运行,因此勾选。
1. Name:类名,上面名称的规则。在Java中,一个类**一般**是一个文件(一个文件可以包含多个类,一般不建议)。一个类的定义如同C中结构体类型的定义。Java推荐类名的首字母大写;
2. Modifiers:可视等级,这个以后解释,这里选择 public 就可以了;
3. Superclass:父类,这个以后解释,保持缺省;
4. public static void main(String[] args):如果C语言需要一个main的主函数作为启动入口,如果你需要,请勾选,会自动给你建立一个空的main函数。因为我们需要这个类可以运行,因此勾选。
完成后,会打开一个新的类:
```java {.line-numbers}
```java
package first;
public class Hello {
public static void main(String[] args) {
// TODO Auto-generated method stub
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
}
```
接下来我们修改这个类框架,主要是修改main函数部分,结果如下:
```java {.line-numbers}
```java
package first;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello world!");
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
}
```
保存(ctl+s)后,可以运行看看结果:
![](img/20230302095908.png)
@@ -406,13 +405,14 @@ package first;
```java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello world!");
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
}
```
注意,第一行并没有 package 这个申明。在看看文件系统:
![](img/20230302100109.png)
@@ -429,24 +429,25 @@ Hello.java 这个文件的确在src文件夹中。
我们再来回顾以下上面最简单的Hello world
```java {.line-numbers}
```java
package first;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello world!");
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
}
```
1. package:包描述,该源代码在那个包,对应src文件夹中的字文件夹。如果有多个层级的包(src子文件夹中的子文件夹),使用点(.)来分割包名。尝试一下在包下面建立子包后package是如何描述的。package不是必须的,如果java文件在src中,package可以省略,这时表示缺省包。
2. 一般来说,一个Java文件包含一个类(Class)结构,如果有多个并列的Class结构,只能有一个描述成public。关于public的含义后面会讲到
3. 类名(或者描述成public的类名),这个例子是Hello,必须和主文件名一致
4. Java中的变量、常量、函数等结构都属于一个类(Class),在类外面定义非类(Class)的结构都是非法的
5. 如果要代码运行,需要一个主函数main,且这个函数的写法是固定的(上面代码第5行),且main函数所在的类必须是public修饰的。
6. 一个工程中可以有多个类,多个主函数,这个和C是有区别的。C中一个工程只能有一个主函数
1. package:包描述,该源代码在那个包,对应src文件夹中的字文件夹。如果有多个层级的包(src子文件夹中的子文件夹),使用点(.)来分割包名。尝试一下在包下面建立子包后package是如何描述的。package不是必须的,如果java文件在src中,package可以省略,这时表示缺省包
2. 一般来说,一个Java文件包含一个类(Class)结构,如果有多个并列的Class结构,只能有一个描述成public。关于public的含义后面会讲到
3. 类名(或者描述成public的类名),这个例子是Hello,必须和主文件名一致
4. Java中的变量、常量、函数等结构都属于一个类(Class),在类外面定义非类(Class)的结构都是非法的。
5. 如果要代码运行,需要一个主函数main,且这个函数的写法是固定的(上面代码第5行),且main函数所在的类必须是public修饰的
6. 一个工程中可以有多个类,多个主函数,这个和C是有区别的。C中一个工程只能有一个主函数。
后续的学习中会学到更多关于语法方面的内容,这里只做一个初步的了解。
@@ -454,9 +455,9 @@ public class Hello {
这里讨论指针比较早,C中的指针是一个非常重要的概念,在Java中关于类似C指针的概念有区别,这里需要进行说明,请大家先有个印象。
1. 首先Java中不存在C中指针的术语,与之对应的是引用(reference)。引用和指针其实是相似的;
2. Java中有动态分配内存(如使用 new 操作符),但是不需要回收,Java虚拟机会自动回收;
3. Java中有引用的操作(类似C中取指针地址)也是使用(&)操作符。
1. 首先Java中不存在C中指针的术语,与之对应的是引用(reference)。引用和指针其实是相似的;
2. Java中有动态分配内存(如使用 new 操作符),但是不需要回收,Java虚拟机会自动回收;
3. Java中有引用的操作(类似C中取指针地址)也是使用(&)操作符。
关于引用的具体内容我们放在函数和类中进行讲解。
@@ -468,9 +469,9 @@ public class Hello {
语法错误,编译的时候发现,例如:
```java {.line-numbers}
```java
public class ShowSyntaxErrors {
public static main(String[] args) {
public static main(String[] args) {
System.out.println("Welcome to Java);
}
}
@@ -480,11 +481,11 @@ public class ShowSyntaxErrors {
运行时错误,运行时产生的错误,例如空对象操作、0作为除数、文件不存在等。运行时错误是我们需要特别关注的,因为会导致程序的流程异常,产生意想不到的结果。例如下面这个例子:
```java {.line-numbers}
```java
public class ShowRuntimeErrors {
public static void main(String[] args) {
System.out.println(1 / 0);
}
public static void main(String[] args) {
System.out.println(1 / 0);
}
}
```
@@ -494,12 +495,12 @@ public class ShowRuntimeErrors {
逻辑错误,简单说来就是语法没错、也没有运行时错误(异常),但是结果错误了。通常是编程者的算法错了,例如:
```java {.line-numbers}
```java
public class ShowLogicErrors {
public static void main(String[] args) {
System.out.println("Celsius 35 is Fahrenheit degree ");
System.out.println((9 / 5) * 35 + 32);
}
public static void main(String[] args) {
System.out.println("Celsius 35 is Fahrenheit degree ");
System.out.println((9 / 5) * 35 + 32);
}
}
```
@@ -513,22 +514,22 @@ public class ShowLogicErrors {
代码如下:
```java {.line-numbers}
```java
public class Debug {
public static void main(String[] args) {
String outStr = "";
for (int i = 0; i < 10; i++) {
outStr += i + ",";
System.out.println(outStr);
}
}
public static void main(String[] args) {
String outStr = "";
for (int i = 0; i < 10; i++) {
outStr += i + ",";
System.out.println(outStr);
}
}
}
```
输出结果是:
``` {.line-numbers}
```{.line-numbers}
0,
0,1,
0,1,2,
@@ -553,15 +554,15 @@ eclipse的调试界面是单独的布局,第一次运行调试会提示进入
![](img/20230302100457.png)
1. 中断行:高亮显示,表示当前需要执行的行(还未执行);
2. 调试窗口:当前的变量值;断电设置;表达式计算等;
3. 输出窗口:和运行是一样的,不过这个输出要更具代码的具体执行位置进行输出;
4. 运行按钮:控制代码执行的按钮:
1. Step over(F6):单步执行(跳过),运行到当前下一行代码,如果有函数,不进入函数;
2. Step into(F5):如果高亮代码有函数,进入函数执行(单步执行);
3. Step return(F7):从函数中返回到被调用位置(单步执行);
4. Resume(F8):执行直到下一个个中断位置;
5. TerminateCtl+F2):终止运行,无论是否运行完成,立即终止并退出。
1. 中断行:高亮显示,表示当前需要执行的行(还未执行);
2. 调试窗口:当前的变量值;断电设置;表达式计算等;
3. 输出窗口:和运行是一样的,不过这个输出要更具代码的具体执行位置进行输出;
4. 运行按钮:控制代码执行的按钮:
1. Step over(F6):单步执行(跳过),运行到当前下一行代码,如果有函数,不进入函数;
2. Step into(F5):如果高亮代码有函数,进入函数执行(单步执行);
3. Step return(F7):从函数中返回到被调用位置(单步执行);
4. Resume(F8):执行直到下一个个中断位置;
5. TerminateCtl+F2):终止运行,无论是否运行完成,立即终止并退出。
尝试不断按F8,观察调试窗口、输出窗口的变化。
@@ -595,12 +596,12 @@ eclipse的调试界面是单独的布局,第一次运行调试会提示进入
## 6. 本章节重点
1. JDK、API、IDE: P11-1.6
2. Java语言的基本结构:P12-1.7
3. 建立、编译、执行JavaP15-1.8
4. 错误类型:P20-1.10
1. JDK、API、IDE: P11-1.6
2. Java语言的基本结构:P12-1.7
3. 建立、编译、执行JavaP15-1.8
4. 错误类型:P20-1.10
补充内容:
1. 包和文件夹的关系;不考,但是掌握后有帮助。
2. Eclipse的使用,特别是调试(Debug);不考,但是非常有用。
1. 包和文件夹的关系;不考,但是掌握后有帮助。
2. Eclipse的使用,特别是调试(Debug);不考,但是非常有用。