结构
1、public修饰class/method-没有的话可以正确编译,但是无法从命令行执行。
2、java入口程序规定的方法必须是静态方法,方法名必须是main,括号内参数必须是String数组。
3、每一行语句必须以分号结束。
4、注意注释的方法-单行/多行
5、macOS快速格式化快捷键-四方格+上+F
一、变量
1)基本数据类型
整数(type1、long8)、浮点数(double8)、字符(char表示ASCII/Unicode)、布尔
对于float类型,需要加上f后缀
char使用单引号‘,且仅有一个字符,字符串是双引号“
2)引用类型
最常用的String字符串
3)常量
如果加上final 修饰符,即定义的变量变成了常量,不可再次赋值。
4)关键字
var代替变量类型 用赋值语句来让编译器get变量的类型
二、整数运算
正常运算,注意除法,除法取整数
整数的除法对于除数为0时运行报错,编译不报错
溢出问题:溢出不报错,会得到一个溢出的结果数字。如果溢出,可以考虑把类型从位数较短的类型变为长类型
1)移位运算
左移<< 右移>> 有符号运算
无符号右移运算 >>> 高位永远补0
对byte和short进行移位,先转为int再位移
2)位运算
按位进行与、或、非、异或的运算。
与-都为1则为1 都为0则为0 不同则为0
或-有1就为1
非-0和1互换
异或-不同为1 相同为0
3) 运算优先级
()
! ~ ++ –
- / %
<< >> >>>
&
|
+= -= *= /=
可以用括号保证最高优先级
4)类型不一致-自动转型/强制转型
1、如果参与运算的两个数类型不一致,计算结果为较大类型的整型。
ps short类型是16位(2bytes) int 32(4bytes)
2、结果强制转型
超出范围的强制转型可能会出错,因为高位字节会直接被扔掉,别省内存,不划算。
三、浮点数运算
加减乘除
浮点数常常无法精确表示
如果整型和浮点型运算,整型自动提升到浮点型
浮点数运算除数为0时,不会报错(NaN表示not a number,Infinity无穷大,-Infinity负无穷大)
ps 如果要进行四舍五入,可以对浮点数加上0.5再强制转型。
ps注意 java的定义是,不能像python那样多个变量一起比如double a=b=x,这样会报错,因为实际上只定义了a
四、布尔运算
boolean 两个值 true/false
比较运算>,>=,<,<=,==,!=
与运算&&
或运算||
非运算!
优先级顺序如下:
!
,>=,<,<=
==,!=
&&
||
记不住老规矩上括号
短路运算
如果布尔运算能提前确定结果,则后续计算不再执行,直接返回结果。
eg false && x 永远是false so 不管x是啥 不管直接得到结果返回false
所以在这个case里,x就算其实是一个报错的含义(x=1/0比如除以了0可能会得到无穷大)也不会出现报错的
同理||
三元运算符
格式
b ?x :y 根据第一个布尔表达式的结果,返回后续两个表达式之一的计算结果。
eg 求绝对值会很好用
注意 这个式子会首先计算b 如果b为true 则只计算x,否则只计算y,x和y类型必须相同。返回值是x和y之一
note
与python进行对比,在python中 a<x<b,这种condition是合法的等同于x>a and x<b,但是java中比较结果是不可传递的,对java来说相当于a<x得到结果一个boolean值,然后用这个值和数值b比较是不可以的。
五、字符和字符串
字符
char (character),一个char保存一个Unicode字符:
eg char c1 = ‘A’
java在内存中总是使用Unicode表示字符,所以一个英文字符和一个中文字符都用char类型表示,都占用两个bytes。
显示一个字符的Unicode编码,只需要将char类型直接赋值给int类型即可。
/或者
使用转义字符’\u+Unicode’编码来表示一个字符
字符串
string是引用类型 “” 双引号表示字符串,可以储存0-任意个字符。
ps注意 空格也算一个字符的
ps2注意 如果字符串本身包含一个“双引号,需要借助转义字符
eg 对于abc”123 是要写成 “abc"123"
ps3注意 如果字符里包括转义字符\,那么需要\来表示转义字符hhhh套娃的快乐。
ps4注意 常见的转义字符
" 表示字符"
’ 表示字符’
\ 表示字符
\n 表示换行符
\r 表示回车符
\t 表示Tab
\u#### 表示一个Unicode编码的字符
字符串连接
java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型。
eg string1=’a‘,string2=’b‘,那么string3=string1+string2=ab 或者 string3 = string1+” ” +string2 +“!”=a b!
对于连接对象不都是字符串的时候
如果用+连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串再连接
eg int age = 25; String s = "age is " + age;
s实际上= “age is 25“
多行字符串
String s = “first line \n”
+ “second line \n”
+ “end”;
java 13之后,可以用"""…""“表示Text Blocks
并不用写很多"以及很多\n
第一行只写”"" ,后面的根据自己格式写
不可变特性
这个地方可以参考理解 指针的概念。(如果理解指针就很好理解这个了啦)
比如说 String s= “a”;打印s 是 a
然后s = “b”;打印出来是b
但是在这个过程中,这两个字符串本身没变,是s指的位置变了,在第一句时,jvm虚拟机先创建字符串“a”,然后把字符串变量s指向了这个字符串;然后创建了字符串“b”,再把变量s指向了后来的字符串
这里就是 字符串类型所说的 “引用类型”。
空值null
引用类型的变量可以指向一个空值null,也就是指向一个不存在的东西,即这个变量不知向任何对象。
note
记住 java里每一个新的变量你都要记得定义,python里可以string = int(a)+int(b)+” “;但是java里你的int(a)和int(b)没有定义啊啊啊他们本质上还是原来的类型。
char类型之间的运算本质是把char类型提升为int类型输出对应的字符,so是小数据转大数据很自然的提升;
但是int强制转换char时,在java中使用的是(char)x,和python不一样。
数组类型-值类型、引用类型
数组定义
int[] ns = new int[5];
ns[0] = 68;
ns[1] = 69;
…
定义一个数组类型的变量,使用”类型[]",数组变量的初始化必须使用 new 数据类型[x] 表示创建一个可容纳x个元素的数组
java数组的一些特点:
1、数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false;
2、数组一旦创建后,大小不可改变。记住了不可改变┗|`O′|┛ 嗷~~。
访问数组元素,使用索引。
数组变量.length获取数组大小。
可以在定义数组时直接指定初始化的元素,可以不必写数组大小,编译器自己很懂事的会懂。
eg int[] ns = new int []{68,78,65,43,45};
或者 int[] ns = [1,2,3,4,5]
ps note 数组是引用类型,参考前面String,且大小不可变,引用就还是,变得不是数组,是指向数组的位置变了。
字符串数组
数组元素是一个引用类型的元素。
eg 定义一个字符串数组;
String[] names = {“ABC”,“xyz”,“123”};
对于这个字符串数组的数组变量names,包含3个元素,每个元素都是指向某个字符串的变量;
对names[1]赋值,eg names[1]=“cat”;
xyz没变,是指向xyz的引用指向了“cat”,xyz还在,只是无法通过names访问了。
建议看下下图
┌─────────────────────────┐
names │ ┌─────────────────────┼───────────┐
│ │ │ │ │
▼ │ │ ▼ ▼
┌───┬───┬─┴─┬─┴─┬───┬───────┬───┬───────┬───┬───────┬───┐
│ │░░░│░░░│░░░│ │ “ABC” │ │ “XYZ” │ │ “zoo” │ │
└───┴─┬─┴───┴───┴───┴───────┴───┴───────┴───┴───────┴───┘
│ ▲
└─────────────────┘
太好理解了,真的超级喜欢廖大大的教程。