该学习笔记是根据阿玮老师《黑马程序员Java零基础视频教程》总结出来的,非常感谢阿玮老师。
一. 变量
- 变量是在程序执行过程中,其值有可能发生改变的量(换句话说变量中存储的值或者数据有可能发生改变)。Java数据类型总体可分为:基本数据类型和引用数据类型。其中基本数据类型可以简单概括为四类八种:整数(byte、short、int、long) 、浮点数(float、double)、字符(char)与布尔(boolean);引用数据类型主要包括:类、接口、数组。我们可以这样认为:除了基本数据类型(上面的四类八种)以外,其它的都是引用数据类型。注意在定义long类型变量需要加入"L"标识(小写的L也行),在定义float类型变量需要加入"F"标识(小写的F也行)。
- 变量的定义格式:
数据类型 变量名 = 数据值;
。 - 变量的名字不能重复定义,且变量只能存储一个值;一条语句可以定义多个变量,但需要使用逗号隔开;在使用变量前一定要对变量进行赋值。
二. java中的运算符
- 算术运算符:包括加(+)、减(-)、乘(*)、除(/)和取模(%)。
- 自增自减运算符:(++)和(–)。
- 赋值运算符:“=”、“+=”、“-=”、“*=”、“/=”、“%=”。
- 关系运算符(比较运算符):“==”、“!=”、“>”、“>=”、“<”、“<=”。对于这六种关系运算符,如果成立则为true;不成立则为false。例如a>b,判断a是否大于b,成立则为true,不成立则为false。关系运算符的结果都是boolean类型,要么是true,要么是false。
- 逻辑运算符:(1)“&”(逻辑与(且)),两边都为真,结果才为真;(2)“|”(逻辑或),两边都为假,结果才为假;(3)“^”(逻辑异或),相同为false,不同为true;(4)“!”(逻辑非),取反。
- 短路逻辑运算符:(1)“&&”(短路与),结果和"&“相同,但是有短路的效果。例如:a&&b,当a为false时,就不再看b了,直接给出a&&b为false。(2)”||“(短路或),结果和”|“相同,但是有短路的效果。例如:a||b,当a为true时,就不再看b了,直接给出a||b为true。java中最常用的逻辑运算符为:”&&“、”||“、”!"。
- 三元运算符(三元表达式)格式:关系表达式? 表达式1:表达式2;如果关系表达式的值为真,就执行表达式1;否则执行表达式2。
- 扩展知识
- 隐式转换:取值范围(优先级)–byte<short<int<long<float<double。数据类型不一样,不能进行直接计算,需要转换成一样的才可以进行计算。转换规则(1)–取值范围小的与取值范围大的进行运算,小的会先提升为大的,然后再进行计算;转换规则(2)–byte、short、char三种类型的数据在运算时,都会直接先提升为int,然后再进行计算。
- 强制类型转换:如果把一个取值范围大的数值赋值给取值范围小的变量,是不允许直接赋值的,如果一定要这么做就需要用到强制转换。强制转换的格式:目标数据类型 变量名 = (目标数据类型) 被强制转换的数据。
- 字符串的"+“操作:(1)当”+“操作中出现字符串时,这个”+“就代表字符串连接符,而不是算术运算符。此时会将前后的数据进行拼接,并产生一个新的字符串。如果连续进行”+“操作时(存在多个”+"),应该从左往右依次逐个执行。(2)当 字符+字符 或者 字符+数字 时,会把字符转为ASCII码表查询到对应的数字再进行计算,其中’a’对应97,字符’A’对应65。
int a=10,double b=3.3;对于a=a+b来说,此时程序会报错;对于a+=b来说,程序不会出错且a==13
。这是由于a+b为double类型的数据,而a是int类型数据,double优先级高于int,因此不能直接将a+b赋值给a。而"+=“、”-=“、”*=“、”/=“、”%="在底层都隐藏了一个强制类型转换,会把a+b的数据类型转为int,因此不会报错。
三. if语句和switch语句
- if语句:
- if语句的第一种格式:if(关系表达式){语句体;},如果语句体只有一句代码,包裹语句体的大括号可以省略不写。
- if语句的第二种格式:if(关系表达式){语句体;}else{语句体;}。
- if语句的第三种格式:if(关系表达式1){语句体1;}else if(关系表达式2){语句体2;}else{最后一个语句体;}
- switch语句:
- switch语句格式:switch(表达式){case 值1: 语句体1;break; case 值2: 语句体2;break; … default: 最后一个语句体;break;}
- switch后面的表达式取值为byte、short、int、char、String;case后面跟的是要和表达式进行比较的值(被匹配的值); break表示中断,结束的意思,用来结束switch语句;default表示所有情况都不匹配的时候;就执行该处的内容;case不能是变量且给出的值不允许重复。
四. 循环语句
- 循环的分类:for循环、while循环、do…while循环;
- for循环的格式:for(初始化语句; 条件判断语句; 条件控制语句){循环体语句; }。for循环的执行过程:首先执行初始化语句;其次执行条件判断语句,看其结果是true还是false,如果是true则执行for循环中的循环体语句,如果是false则for循环结束;最后执行条件控制语句,返回到条件判断语句。在此过程中,初始化语句只执行一次,条件判断语句为true,循环继续;条件判断语句为false,循环结束。
- while循环语句的格式:初始化语句; while(条件判断语句){循环体语句; 条件控制语句; }。
- do…while循环语句格式:初始化语句; do{循环体语句; 条件控制语句; }while(条件判断语句); do…while因为是先执行后判断,所以至少执行一次。
- for循环和while循环的区别:for循环中,因为控制循环的变量归属于for循环的语法结构中,在for循环结束后,就不能再次被访问到了;while循环中,因为控制循环的变量对于while循环来说不归属其语法结构,在while循环结束后,该变量还可以继续使用。当循环次数不确定时,建议使用while循环。
- 无限循环:循环一直执行。
- for( ; ; ) {循环体语句; }。
- while(true) {循环体语句; }。
- do{循环体语句; } while(true); 。
- continue:提前结束本次循环,continue后面的代码不再执行,然后继续执行下次循环。break:结束整个循环。
五. 数组
-
数组的定义:数组指的是一种容器,在这个容器中可以存储同种数据类型的多个值。注意是同种数据类型!!!数组容器在存储数据时,需要结合隐式转换。例如:int类型的数组容器可以存储byte、short、int类型的数据,但是不可以存储
boolean和double类型的数据(因为这两种类型的数据优先级高于int类型的数据);double类型的数组可以存储byte、short、int、long、float、double类型的数据。但是建议数组容器的类型和存储的数据类型保持一致。 -
一维数组的定义格式:格式(1)–数据类型[] 数组名 (int[] array);格式(2)–数据类型 数组名[] (int array[])。数组的初始化:所谓的初始化就是在内存中为数组容器开辟存储空间,并将数据存入到数组容器中。数组初始化完成后,它的大小就确定了,不能发生改变。
(1)数组初始化的格式:- 数组静态初始化完整格式:数据类型[] 数组名 = new 数据类型[] {元素1, 元素2, …, }; 例子:int[] array = new int[]{1, 2, 3};。静态初始化简写格式:数据类型[] 数组名 = {元素1, 元素2, …,}; 例子:int[] array = {1, 2, 3};。
- 数组动态初始化格式:数据类型[] 数组名 = new 数据类型[数组长度]; 例子:int[] array = new int[6]; 。数组动态初始化时只指定数组的长度,由系统为数组分配初始值。其中数组默认初始化值的规律:整数类型----默认初始化值为0;浮点数(小数)类型----默认初始化值为0.0;布尔类型----默认初始化值为false;字符类型----默认初始化值为\u0000,就是一个空格;引用数据类型----默认初始化值为null。
(2)数组的元素访问格式:数组名[索引]; (索引是从0开始的,索引也叫做下标或者角标)。
(3)数组动态初始化和静态初始化的区别:动态初始化----手动指定数组长度,由系统给出默认初始化值;静态初始化—手动指定数组元素,系统会根据元素个数计算出数组的长度。当访问了数组中不存在的索引,就会引发索引越界异常。 -
二维数组
(1)二维数组的静态初始化完整格式:数据类型 [][] 数组名 = new 数据类型 [][] { {元素1, 元素2, …}, …,{元素1, 元素2, …} };,例子:int[][] arr = new int[][]{{1,2,3},{4,5,6}}; 。
(2)二维数组的静态初始化简化格式:数据类型[][] 数组名={{元素1, 元素2, …}, …,{元素1, 元素2, …}};,例子:int[][] arr = {{1 ,2, 3}, {4, 5, 6} };。
(3)二维数组的动态初始化:数据类型[][] 数组名 = new 数据类型[m][n];其中m代表这个二维数组中存放一维数组的数量;n代表每个一维数组中存放的元素(数据)的数目。例子:int[][] arr = new int[2][3]; 代表该二维数组可以存放2个一维数组,而每个一维数组中又可以存放3个int类型的元素。还有一种特殊情况:int[][] arr = new int[2][],此时表示该二维数组只创建了2个一维数组,而每个一维数组中存储的元素个数没有确定。
六. 方法
- 方法(相当于C语言中的函数)的定义就是把一些代码打包在一起,方法定义后并不是直接运行的,需要手动调用才能执行,而执行的过程称为方法调用。方法必须先定义后调用,否则程序会报错。
- 方法定义的格式:
(1)格式一:public static void 方法名() {方法体; },对应的方法调用为:方法名(); 。
(2)格式二:public static void 方法名(参数1, 参数2, …) {方法体; },对应的方法调用为:方法名(参数1, 参数2, …); 。
(3)格式三:public static 返回值类型 方法名(参数) {方法体; return 返回值; }
(4)上面方法使用了修饰符public和static,public是访问权限修饰符,表示公有访问,对所有的类都可见;static是非访问权限修饰符,表示该方法是静态方法。因此方法的定义可以总结为:修饰符 返回值的类型 方法名(参数){方法体; return 返回值; }。如果返回值的类型为void,此时return后面啥也不用写,即return;
,此时也可以省略这个return语句。 - 方法的重载
方法的重载就是在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能。每个方法具有不同类型的参数或参数个数,这些同名的方法就构成了重载关系。简而言之,方法的重载关系就是在同一个类中,方法名相同,参数不同的多个方法,与返回值(return语句)无关。其中参数不同包括:个数不同、类型不同、顺序不同。 - 基本数据类型和引用数据类型
(1)基本数据类型:整数类型(byte、short、int、long)、浮点数类型(float、double)、布尔类型(boolean)和字符类型(char);基本数据类型:int a=10; double b=20.0; 变量中存储的是真实数据。
(2)除了基本数据类型以外的其它所有类型都是引用数据类型。举一个引用数据类型的例子:int[] arr = new int[]{1,2,3};
数组名arr存储的是数组在内存空间的地址值,引用可以理解为使用该地址值下的数据。
(3)两者的区别:- 基本数据类型:数据存储在定义的变量内存空间中(栈内存中),当我们给其它变量赋值时,给的是真实的数据值;
- 引用数据类型:数据存储在堆内存中,栈内存中存储的是该数据的地址值,当我们给其它变量赋值时,给的是该数据的地址值;
七. 杂七杂八
- 注释的内容不会参与编译和运行,仅仅是对代码的解释说明。
- 单行注释:格式为"// 要注释的内容"。
- 多行注释:格式为"/* 要注释的内容 */"。
- 文档注释:格式为"/** 要注释的内容 **/"。
- 关键字是被Java赋予了特定含义的英文单词,其中关键字的字母全部小写。下面介绍几个常见的关键字:class、abstract、final、this、new等等。
- 字面量
特殊字符:“\t”、“\r”、“\n”…。其中制表符"\t"代表缩进、对齐、大空格,换句话说"\t"在打印的时候,把前面字符串的长度补齐到8或者8的整数倍,使用"\t"在打印表格的时候可以让数据对齐,看起来比较整齐。例如代码:System.out.println("hello"+'\t');
我们在"hello"后面加上制表符"\t",此时相当于在"hello"后面加上3个空格,将"hello"的长度补齐到8。 - 计算机中的数据存储:在计算机中,任意数据都是以二进制(由0和1组成)的形式来存储的。在Java中,二进制以"0b"开头;八进制以"0"开头;十进制前面不加任何前缀;十六进制以"0x"开头。
- java标识符书写的建议
- 对于变量和方法建议用小驼峰命名法。标识符是一个单词的时候,全部小写,例如:age。标识符由多个单词组成的时候,第一个单词首字母小写,其它单词首字母大写,例如:computeAge。
- 对于类的名字建议用大驼峰命名法。标识符是一个单词的时候,首字母大写,例如:类名Student。标识符由多个单词组成的时候,每个单词的首字母都要大写,例如:类名GoodStudent。
- IDEA项目结构的层级关系:project–module–package–class,其中在一个project中可以创建多个module,多个module之间彼此可以相互依赖;在一个module中可以创建多个package;在一个package中可以创建多个class。有了这些层级结构的划分,我们可以更为方便的管理功能代码。对于一个project:
- 当project中只有一个module的时候,这个单独的module实际上就是一个project;
- 当project中有多个module的时候,多个module处于同一个project之中,此时module彼此之间具有互相依赖的关联关系;
- 当然多个module没有建立依赖关系的话,也可以单独作为一个小的project运行。
- Java虚拟机(JVM)由栈、堆、方法区、本地方法栈和寄存器组成。
- 栈是方法运行时使用的内存,例如main方法运行时,进入方法栈中执行;
- 堆是用来存储对象或者数组,通过new创建的对象都存储在堆内存中;
- 方法区存储可运行的.class文件(字节码文件);
- 本地方法栈在JVM使用操作系统功能的时候就会使用,和我们开发无关;
- 寄存器是给CPU使用的,和我们开发无关。
- 注意:只要通过关键字new出来的东西都会在堆内存中开辟空间并产生地址。