常量就是指在程序中直接出现的一些数据,也叫字面量。
常量都有哪些:
- 整数常量:在计算机中二进制,八进制,十进制,十六进制都可以代表常量。
//整数常量 System.out.println(10); //十进制整数 System.out.println(0b1001); //二进制整数 打印出来是十进制 System.out.println(0123); //八进制整数 System.out.println(0xAF3); //十六进制整数
- 小数常量
//小数常量 System.out.println(3.14); System.out.println(5.234e3);//5234.0 System.out.println(1.2e-3);//0.0012
- 字符常量:由一个字母、数字、符号被单引号( ‘’ )标识的数据
//字符常量 System.out.println('a'); //System.out.println('ab');ERROR System.out.println('9'); //System.out.println('12'); ERROR System.out.println('我'); System.out.println(' '); //System.out.println(''); ERROR //System.out.println('''); ERROR System.out.println('\''); //打印 ' System.out.println('\n'); //打印 换行 System.out.println('\t'); //打印 缩进
- 字符串常量:由若干个字母、数字、符号被双引号( “” )标识的数据
//字符串常量 System.out.println("abcd"); System.out.println("a"); System.out.println(""); //字符串空串 vs null真空 System.out.println("\"");
- 布尔类型常量
//布尔常量 System.out.println(true); System.out.println(false);
- null常量
变量指的是变化的量,变量的本质就是在内存中程序所处的进程中的一个临时存储区域。
该区域中 存储值的限制 和 数据的变化类型 由 数据类型 来决定。
在Java当中,数据类型主要分为两大类:
- 基本数据类型:在变量的空间中存储数据,整型、浮点型、字符型、布尔型; (1)整数类型
(2)浮点类型(小数)
(3)字符类型
(4)布尔类型
在常量中,整型常量默认int类型,小数常量默认是double类型
boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。
JVM 会在编译时期将boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。JVM 支持 boolean 数组,但是是通过读写 byte数组来实现的。
- 引用数据类型:数据是在堆内存中存储,变量仅仅存放的是数据在堆内存中的地址。
(1) 字符串
(2)数组
(3)对象在Java中,但凡存储在堆内存中的数据,统称为对象
该区域中 其空间的分配 和 空间的物理内存地址 由计算机底层来决定。
运算的结果为布尔类型
数据类型 变量名 = 布尔表达式 ? 值 1 : 值 2 ;
例如:int number = 10 % 2 == 0? 10 : 2;
循环主要解决具有规律性的且具有重复性的代码问题,避免程序冗余。
循环四要素:
(1)循环的初始化:循环的第1次执行从哪里开始;
(2)循环的继续条件:循环从当前轮是否向后执行下一轮;
(3)循环体:需要被循环执行的部分;
(4)循环的步长、周期:当前循环到下一轮循环之间的变化。
我们常见的循环问题可以分为两大类:
已知循环次数的 一般用for语句做;
未知循环次数但是已知循环结束条件 一般用while语句做。
for (1循环的初始化;2.循环的继续条件;4.循环的步长) { 3.循环体 }
1-2-3-4-2-3-4-2-3-4-2不满足则结束循环
while循环主要用于解决循环次数未知,但循环结束条件已知的情况。
while其实和for循环是可以相互转换的,是因为都逃不开循环四要素:
for (int i = 1; i <= 5; i++) { System.out.println(i); } //可以转换为while循环 int i = 1; while (i <= 5) { System.out.println(i); i++; }
while的语法格式:
1.循环的初始化 while (2.循环继续条件) { 3.循环体 4.循环的步长、周期 }
break在循环语句中叫做终止语句,终止的是break最近的一层循环。
continue在循环语句中叫做跳过语句,跳过本次循环开启下一轮循环。
public class Sample { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { if (i == 3) { break; } else { System.out.println(i); } } //结果 1 2 for (int i = 1; i <= 5; i++) { if (i == 3) { continue; } else { System.out.println(i); } } //结果 1 2 4 5 } }
数组主要用于解决大量数据计算与存储的问题。
比如:输入100个数字,统计其中的最大值和最小值并计算平均值,创建100个变量,会有一堆if- else语句,比较麻烦。
数组是Java提供的一种最简单的数据结构,可以用来存储一个元素 个数固定 且 类型相同 的有序集。
数组本质上就是在堆内存中一系列地址连续且空间大小相等的存储空间(变量),每一个存储空间用来存储数据(基本,引用)。
数组是在堆内存中存储,称之为是一个数组对象,并且在堆内存中存储的数据都有 默认初始化的流程。所以数组创建之初,每一个存储空间里面都会被JVM初始化该数据类型对应的零值。
数组的地址是连续的,所以通过公式:An=A1+(n-1)d 可以快速访问到其他的元素,所以对于数组而言查找元素比较快的。将元素的真实物理地址转换成对应的角标获取元素。
如何来调用数组呢?通过一个变量 存储该数组在堆内存当中的首元素的地址。
当数组一旦定义出来,其长度不可变,存储空间的内容是可变的
所以我们在定义数组的时候,要么把长度固定,要么直接输入相关的元素。
创建一个指定长度且指定数据类型的一维数组,名称为数组名,虽然没有指定元素,但是会有默认值 。
数据类型[] 数组名 = new 数据类型[长度];
创建一个指定元素且指定数据类型的一维数组,名称为数组名,虽然有指定元素,但是还是有默认初始化这个步骤的。
数据类型[] 数组名 = new 数据类型[]{数据1,数据2,...,数据n}; 数据类型[] 数组名 = {数据1,数据2,...,数据n};
二维数组,在表现形式上就是一个表格,在操作表格的时候以行列来操作。
所谓的二维数组,本质上就是一个一维数组,只不过该一维数组里面的元素是另一个一维数组而已。
问:一个4×5的二位数组,一共有几个一维数组组成?
5个:最外层一个+四个子数组。
数据类型[][] 矩阵名 = new 数据类型[row][col];
int[][] matrix = new int[3][2];
数据类型[][] 矩阵名 = new 数据类型[][] {
{…},
{…},
{…}
};
数据类型[][] 矩阵名 = {
{…},
{…},
{…}
};
int[][] matrix2 = { {1,2,3}, {4,5,6}, {7,8,9}
函数的定义就是指一段具有独立功能的代码,减少代码冗余,提高程序的利用率和效率。Java中,函数又被称为方法。
函数的主要作用是为了提高代码的复用性。
函数的语法格式:
修饰符 函数类型 返回值类型 函数名(数据类型 数据1,数据类型 数据2,…) {
独立功能的代码片段;
return函数的计算结果;
}
函数的分类:
总结定义函数时需要考虑的有哪些?
- 函数的运行有哪些未知的参数?
- 函数的运行结果有是什么?
- 明确参数和结果
- 明确内容和返回
- 函数到底要干什么?尽量将独立功能且重复性较高的代码片段提取出来
函数的运行是基于栈运行的:
栈:是一种先进后出的容器,我们这里面所说的栈是指JVM中的栈内存空间。
每一个函数,叫做栈帧 —— 栈帧中所包含的内容有函数的定义,参数列表,函数的执行内容代码每一个函数要运行,就相当于这个栈帧进入到栈内存中 ——入栈,如果一个函数即将结束,将这个栈帧从栈顶移出——出栈
如果栈内存中有多个栈帧,运行的是最上面的栈帧,底下的栈帧暂停运行,直到该栈帧为栈顶元素。
比如:主函数先进栈,开始逐行运行,如果执行到第n行,调用另外一个函数A,则主函数在第n行暂停运行,将另一个函数A的栈帧入栈,再继续逐行运行,直到函数A的内容执行完毕,函数A出栈,主函数接着从第n行继续向下执行。以此类推。
函数运行进栈出栈图
同一个类中可以出现多个同名函数,这个现象就叫做函数的重载(overload)。
如何来区分同名函数是否是重载关系呢?
下列哪些是该函数的重载:
函数的递归就是指函数自身调用自身。
写递归时,一定要先确定递归结束条件——递归边界。