1. java 变量+ e1 ~# @' R/ h2 e3 K
1) 变量就是自然语言中的代词 % y# ?5 _$ ~9 L) Z8 Q Person he; int age = 15; 3 f( q3 g( Q% D/ k1 R; Z) z# B/ E
//age= 00000000 00000000 00000000 00001111 7 N7 s7 e7 q L* I/ H! X1 y0 a8 e System.out.println(age);//15) m, y7 v+ n& Q! j' o' N) B, b
2) Java 中的变量, Java是强类型语言, * }; @1 R& b D: Q( a A 变量必须声明,并且初始化以后使用 int i=0;, j/ ]7 O6 _# I6 C9 S4 A
B 变量必须有明确的类型 * e1 a) `/ e: }) z7 R2 T; T C 变量不能重复定义* }, o5 p+ k6 x1 H$ f j2 s2 f! A9 L
3) 变量的作用域2 k* z" L0 [) E/ B/ U2 |
a 在声明的地方开始,到块结束为止- |2 @& A) L; [2 M# q) |: ?4 G v; ?
b 离开变量的作用域结束,变量将回收。 7 }" H% n6 k/ H v ! q3 e9 i0 H- U" N6 K2. 进制转换基础$ l' r! N; Q. j7 m
1) 十进制 3 \) H% f' c& b4 t1 j3 L( @0 m
逢10进1 : U* C9 y, D! ?, o7 E. S# n. [ 基数: 10" M# a) l# \# s! K! c9 r! D6 `" V
权: 10^n, 10000 1000 100 10 1& S& W- G! y9 L
23678(10) = 2*10000+3*1000+6*100+7*10+8*1 : S* x* u# Y# D; o0 t
= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0 1 b; J& P& ~) k/ H2 C8 f
= 236791 S6 j& P4 G1 d, @. U! k
$ a' W& }, A3 R' D& m 2) 二进制7 g# z& v! M* l6 ]+ o8 w. V* T
逢2进1 - o4 Z; o- C) w: e6 h 基数: 24 T& E( u% @4 y% j
权: 2^n, 128 64 32 16 8 4 2 1 + O5 |6 J& h, f" \. F* Y M
01000001(2) = 1*64 + 1*1$ Y$ Q A$ P* U0 Y
= 65(10) - |. z( r; s# \$ ^$ e) o$ E 3) 补码基础. X+ C. P6 _1 M7 o& I' c* M! ]) L
-128 10000000 11111111 11111111 11111111 10000000 % a6 i: I& ~4 u3 m: }10 2进制 ... ... & P5 }- E5 C9 u' @$ _. E 8421 11110111 11111111 11111111 11111111 11110111/ w% u' H* ~7 t5 _: v, b" t
-8 1000 11111000 11111111 11111111 11111111 11111000 - I2 a! U: X N% U2 O: b: f0 p) |
-7 1001 11111001 11111111 11111111 11111111 11111001 " M' \0 X7 A- }4 `-6 1010 11111010 11111111 11111111 11111111 11111010- X/ t ?' b ~+ ~
-5 1011 11111011 11111111 11111111 11111111 11111011% Y$ \! q. N2 [- y! J
-4 1100 11111100 11111111 11111111 11111111 11111100 ; @5 w9 d* I$ T6 @-3 1101 11111101 11111111 11111111 11111111 111111016 b; h$ ?0 T3 g! `
-2 1110 11111110 11111111 11111111 11111111 11111110 8 W& M, e5 x3 N% Q7 @0 x- a" v$ d-1 1111 11111111 11111111 11111111 11111111 11111111# l" N3 n. e) H3 @' L
0 0000 00000000 00000000 00000000 00000000 00000000 " r2 L9 T3 G, }0 ^1 _ 1 0001 00000001 00000000 00000000 00000000 00000001 + E1 ]) @1 l9 W* X 2 0010 00000010 00000000 00000000 00000000 00000010 / ]: j8 o1 }6 [7 k 3 0011 00000011 00000000 00000000 00000000 00000011% A3 _- R+ _" P$ A8 L3 K3 W; I& A0 r
4 0100 00000100 00000000 00000000 00000000 00000100 1 }5 z) y( q- N6 E( U 5 0101 00000101 00000000 00000000 00000000 00000101& [; j& d5 E, o2 i
6 0110 00000110 00000000 00000000 00000000 00000110 - R: Q( v; X. F 7 0111 00000111 00000000 00000000 00000000 00000111 , r. Q, @- o- Y# [5 w2 F4 I$ M
00001000 00000000 00000000 00000000 00001000 & D {0 ?1 a9 }% Y .... ... ! t5 S8 _7 J6 R% p- c4 K5 O+ H8 | 127 01111111 00000000 00000000 00000000 011111110 |2 r" d0 h6 p6 P0 |
补码运算: 6 v: h5 _$ q/ ]7 p9 C! L -1 1111" q! ~, \: B0 g
-1 1111 3 Y* T- J& y& E2 E+ W' ` * 2 Y; C+ `: F9 w# F ---------- ; Z3 M( C P# C4 a1 r1 a
1111; S, Z2 j& a0 P" Z# c( Q+ v" c
1111 - H( G. d% n+ k3 p3 @ a4 V1 d" i 1111 % T: ]6 k. G7 Z. T" e: @3 j 1111' R, D" `& d8 N
1010101 ' W( U C) n0 o3 L b- B1 w -----------5 }- q' ]* @9 o1 g1 R" G
0001 . r! w" M7 s; G7 }, {; L. y) x& m& z. ~6 j( N+ f# d2 A
4) A Java 内部只有二进制补码 + `6 C- O4 E8 T" o$ J* H B Java 内部采用补码运算, 自动发送上溢出和下溢出+ z& a) q: C! v
C Java内部没有10进制! 但是Java尽量按照人类习惯输入输出+ _( ? N5 `$ a1 A. N) [% |$ I
D 补码的负数 最高位是 1, 也称作符号位/ y0 _' |4 ^- h9 y" J1 T1 Y
5) 16进制, 是2进制的简写, 方便专业人员书写2进制数据 9 n5 z% f. G2 {# N$ Y+ L 16进制7 e; N L( {2 ]6 k( T: e; R0 D
逢16进1 $ H' \+ U6 v. M" W% H 基数: 16 3 T# C* z. u0 ~: M* e0 A 权: 16^n, 256 16 1 & o F% `- O( m3 e
16进制数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f' e7 D( i7 @: _2 A* e2 v
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 C7 k# k j- H. n4 J4 Q + t9 p8 S( C: @ _2 x* {* g( J8 g 41(16) = 4*16 + 1*1 6 b- F) l9 S/ f6 A& Z, D = 65(10): v9 G e& r& h# X
= 0100 0001(2) , D2 B2 f; D- I6 s 8421 8421 " L' z8 F( |) C C 4 1 (16) ( l$ y) I% M/ ` Y# h+ n# ?0 x8 Y5 V$ C- C( i
128 64 32 16 8 4 2 1 . y# p6 T/ I& K @& z* N0 H
0 1 0 0 0 0 0 1 - F. L( t8 x6 s5 }) ^ 练习:转换以下十进制为二进制 192(10) 137(10) 145(10) 0 O2 c1 x+ a9 [: a; I n/ d) } 192(10) = 1100 0000 (2)# @& |2 M" U# \! t+ I3 U4 {. W
c 0 (16) 8 B* y8 j h2 S4 s% I# Z -8(10) = fffffff8(16)8 K4 c" J6 U9 K8 i- t- e
进制总结: ) g8 L0 H# j* T! N: m8 p6 G 计算机内存只有 二进制补码 " `; q2 v) z* C 默认输出, 按照人习惯输出10机制结果' _9 k: n- J \4 t
16进制是, 二进制的简写, 16进制本质就是2进制0 u4 n" d& ?1 D+ Q) E E
16进制存在的价值: 方便书写2进制!$ I% c& J7 p) m( o; N
5 l+ \# @, j8 Q7 _
3. Java 数据类型: 分为引用类型和基本数据类型 & q9 o" e0 s" g" g' s% {* } 1) 基本数据类型: 8种 ' A9 I. }- L' o0 b byte, short, int, long , O7 z" Z, w. `6 g; `0 K; I float, double - J' _ i9 @( R. j+ T/ G: w char 0 A6 Z& M" z9 n$ ^0 q& E boolean& h" p2 N; P; h: i2 z
2) 整数类型 byte, short, int, long, 都是有符号(补码)整数 1 p) r1 I% r# ]* q* n/ g byte 8位补码 最大值 0x7f 127 最小值 0x80 -128; b6 t+ G* K" I- T4 g( B5 J( p
short 16位有符号数 0x7fff 32767 0x8000 -32768' Q2 e+ z! O8 }( O8 M% i/ b+ S
int 32位 0x7fffffff 2G-1 2^31-1 21亿 0x80000000 -2G , |9 j8 x8 s2 y2 }9 T long 64位 ....2 N3 A7 I/ F# p( s4 B9 D
整数字面量(直接量) 默认是int类型, 如果不超出范围, 可以给0 s, i, i7 o0 }$ Z# q' A# j
小类型直接赋值." E2 ^% _0 E0 Z% N. r& R0 j% Q( K
使用整数类型(byte, short, int) 要注意取值范围, 超范围运算 * m F) r, I5 u java 底层byte,short 按照32位计算 7 \" p' g7 ~* U+ H& t3 Y) h) E9 N' O# M" ~& c1 \
long 类型的字面量使用"L","l" 后缀- q6 N5 f) `- u1 N1 X, T
( ^5 U) O& n( l: V+ q
3) 浮点数, 小数 (不必掌握 浮点数的存储方式)) p1 }! |1 |- y+ r% p
浮点数原理: 10进制浮点数(科学计数法)原理6 p# L, m+ F% \, j8 t0 z
2356189. = 2.356189 * 10^6 - f C. _2 I* y1 a 概念: 尾数: 2.356189 " E$ h6 w- e9 d9 i7 o; d) @
指数: 6 # a+ \. V* P- k5 f 基数: 108 p7 H- ^, L% J
pi = 3.14 & `7 K! G4 I6 Y7 H 3.1415926535897932384626433 & [$ j0 s0 J! h f) Q- Y3 p3 J$ q: P2 B! j6 O; [3 M # C3 Y z0 g. _: X9 r# b! l 二进制浮点数:& H+ q- g3 O4 i8 T! {5 g0 v
101001010101. = 1.01001010101 * 2^10116 I" r7 ?2 {& b$ y: x/ o% s
概念: 尾数: 1.01001010101: _4 i( e4 d7 @) K
指数: 1011 ! f- p ^" l( } X3 g* M 基数: 2 " ^% j, g1 H1 q, |8 U& q' d , n/ m H3 j1 |* l, X float: 32位 其中: 1位符号位, 8位指数, 23位尾数! B2 w9 _7 ~' ?! Q
+ U7 F( f, _# K P+ y 精度: 23 位 : I- I- s8 F; A! @ int max = 01111111 11111111 11111111 111111113 J- E, ]# F. E" ^; i3 M5 s, }
float f = 1.111111 11111111 11111111 1 * 2^00011110( D2 i+ V- L% n- ?8 c" Q- E
' i3 K4 R7 h, I) [
double: 64位 其中: 1位符号位, 11位指数, 52位尾数 4 ], p6 |5 r5 t; e( ` / G/ e6 I* l3 _! a) B6 |0 E( O 浮点数的字面量: 默认是double, D d 后缀是double, f F 是float, W4 y$ @. ^* g K, L2 U R) A
' n& `0 C' W9 v
4) 字符类型 char, 字符是一个16位无符号整数, 是一个二进制数 ( Y* u, b$ [/ i 数值是一个字符的unicode编码值. ( X' D7 Q; q' H" P) P3 x4 W) b4 }
unicode 编码: 是全球范围内的编码方法, 编制了英文, 中,日,韩4 g R1 l1 }9 k5 g/ }! U+ Z
阿拉伯, 希伯来, ..... 8万+ 字符6 x1 }6 N0 i- y$ L D) e
其中英文部分与ASCII 兼容, 英文字符和数字是连续编码的. ) H8 }+ {2 b/ D- r o ASCII: 0~128 $ F! k- G9 W. V4 B3 z, n: x+ ^ Java char 的范围 0~65535 不能表示全部unicode 但是可以表示: S* V5 d. g' @# G4 O
unicode只能够最常用的部分 s, R; `6 s+ G0 R; i! C4 N * S. Z! R* N- Z' C( S *最小值:0, 最大值:65535 = 2^16-1: W6 G5 A( e8 L7 }1 j
*字符字面量使用单引号为定界符号:'中' '0'->0 '4'-'0'->4 E4 V7 j. Z$ i n) Q [" W& b
字面量也是整数常量! 52 48 e! d) n% {$ B/ U
特殊字符采用转义字符表示: 8 v3 a5 j8 x9 N! n: a( G! R) z 如: '\n' '\t' '\\' '\b' '\r' . O0 d! ^; ~5 l6 b ^1 {. b& u '\'' '\"' '\u4e2d' 5 r. S4 @. y2 S9 H" ~ r! @1 i) j0 A. f7 J8 }, {* v0 A3 c; |9 v: S
char c = '\\';4 T- a% M) h0 u
& {- [2 P- N- {# ~9 _6 y 'X' - 'A' = N & Q) r( q3 Y9 T 'x' - 'a' = N4 H$ c2 m. K; H( t0 X# ?
X = 'c' - 'a' + 'A'# O( d/ e9 T3 _ H
* f- [( R2 k' e6 _( _ P
5) boolean 布尔类型 表达: 真(true)/假(false)' A$ x9 I9 I j$ z% L6 e( {! x
建议使用长变量名定义变量 y4 h9 E' E0 o, B' M
boolean started = true; * n A+ H2 `( } boolean isMan = true;3 k4 B+ q" s6 ]/ F# m' L
isMan = false;4 l' `% i) M- g# W8 Y) o$ M- v( d
boolean used = true;//二手的( p7 x4 L2 T \/ k, i; I
if(used){: T, x' g* }- H
System.out.println("打八折"); 9 O$ |4 X, a4 W9 {7 N
} ! r, _+ m5 Y( q1 } 不建议 定义没有意义的变量- ~' k8 b: _ W, o
boolean u = true;//u = you9 b$ ~. K; X; N/ g# W
boolean flag = false;4 K& R+ D. ^+ W( m, E. t+ k
! u0 a& G- S- i* n) }) O* Q
if(flag){. ?! G8 N, [6 _8 m" W
System.out.println("打八折"); . e$ s+ Y0 m1 E6 x
} , H4 _0 A9 Z* v1 J
D4 V( F2 D6 |6 P$ W9 s
4. 数据类型转换 / I8 \) l: [+ k4 M$ _5 K; A6 \
char -> 4 F% l; D4 {7 I/ c' D3 r byte -> short -> int -> long -> float -> double 5 Z/ p7 N4 u# I; x, Z/ C3 V+ V% a, x1 J5 @: m
1) 自动类型转换,正方向,小类型到大类型的转换会自动完成& s* _; }6 u3 C4 R
符号位会自动扩展, 负数补1, 正数补0, 保证补码数值不变. L6 D6 J. O; M8 y8 K* W
注意, 整数到浮点数转换会损失精确度4 Q% l! Q4 E7 u3 {2 e5 D& y
自动类型转换也叫"隐式类型转换", 是自动发生的, 一般不需要处理& ]! u L; T, w4 Y% D' t. |. `! t
( W% P2 |6 |: |; y9 [: V/ Z2 t int i = -1; / E3 Y. q7 L# o* }7 U# { long l = i;) }, B% F! x. Q+ B3 [: Z; {
; ]% g6 M7 m) C' k- k, q0 i 2) 强制类型转换(显示类型转换), 需求明确处理, 是按照反方向,进行9 u- G/ x8 v0 C# I0 ~$ M. H, Y. U
的转换, 这种转换会溢出, 或者损失精度. 要注意数据的范围 ! V( P: N/ M- w( r int i = 128+256;// 00000000 00000000 00000001 10000000 * }* B& O ?- [7 [1 c
byte b = (byte)i;//-128: |% b }" X& `6 z
3 J6 ~' p+ C8 H long l=0xf80000000L; ) j. p* H0 K% _) i int c = (int)l;//负数 6 S# g: ^/ V' G$ q% U7 R2 P$ G 7 s+ s1 {- B- Y T3 A l = 8;+ Z: X3 e( L- M: i; w; `$ u9 s* d
int d = (int)l;/ w2 m& p! ]7 B1 i( c' P
" ^! ]( ^3 R6 G6 R1 K$ ~ float pi = (float)3.1415926535;//损失精度 " p0 B; c/ k$ i' ~# H$ O( m( g1 Q" y 9 |; ^* h1 S3 G- x) y2 N char c = '0'; 1 p- d" i, X& _2 }# P4 F' A) j char x = (char)(c+2);. f# B/ j; [ p9 ?