一、初识Java

计算机语言发展历史

计算机编程语言的发展,是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低,应用到人类社会的场景就会越多,那么所需要的算法就会越复杂,也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的ENIAC(世界上第一台计算机),只能做非常小的应用,比如:某些情况的弹道计算。现在任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。计算机编程语言的发展历经了从低级到高级发展。发展的核心思想就是“让人更容易编程”。越容易使用的语言,就有越多人使用;越多人使用,就有越多协作;越多协作,就可以创造越复杂的物体;计算机语言经历了三代:第一代是机器语言,第二代是汇编语言,第三代是高级语言。

所需程序

https://www.123pan.com/s/EGKKVv-GLfxh.html 提取码:bKAy

常用DOS命令

DOS系统

Microsoft公司推出的操作系统。(在windows之前的操作系统)

DOS是英文"Disk Operating System"的缩写,其中文含意是"磁盘操作系统".

DOS是单用户、单任务的操作系统.(只能执行一个任务)

DOS命令

在windows中,我们通过鼠标菜单等来操作系统,而在dos操作系统中,要通过dos命令来操作系统。

是DOS操作系统的命令,是一种面向磁盘的操作命令,不区分大小写。

  1. 切换盘符 c: d: e:
  2. 显示目录下详细信息 dir
  3. 改变当前目录 cd
  4. 清屏 cls
  5. 创建目录 md
  6. 删除目录 rd
  7. 复制文件 copy
  8. 删除文件 del

Java入门程序开发

开发Java程序,需要三个步骤:编写代码,编译代码,运行代码

Java

  • 编写代码:任何一个文本编辑器都可以些代码,如Windows系统自带的记事本
  • 编译代码:将人能看懂的源代码(.java文件)转换为Java虚拟机能够执行的字节码文件(.class文件)
  • 运行代码:将字节码文件交给Java虚拟机执行

第一个java程序

public class helloworld(){
	public static void main(String[] args){ 																		
		System.out.println("hello world");
	}
}

注意:文件名称必须与代码中的类名称一致

JDK组成

JDK由JVM、核心类库、开发工具组成,如下图所示:

JDK的组成

  • 什么是JVM?
    答:JDK最核心的组成部分是JVM(Java Virtual Machine),它是Java虚拟机,真正运行Java程序的地方。

  • 什么是核心类库?
    答:它是Java本身写好的一些程序,给程序员调用的。 Java程序员并不是凭空开始写代码,是要基于核心类库提供的一些基础代码,进行编程。

  • 什么是JRE?
    答:JRE(Java Runtime Enviroment),意思是Java的运行环境;它是由JVM和核心类库组成的;如果你不是开发人员,只需要在电脑上安装JRE就可以运行Java程序。

  • 什么是开发工具呢?
    答:Java程序员写好源代码之后,需要编译成字节码,这里会提供一个编译工具叫做javac.exe,编写好源代码之后,想要把class文件加载到内存中运行,这里需要用到运行工具java.exe。
    除了编译工具和运行工具,还有一些其他的反编译工具、文档工具等待...

JDK、JRE的关系用一句话总结就是:用JDK开发程序,交给JRE运行

Java跨平台原理

Java跨平台原理:

Java跨平台原理

C语言跨平台原理:

C语言跨平台原理

总结:

JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行,边解释边运行,这样,速度就会受到一定的影响。

不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,随处运行”。 Java虚拟机是实现跨平台的核心机制。如图所示:

我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台。

接下来我们再比较下两种方式的差异:第一,C语言是编译执行的,编译器与平台相关,编译生成的可执行文件与平台相关;第二,Java是解释执行的,编译为中间码的编译器与平台无关,编译生成的中间码也与平台无关(一次编译,到处运行),中间码再由解释器解释执行,解释器是与平台相关的,也就是不同的平台需要不同的解释器.

Java开发工具IDEA

