Java语法基础笔记
1 编译与执行
java源代码(.java)<(java编译器编译)>
java字节码(.class)+ 库代码 <JVM执行(Java解释器)>
2 从控制台输入输出
System.out(in)表示标准输入输出设备
使用Scanner类创建对象进行读取
Scanner input = new Scanner(System.in); //将System.in引用值赋给input
然后通过调用Scanner的方法获取input的值
double a = input.nextDouble();//读取时以空格或者回车键为分隔
3 命名常量(大写所有字母)(用final修饰符)(这是方法中局部变量的常量)
final int PI = 3.14;
4 Java8种基本数据类型
带符号整数(符号占一位):byte 8 short 16 int 32 long 64
IEEE754标准浮点数:float 32 double 64(复习下IEEE754)
boolean 1位 true 或 false 都是直接量 保留字
char 16位 存储Unicode码
(其实还有void 但不可以直接操作)
5 算术操作符 & 关系操作符
五种算术操作符 “ + - * / % ” Math.pow(a,b) 幂运算
六种关系操作符
四种逻辑操作符 ! 非 && 与 || 或 ^异或(等同p1 != p2)
操作符优先级:
一定先计算括号里面的运算!!!(尤其是涉及到和字符串一起操作的时候)
同一级别的自左到右结合进行计算
其他的看一下优先级表(赋值最低 ! 在运算前 其他逻辑和关系都在运算后)
5.0/9 和 5/9结果不同!
增强赋值操作符 += 在表达式中所有其他操作符计算完成后执行 既是赋值语句也是赋值表达式
use(x += 9+9*7)
自增自减 ++ –
j = 10 * i++ 先计算后++
j = 10 * (++i) 先++后计算
三元运算符(唯一)
x = 布尔表达式 ?表达式1 : 表达式2 (为真执行1 为假执行2)
6 数值直接量
超过int范围的直接量后面要加“L”(表示是long类型)
表示一个二进制直接量使用“0B”开头,八进制直接用0,十六进制用“0X”
0B1111 07777 0XFFFF
带小数点的数值默认是double类型的,后面加上f或F才表示是float类型的
科学计数法 123.456 1.23456E2(或E+2)(表示10的2次方)0.0123 1.23E-2
数值之间可以用下划线隔开 231_453_234L
7 类型转换
小范围变大范围(拓宽类型) Java会自动拓宽
大范围变小范围(缩窄类型)必须显式完成
记住!浮点数的范围比整数大得多,虽然float只有32位,但是比64位的long表示范围大(3.4E38 double是1.7E308 而long只有0.9E19 int 0.2E10),long型可以直接赋给float
显示转换 (int)1.7 -> 1 (double) 1/2 -> 0.5
注意!x1 op= x2 的形式自带显式转换,运算完会转换成x1的类型
8 溢出问题
java中如果变量被赋予一个过大的值,就会溢出,但是Java不会给出警告或报错!只是你的值会变得不正确。
对于整数,如byte -128到127 127+1 -> -128 -128-1 -> 127(原码理解就可以)。对于浮点数,很接近0会向下溢出,Java会将其近似为0
9 取整错误
涉及浮点数的的计算都是近似的,所以在==时可能会遇到问题,要注意一下
还有double s = (2 + 3)/ 2 执行的是整数除法 只有(2+3)/ 2.0 才是对的
10 if switch
switch(表达式){
case 0 : XXX;
break;
…………
default : XXX;
}
11 常用的数学函数和random方法
Math.方法(数值)
Math.random() 返回一个0.0-1.0之间的double(不包括1.0)(只有一位小数?)
返回一个区间的随机整数 a + (int)(Math.random() * b) (a到a+b这个区间的一个随机整数,不包括a+b)
12 char类型
char有16位,可以存放一个Unicode码
Java支持Unicode
Unicode码 16位 用 /u开头的4位16进制表示 从/u0000到/uFFFF对应128个ASCII码
ASCII码 8位(只用7位来表示)常用 0-9 48-57 A-Z 65-90 a-z 97-122(数值对应)
char可以自增自减
转义字符 \ \n换行 \r 回车 \\ \“
char与任意数值类型可以相互转换(要显式转换)。
浮点数会先转换成int,整数类型会截取低16位进行存储
char转数值,会转成对应特定数值
0-FFFF任意一个正整数都可以隐式转成char,其他的必须显式声明
所有数值操作符都可以用在char上,char会自动变成数字,如果是字符串,就会将这个char连上去(数值也可以直接和string相连,j=99 j+”abb” -> 99abb)
char也可以直接用关系操作符比较
Character类提供了一些字符处理方法
13 String类型
java库中预定义的类,不是基本类型而是引用类型
实例方法 静态方法
“”表示空字符串,其length为0
Scanner的next()方法读取以空白字符结束的字符串
14 基本字符串函数(可以看看源码实现)
charAt(index) 提取特定字符,0到size-1 注意不要越界
substring(beginIndex,endIndex) 截取字符子串,可以没有endIndex
获取字符或子串的下标的方法 (last加了这个前缀就是从后向前找,不加就是从想象后)indexOf(ch/s1,FromIndex(可以没有))
trim()用于删除两端空白字符(包括一些转义字符)
直接使用 + 进行字符串连接 +=也支持
字符串和数字或者char连接都是直接连接,注意也是左结合的,有括号先算括号
== 与equals的区别,涉及到堆栈的问题
不能使用 > < 来比较字符串 用compareTo(s2) 来代替 (equals返回true false 而这个是逐个字符比较,返回 正数 0 或者负数)
contains(s2)判断是否是子串
可以用XXIgnoreCase(s2) 来忽略大小写
starts/endsWith(s2)
字符串可以与数字间相互转化
int num = Integer.parseInt(“123456”);(num就是123456) (double的字符串数值也可以用Double.parseDouble(“123456”)来实现)
数值转字符串直接 String s1 = 数值+””; 即可
15 循环 while do-while for
foreach 用于遍历数组 for(元素类型 e : 数组变量)顺序遍历数组中每一个元素
16 输入 输出重定向
17 方法 包括方法头和方法体
方法头包括 修饰符(public protected private ; static 可以都有) 返回值类型 方法名 参数列表
方法体 处理逻辑 返回值
形参 实参(调用时)
main方法由Java虚拟机调用
调用方法时会创建一个活动记录(活动框架),用于保存方法中的参数和变量。活动记录位于一个内存区域,称为(调用、执行、运行时)堆栈(call stack),当一个方法调用另一个方法,调用者的活动记录保持不动,一个新的活动记录被创建于被调用的新方法(本质是一个stack,一个方法调用给一块空间,先进后出)
当调用放回时,空间被释放(这一块要去看一下JVM,看一下底层是怎样实现的)
Java只有一种传参方式 按值传递(pass by value),当方法调用时将实参的值传给形参,形参的变量是独立的,不影响实参本身(引用变量不是)(这个要结合引用和复制)
18 方法重载 有相同的方法签名 但有不同的参数列表(但要注意不要歧义调用)
19 方法抽象(将使用和实现分离)和逐步求精(分治思想)
自顶向下设计 -> 自顶向下和自底向上的实现
20 数组
元素类型 [] 变量名 = new 元素类型[数组大小];
(1 使用new 创建了一个数组并分配内存空间 2 将这个数组引用赋给变量)
数组变量存储了指向数组的引用(内存地址)
所有数组元素都有默认值,0 \u0000 false
匿名数组(在方法调用实参直接new数组 new []{ } )
数组的复制() 数组的传递(传递的是引用)
JVM将对象存储在 堆(heap)中,堆用于动态内存分配
在程序运行时,会将数组创建于堆中,而方法被调用时,变量会存在栈中
方法返回的数组实际上是传的是数组的引用
可变长参数列表 方法名(XXX,变量类型…变量名) 必须是最后一个变量,代表是可变长参数,Java将其看做数组处理 调用的时候可以传入一个不定长的参数头,或者直接传一个数组 ( pixi(XXX, 34,4,5,5.5)或者 pixi(XXX,new []{}))
Arrays类是util工具类中对数组的一些方法 尤其是sort和parallelSort(要看下JDK的实现源码)
toString(s1) 返回一个字符串,包含数组所有内容
equals(s1,s2)检测两个数组内容是否相同
main方法实际上就是一个静态的、参数是字符串数组的普通方法。main方法可以被其他类的方法调用(因为是 public static void 的)当调用main的时候,Java解释器会new一个数组存储 命令行参数 没有参数会创建一个length为0的数组,而不是null!
问题:匿名数组和数组直接量有什么区别?尤其是在方法传参的时候(会不会Java解释器自己创建一个数组来存储命令行参数,然后再传给方法?)
21 多维数组
元素类型 [] [] 数组名 = new 元素类型 [行数量] [列数量]
初始化 = { {……} {……} {……} } ;(一行一行的)
x[0] x[1] x[2] 都是一个一维数组的引用 一个框是引用 两个框是地址
锯齿数组 各行长度不同的数组,可以new行数,这样就给定了第一维的地址空间,然后再分别new每一行的数组的长度(实际上和邻接表很像,只是第一维的数组的元素不是链表,而是顺序表) int [][] array = new int[行数][] 然后每一行 array[0] = new int[每一行的个数]
传递二维数组,返回二维数组的引用 int [] [] array
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!