java基础语法
计算机存储单元:
- 字节是计算机中最小存储单元
- 8个bit(二进制位<0或1>)表示为一个字节,(写成1 Byte或1 B)
- 1 Byte = 8 bit
- 1 KB = 1024 Byte
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
- 1 PB = 1024 TB
- 1 EB = 1024 PB
- 1 ZB = 1024 EB
JDK、JRE与JVM:
- JVM:java虚拟机,是运行java程序的假想计算机,是java程序的运行环境。编写的java代码都运行在JVM之上。
- JRE(Java Runtime Environment):是java程序的运行时环境,包含JVM和运行时所需要的核心类库。
- JDK(Java Development Kit):是java程序开发包,包含JRE和开发使用的工具。
关键字&标识符
关键字的特点:
-
- 完全小写的字母
- 在增强版的记事本当中(例如notepad++),有特殊颜色
标识符:是指程序中,自己定义内容,比如类的名字、方法的名字和变量的名字等。
-
- 命名规则:(硬性要求)
- 标识符可以包含英文字母26个(区分大小写)、0-9、$(美元符号)、和_(下划线)
- 标识符不能以数字开头
- 标识符不能是关键字
- 命名规范:(软性建议)
- 类名规范:首字符大写,后面每个单词首字母大写。(大驼峰式)
- 变量名规范:首字母小写,后面每个单词首字母大写。(小驼峰式)
- 方法名规范:同变量名
- 命名规则:(硬性要求)
常量&变量
常量:在程序运行期间,固定不变的量。
-
- 常量的分类
- 字符串常量:凡是用双引号引起来的部分,叫做字符串常量。例如:"abc"、"123"。
- 整数常量:直接写上的数字,没有小数点。例如:100、0、-250。
- 浮点数常量:直接写上的数字,有小数点。例如:2.5、-3.14、0.0。
- 字符常量:凡是用单引号引起来的单个字符,叫做字符常量。例如:'A'、'b'、'9'、'中'。
- 布尔常量:只有两种取值,true、false。
- 空常量:null。代表没有任何数据。
- 常量的分类
数据类型:
-
- 基本数据类型:
- 整数型 byte short int long
- 浮点型 float double
- 字符型 char
- 布尔型 boolean
- 引用数据类型:
- 字符串、数组、类、接口、Lambda
- 基本数据类型:
变量:程序运行期间,内容可以发生改变的量。<装数据的容器>
注意事项:
- 浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F。如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。推荐使用大写字母后缀。
- 如果创建多个变量,那么变量之间的名称不可以重复。
- 没有进行赋值的变量,不能直接使用;一定要赋值之后,才能使用。
- 变量使用不能超过作用域的范围。【作用域】:从定义变量的一行开始,一直到直接所属的大括号结束为止。
数据类型转换
自动类型转换(隐式):
-
- 特点:代码不需要进行特殊处理,自动完成。
- 规则:数据范围从小到大。如:byte --> int
强制类型转换(显式):
-
- 特点:代码需要进行特殊的格式处理,不能自动完成。
- 格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;如:int --> (byte) byte
注意事项:
- 强制类型转换一般【不推荐】使用,因为有可能发生精度损失<浮点数>、数据溢出<整数>。
- byte/short/char这三种类型都可以发生数学运算,例如加法“+”.(计算机的底层会用一个数字<二进制>来代表)
- byte/short/char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。
- 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)。
- 在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。
- boolean类型不能发生数据类型转换。
运算符
注意事项:
- 一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
- 对于字符char类型来说,在计算之前,char会被提升成为int,然后在计算。
- 任何数据类型和字符串进行连接的时候,结果都会变成字符串。
- 与“&&”,或“||”,具有短路效果:如果根据左边已经可以判断得到最终结果,那么右边的代码将不再执行,从而节省一定的性能。
方法
定义格式:
修饰符 返回值类型 方法名称(参数类型 参数名称, ...) {
方法体
return 返回值;
}
-
- 返回值类型:也就是方法最终产生的数据结果是什么类型
- 参数类型:进入方法的数据是什么类型
- 参数名称:进入方法的数据对应的变量名称
- 方法体:方法需要做的事情,若干行代码
- return:两个作用,第一停止当前方法,第二将后面的返回值还给调用处
- 返回值:也就是方法执行后最终产生的数据结果
注意事项:
- return后面的“返回值”,必须和方法名称前面的“返回值类型”,保持对应。
- 方法应该定义在类当中,但是不能在方法当中再定义方法,不能嵌套。
- 如果方法有返回值,那么必须写上“return 返回值;”,不能没有。
- 对于一个void没有返回值的方法,不能写return后面的返回值,只能写return自己。
- 对于方法当中最后一行的return可以省略不写。但是有返回值的必须写。
- 一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到
方法的重载:多个方法的名称一样,但是参数列表不一样
-
- 好处:只要记住唯一一个方法名称,就可以实现类似的多个功能。
- 方法重载与下列因素【有关】:
-
- 参数个数不同
- 参数类型不同
- 参数的多类型顺序不同
-
- 方法重载与下列因素【无关】:
-
- 与参数的名称无关
- 与方法的返回值无关
循环结构
循环结构的基本组成部分,一般可以分为四部分:
- 初始化语句:在循环开始最初执行,而且只做唯一一次。
- 条件判断:如果成立,则循环继续;如果不成立,则循环退出。
- 循环体:重复要做的事情内容,若干行语句。
- 步进语句:每次循环之后都要进行的扫尾工作,每次循环结束之后都要执行一次。
数组:是一种容器,可以同时存放多个数据值。
数组的特点:
- 数组是一种引用数据类型。
-
数组当中的多个数据,类型必须统一。
- 数组的长度在程序运行期间不可改变。
动态初始化数组的格式:
数据类型[] 数组名称 = new 数据类型[数组长度];
-
- 左侧数据类型,也就是数组当中保存的数据,全都是统一的什么类型
- 左侧的中括号:代表我是一个数组
- 左侧数组名称:给数组取一个名字
- 右侧的new:代表创建数组的动作
- 右侧数据类型:必须和左边的数据类型保持一致
- 右侧中括号内数组长度:也就是数组当中,到底可以保存多个数据,是一个int数字
- 使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
- 如果是整数类型,那么默认为0;
- 如果是浮点类型,那么默认为0.0;
- 如果是字符类型,那么默认为'\u0000';
- 如果是布尔类型,那么默认为false;
- 如果是引用类型,那么默认为null。
静态初始化基本格式:
数据类型[] 数组名称 = new 数据类型[] {元素1, 元素2, ...};
数据类型[] 数组名称 = {元素1, 元素2, ...};
访问数组元素的格式:数组名称[索引值];
-
- 索引值:就是一个int数字,代表数组当中元素的编号。
- 索引值从0开始,一直到“数组的长度-1”为止。
数组赋值内存图:
数组引用类型图:
数组中常见问题:
-
- 如果访问数组元素的时候,索引编号并不存在,那么将会发生数组索引越界异常ArrayIndexOutOfBoundsException。
- 数组必须进行new初始化才能使用其中的元素。如果只是赋值了一个null,没有进行new创建,那么将会发生:空指针异常NullPointerException。
注意事项:
- 静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。
- 如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。
java中的内存划分(5个部分)
- 栈(Stack):存放的都是【方法中】的局部变量。方法的运行一定要在栈当中运行。
- 局部变量:方法的参数,或者是方法{}内部的变量。
- 作用域:一旦超出作用域,立刻从堆内存当中消失。
- 堆(Heap):凡是new出来的东西,都在堆当中。
- 堆内存里面的东西都有一个地址值:16进制,堆内存里面的数据都有默认值
- 规则:如果是整数,默认为0;如果是浮点数,默认为0.0;如果是字符,默认为'\u0000';如果是布尔,默认为false;如果是引用类型,默认为null。
- 方法区(Method Area):存储.class相关信息,包含方法的信息。
- 本地方法栈(Native Method Stack):与操作系统相关。
- 寄存器(PC Register):与CPU相关。