想要在IDEA正确的写一个Java程序,必须先认识一下IDEA的管理Java程序的工程结构。

  • 第一步:首先得在IDEA中创建一个Project(工程、也叫项目),后面统称为工程。
  • 第二步:需要在Project中创建Module(模块),一个工程中可以包含多个模块
  • 第三步:需要在Module中新建Package(包),一个模块中可以有多个包
  • 第四步:需要在Package中新建Class(类),一个包中可以包含多个类

二、Java基础语法

2.1 注释

为了方便程序的阅读,Java语言允许程序员在程序中写上一些说明性的文字,用来提高程序的可读性,这些文字性的说明就称为注释。

注释不会出现在字节码文件中,即Java编译器编译时会跳过注释语句。

在Java中根据注释的功能不同,主要分为单行注释、多行注释和文档注释。

  • 单行注释

单行注释使用“//”开头,“//”后面的单行内容均为注释。

  • 多行注释

多行注释以“/”开头以“/”结尾,在“/”和“/”之间的内容为注释,我们也可以使用多行注释作为行内注释。但是在使用时要注意,多行注释不能嵌套使用。

  • 文档注释

文档注释以“/**”开头以“*/”结尾, 注释中包含一些说明性的文字及一些JavaDoc标签(后期写项目时,可以生成项目的API)

2.2 字面常量

常量通常指的是一个固定的值,例如:1、2、3、’a’、’b’、true、false、”helloWorld”等。

在Java语言中,主要是利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。

为了更好的区分和表述,一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量,而使用final修饰的PI等称为符号常量(字符常量)。

public class LiteralDemo{
    public static void main(String[] args){
        //1.整数
        System.out.println(666);
        
        //2.小数
        System.out.println(3.66);
        
        //3.字符: 字符必须用单引号引起来
        System.out.println('a');
        System.out.println('0');
        System.out.println('中');
        System.out.println(' '); //空格也算字符
        //特殊字符:\t表示制表符 \n表示换行
        System.out.println('\t'); //这相当于一个tab键,专业叫做制表符
        System.out.println('\n'); //这是换行的意思
        
        //4.字符串:字符串是双引号引起来的
        System.out.println("我爱你中国abc");
        
        //5.布尔值:只有两个值true和false
        System.out.println(true);
        System.out.println(false);
    }
}

2.3 变量

变量本质上就是代表一个可操作的存储空间,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。Java是一种强类型语言,每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如,int a=3;表示a变量的空间大小为4个字节。

变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。

变量的声明格式:

int age = 18;
System.out.println(a);

当执行int age = 18; 这句代码时,JVM会在内存中申请一块区域,在这个区域中存储了一个整数18,给这个区域取的名字叫age; 相当于在盒子中存了一个数据18,这个盒子的名字是age,当我们打印age时,就是从盒子中把盒子中的数据取出来再打印。

变量声明格式

变量的作用域

变量定义在哪个{}范围内,就只在哪个大括号内有效。变量的有效范围称之为变量的作用域

	{
		int a = 10;
		System.out.println(a); //这是是对的
	}
	System.out.println(a); //这里会出错

注意事项:

变量在定义时可以不赋值,但使用时必须赋值。

总结:

  • 变量是用来记录程序中的数据的,可以把变量理解成内存中的小盒子,盒子里放的东西就是变量记录的数据
  • 变量的定义格式: 数据类型 变量名 = 初始值;
  • 变量记录的数据程序运行过程中是可以发生改变的:变量名 = 值;

2.4 关键字

被Java语言赋予了特殊含义,用作专门用途的单词

特点:Java中所有关键字都为小写

abstractassertbooleanbreakbyte
casecatchcharclassconst
continuedefaultdodoubleelse
enumextendsfinalfinallyfloat
forgotoifimplementsimport
instanceofintinterfacelongnative
newpackageprivateprotectedpublic
returnstrictfpshortstaticsuper
switchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile

关键字1

关键字2

2.5 标识符

标志符其实就是我们自己取的名字。像前面我们取的类名,变量名其实都是标志符。

  1. 最好是字母、数字、下划线、$组成
  2. 不能以数字开头
  3. 不能是Java的关键字

