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



Java基础

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!