三、数据类型、运算符

3.1 数据的表示

3.1.1 整数在计算机中的储存原理

任何数据在计算机中都是以二进制表示的。所谓二进制其实就是一种数据的表示形式,它的特点是逢2进1。

计算机中最小的存储单位是字节(Byte),一个字节占8位(bit),也就是说即使这个数据不足8位也需要用8位来存储。

字节

3.1.2 字符在计算机中的储存原理

字符并不是直接存储的,而是把每一个字符编为一个整数,存储的是字符对应整数的二进制形式。美国人搞了一套字符和整数的对应关系表,叫做ASCII编码表。

ASCII编码表中字符编码的规律:

  1. 字符0对应48,后面的1,2,3,4...9 对应的十进制整数依次往后顺延
  2. 字符a对应97,后面的b,c,d,e...z 对应的十进制整数依次往后顺延
  3. 字符A对应65,后面的B,C,D,E...Z 对应的十进制整数依次往后顺延

ASCII编码表

3.1.3 图片视频声音的存储原理

  • 图片的储存

从图片开始,如果你把一张图片不断的放大,你会看到有马赛克的效果。你会发现图片中的每一个细节是由一个一个的小方格组成的,每一个小方格中其实就是一种颜色。任何一种颜色可以使用三原色来表示,简称RGB,其中R(红色),G(绿色),B(蓝色),而RGB中每一种颜色又用一个字节的整数来表示,最小值是0最大值是255

  • 视频的储存

实际上视频和图片是一样的,把多张图片连续播放,在一秒钟内连续播放24张以上,由于人眼存在视觉暂留现象,人眼感受不到画面切换的时间间隔,就认为是连续的视频了。

  • 声音的储存

声音是以波的形式传播的。我们可以把声波在表示在一个坐标系上,然后在坐标系上取一些点,把这些点的坐标值以二进制的形式存储到计算机中,这就是声音的存储原理。

声音的储存

3.1.4 数据的其他表示形式

3.1.5 不同进制在Java程序中的书写格式

System.out.pirntln('a'+1); //98
System.out.pirntln(0b01100001); //97
System.out.pirntln(0141); //97
System.out.pirntln(0x61); //97

3.2 数据类型详解

Java是一种强类型语言,每个变量都必须声明其数据类型。

Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。

基本数据类型:四大类八种

引用数据类型:String

数据类型

四大类型

3.3 数据类型转换

3.3.1 自动转换

在赋值运算或者算数运算的时候,要求数据类型一致,就要进行类型的转换。类型转换的形式总体分为2种,一种是自动类型转换,一种是强制类型转换

  • 什么是自动类型转换
自动类型转换指的是,数据范围小的变量可以直接赋值给数据范围大的变量
	byte a = 12; 
	int b = a; //这里就发生了自动类型转换(把byte类型转换int类型)
  • 自动类型转换的原理是怎样的
自动类型转换其本质就是在较小数据类型数据前面,补了若干个字节

自动类型转换

自动类型转换2

//代码示例:
public class TypeConversionDemo1 {
    public static void main(String[] args) {
        // 目标:理解自动类型转换机制。
        byte a = 12;
        int b = a; // 发生了自动类型转换了
        System.out.println(a);
        System.out.println(b);

        int c = 100; // 4
        double d = c;// 8 发生了自动类型转换了
        System.out.println(d);

        char ch = 'a'; // 'a' 97 => 00000000 01100001
        int i = ch; // 发生了自动类型转换了 =>  00000000 00000000  00000000 01100001
        System.out.println(i);
    }
}

表达式的自动类型转换

  1. 多种数据类型参与运算,其结果以大的数据类型为
  2. byte,short,char 三种类型数据在和其他类型数据运算时,都会转换为int类型再运算
//代码示例:
public class TypeConversionDemo2 {
    public static void main(String[] args) {
        // 目标:掌握表达式的自动类型转换机制。
        byte a = 10;
        int b = 20;
        long c = 30;
        long rs = a + b + c;
        System.out.println(rs);

        double rs2 = a + b + 1.0;
        System.out.println(rs2);
		
        byte i = 10;
        short j = 30;
        int rs3 = i + j;
        System.out.println(rs3);

        // 面试笔试题: 即使两个byte运算,结果也会提升为int
        byte b1 = 110;
        byte b2 = 80;
        int b3 = b1 + b2;
        System.out.println(b3);
    }
}

3.3.2 强制类型转换

强行将范围大的数据,赋值给范围小的变量,这里就需要用到强制类型转换。下面是强制类型转换的格式

//格式:
目标数据类型  变量名  =  (目标数据类型)被转换的数据;
//代码示例:
public class TypeConversionDemo3 {
    public static void main(String[] args) {
        // 目标:掌握强制类型转换。
        int a = 20;
        byte b = (byte) a;  // ALT + ENTER 强制类型转换。
        System.out.println(a);
        System.out.println(b);

        int i = 1500;
        byte j = (byte) i;
        System.out.println(j);

        double d = 99.5;
        int m = (int) d; // 强制类型转换
        System.out.println(m); // 丢掉小数部分,保留整数部分
    }
}
  • 强制类型转换原理

强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险

强制类型转换原理

四、运算符

算机是用来处理数据的,处理数据就少不了对数据的计算,想要对数据进行计算就必须用到运算符。

运算符就是参与运算的符号。Java提供的运算符有很多种,可以分为算术下面几种

  • 算术运算符
+,-,*,/,%,++(自增),--(自减)
  • 赋值运算符
=
  • 扩展赋值运算符
+=,-=,*=,/=
  • 关系运算符
>,<,>=,<=,==,!= 
  • 逻辑运算符
&,|, &&,||,!,^
  • 位运算符
&,|,^,~ , >>,<<,>>>
  • 条件运算符
?:

4.1 算数运算符

4.2 自增自减运算符

4.3 赋值运算符

4.4 关系运算符

4.5 逻辑运算符

4.6 三元运算符

4.7 运算优先级

4.8 获取用户键盘输入的数据

Api文档下载地址(java8):https://yunyuwu.lanzouy.com/iMaeY1ctqieb

Scanner就是Java提供给我们用于键盘录入数据的类,为了录入不同类型的数据,还提供了不同的功能,每一个功能会有不同的名称,我们只需要调用Scanner提供的功能就可以完成键盘录入数据。

完整代码示例:

public class ScannerDemo1 {
    public static void main(String[] args) {
        // 1、导包:一般不需要我们自己做,idea工具会自动帮助我们 导包的。
        // 2、抄写代码:得到一个键盘扫描器对象(东西)
        Scanner sc = new Scanner(System.in);

        // 3、开始 调用sc的功能,来接收用户键盘输入的数据。
        System.out.println("请您输入您的年龄:");
        int age = sc.nextInt(); // 执行到这儿,会开始等待用户输入一个整数,直到用户按了回车键,才会拿到数据。
        System.out.println("您的年龄是:"  + age);

        System.out.println("请您输入您的名字:");
        String name = sc.next(); // 执行到这儿,会开始等待用户输入一个字符串,直到用户按了回车键,才会拿到数据。
        System.out.println(name + "欢迎您进入系统~~");
    }
}

五、程序流程控制

【1】流程控制的作用:

流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。

【2】控制语句的分类:

控制语句分为三类:顺序、选择和循环。

  • 顺序结构”代表“先执行a,再执行b”的逻辑。

  • 条件判断结构”代表“如果…,则…”的逻辑。

  • 循环结构”代表“如果…,则再继续…”的逻辑。

三种流程控制语句就能表示所有的事情!不信,你可以试试拆分你遇到的各种事情。这三种基本逻辑结构是相互支撑的,它们共同构成了算法的基本结构,无论怎样复杂的逻辑结构,都可以通过它们来表达。所以任何一种高级语言都具备上述两种结构。

5.1 分支结构

5.1.2 if分支