1. java 变量 ! T# S3 V ~' P5 t2 _3 ]7 @, x7 V 1) 变量就是自然语言中的代词, r" i( X% [* H1 S5 I0 I
Person he; int age = 15; 5 T! n: O! I( o& i& [2 m$ c
//age= 00000000 00000000 00000000 00001111! F; O8 u; C$ p6 M! z
System.out.println(age);//15 / o) x- V3 R7 m! |4 H) d9 i 2) Java 中的变量, Java是强类型语言,' J. J) X6 X. D6 P0 \
A 变量必须声明,并且初始化以后使用 int i=0;% X: m7 r/ E4 |5 s# [7 x; t+ |
B 变量必须有明确的类型 & F: Y9 s& S d C 变量不能重复定义 9 G+ W, L1 e& ?7 } 3) 变量的作用域 : e! k/ G. [- l5 k9 v0 s a 在声明的地方开始,到块结束为止 + G: Z% _/ K# W, X/ C9 A, {+ \ b 离开变量的作用域结束,变量将回收。 - X# x! ~& G$ v9 `. D # `( K. H) e0 s2 ?2. 进制转换基础* E; {6 E2 Z: Y+ Z# \# {$ v
1) 十进制 / {, X0 O& k2 d( |: _' R
逢10进1 : w9 b) k+ d! r- J- F! h# n 基数: 10$ g3 i: i8 U0 ]$ u) T
权: 10^n, 10000 1000 100 10 1 & F+ H2 a2 ?* b; R 23678(10) = 2*10000+3*1000+6*100+7*10+8*1 ! O7 Z V* T! j( |5 l7 Y
= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0 3 \/ W1 F4 t/ V. x- z# N = 23679 5 h2 x5 A& u u% c8 i' I3 _/ u h8 `
2) 二进制. ~, D# i" m* m% b8 N9 }% } C
逢2进1 0 M" _. }" ?8 @7 D* d. \) J$ E4 q 基数: 2 . q& B( V# d+ P( I( L; P 权: 2^n, 128 64 32 16 8 4 2 1 9 ^" N# k7 ^% d( |( r
01000001(2) = 1*64 + 1*1 3 b; u+ ~# H* r$ I$ n% o7 e* p/ g = 65(10) - s7 n* |4 I# g. ^! X3 x+ @ 3) 补码基础% R9 p" y- \9 ~ R( B% \
-128 10000000 11111111 11111111 11111111 10000000 6 Q3 E* B" d( v10 2进制 ... ...( Z6 g- W) ~% G/ k8 O
8421 11110111 11111111 11111111 11111111 11110111( P0 A3 p" c+ {, k; Q
-8 1000 11111000 11111111 11111111 11111111 11111000 . e" s! E9 a& k# y-7 1001 11111001 11111111 11111111 11111111 111110013 p$ i* H7 Y; f$ \7 R. N$ L
-6 1010 11111010 11111111 11111111 11111111 11111010# d$ K$ h: `, j. ~. {
-5 1011 11111011 11111111 11111111 11111111 111110115 j* _' t2 O! x# E7 K B& u. X
-4 1100 11111100 11111111 11111111 11111111 11111100, h4 B1 [1 z" L0 p
-3 1101 11111101 11111111 11111111 11111111 11111101 % ]: l7 e3 b* o& e% {-2 1110 11111110 11111111 11111111 11111111 11111110 9 `: k/ x2 a; q) S5 }) A% w-1 1111 11111111 11111111 11111111 11111111 111111118 q7 O: ~% {0 P) f, ^& ]9 {' j
0 0000 00000000 00000000 00000000 00000000 00000000, L# N; p: W* p9 e8 W. P) Y
1 0001 00000001 00000000 00000000 00000000 00000001 2 O7 c$ ^: [$ P7 V% \% I 2 0010 00000010 00000000 00000000 00000000 00000010 0 ~8 D- ~& E2 V# B 3 0011 00000011 00000000 00000000 00000000 000000117 P* N% k8 `3 _, ?* E5 }3 d3 Q9 b
4 0100 00000100 00000000 00000000 00000000 000001000 G' q3 ^8 j1 g3 u3 {
5 0101 00000101 00000000 00000000 00000000 00000101 " F; V; t9 K0 }; y' X9 J! S 6 0110 00000110 00000000 00000000 00000000 00000110 : M5 P- D9 x4 N2 [ 7 0111 00000111 00000000 00000000 00000000 00000111 5 H) t L' X8 p3 b) B# `/ A2 s 00001000 00000000 00000000 00000000 00001000' `4 j5 F& l; e, o x$ v9 p, }. L
.... ... - x: k0 Z0 W$ w" j m* \% L 127 01111111 00000000 00000000 00000000 01111111 : R3 \) J( S( H1 q. z) W 补码运算:8 y. f1 i& ~5 o& I3 U& P7 H
-1 1111 9 Y: v& m5 Z X# u -1 1111 ) G) g( S% Q. E: `, o * * W/ m: S9 }2 A2 g4 o4 r- d ---------- ) j- U( l' o& }# M% c
1111 1 P# I O8 H+ |# k/ z2 X. j 1111 # o a& \) Y/ Z0 f& t 1111. V6 V) i% ~# b" p; L/ S
1111- u" I; g1 P6 C' I
1010101 6 I3 T6 B& D+ s$ o; c0 d -----------, j3 T) O, {" W ?
0001 8 Z- K1 D$ b" t1 G2 b " L9 j3 t" E* O' C0 s8 D, r1 Q 4) A Java 内部只有二进制补码. g( B4 P) _8 m7 e0 w
B Java 内部采用补码运算, 自动发送上溢出和下溢出/ ]! n: \3 w* }% k' m! B0 W
C Java内部没有10进制! 但是Java尽量按照人类习惯输入输出) i4 c, G0 }6 H2 H, ^$ S3 o- t
D 补码的负数 最高位是 1, 也称作符号位$ _8 i% F: M7 K8 m' Y( h. {# k
5) 16进制, 是2进制的简写, 方便专业人员书写2进制数据4 {8 Z3 Z; G4 \! L+ i: V% Z# }. y
16进制 0 s: {3 o4 k4 o$ C& y+ p# n% P 逢16进1 1 o* |2 K2 H/ T1 h/ ] 基数: 16) R+ n; w2 ^3 |. @" c
权: 16^n, 256 16 1 0 [* z' ~$ H+ {# k0 V5 [ 16进制数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f # t) E% p- v4 b, h 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 158 S) Y& \' m+ v7 o7 P8 P
% B5 N: r' u( ]* z% w 41(16) = 4*16 + 1*1 5 n# {6 t- b! `3 J Y = 65(10) 9 ?! B9 ]4 Y' L6 Z+ R4 g = 0100 0001(2); y9 O; {% [* Y& G
8421 84211 x. K* Y' ^; ~
4 1 (16) ; N$ Q" e; |+ I; }+ ]4 s6 C0 V/ S- i9 n/ m% w
128 64 32 16 8 4 2 1 $ S# W' ~5 E' U0 A5 n. k) b5 m
0 1 0 0 0 0 0 1 0 ` y6 A6 {5 }1 F+ I) x 练习:转换以下十进制为二进制 192(10) 137(10) 145(10) & a! W; [& b6 l3 G4 Y+ A I" D 192(10) = 1100 0000 (2) ! B! N: w0 @6 B9 {3 P c 0 (16)" m2 z4 u& m4 `# N$ p* b( |
-8(10) = fffffff8(16)8 ]) l' g) J3 I2 r# A# Y
进制总结: + z0 G% u9 T" o( n 计算机内存只有 二进制补码 - {" Q/ C3 z/ i. O! L 默认输出, 按照人习惯输出10机制结果8 o) Q6 @% o F: Z4 | P
16进制是, 二进制的简写, 16进制本质就是2进制 |/ E. N) u4 S1 D) {% p* R4 o 16进制存在的价值: 方便书写2进制!% F1 Y1 W' D3 w! H! j
9 w. y+ v) @; O
3. Java 数据类型: 分为引用类型和基本数据类型. ?5 v' k$ R/ P8 T' z7 |
1) 基本数据类型: 8种 . h4 D, r* r+ G8 l) h byte, short, int, long 6 b3 c/ y: M2 t4 _3 h( h5 L float, double 4 r7 h2 o! y3 J; ^ d' i# M7 z2 p7 Z
char 0 n( X/ }+ u! Z k, L2 i, ]/ R# f boolean 4 I/ L' ` R/ V V9 \8 {' ` 2) 整数类型 byte, short, int, long, 都是有符号(补码)整数 2 H- p+ s) y }# w+ a' e4 H byte 8位补码 最大值 0x7f 127 最小值 0x80 -128 9 {9 ?& y6 y6 M( M/ n, o. v6 o short 16位有符号数 0x7fff 32767 0x8000 -32768" r+ T4 x3 ?. p- F- w/ L) @
int 32位 0x7fffffff 2G-1 2^31-1 21亿 0x80000000 -2G 4 o4 ^8 G r) y3 f* r9 l0 S. ^8 S7 B
long 64位 .... & ?. ~3 `$ _, S- H' x 整数字面量(直接量) 默认是int类型, 如果不超出范围, 可以给 2 Y+ p0 Z/ P& t5 T 小类型直接赋值.% C) x* d1 v. e" F5 J4 Q. O
使用整数类型(byte, short, int) 要注意取值范围, 超范围运算9 {3 G0 v4 p' v* {. [: m: {
java 底层byte,short 按照32位计算" l# s* {7 e3 K
& b! I1 M- L g3 p long 类型的字面量使用"L","l" 后缀 & B) p6 e+ M: }( H, \3 o7 V6 g ! Q+ C3 F2 ?& s8 S. o9 g 3) 浮点数, 小数 (不必掌握 浮点数的存储方式) * t; |- R7 n0 O 浮点数原理: 10进制浮点数(科学计数法)原理 O( D% F1 L# B1 J0 P6 {+ R. f4 Z 2356189. = 2.356189 * 10^6' K6 S& {5 |# E8 W
概念: 尾数: 2.356189 7 }% [. [5 O0 F: \' [& W# Q
指数: 6' ?* |: Z- k9 S
基数: 10 . j% O* K5 i( Q% [; u7 R+ { pi = 3.14' Z* P! A+ l+ o; Z# ^* c( D& H' n
3.1415926535897932384626433 1 y% r3 H* F8 _1 ?' d" V1 p5 g4 B. a+ |( G! w
3 L: J7 z3 z5 }$ H' N. z# D 二进制浮点数:5 P9 W+ ]- ]9 v- G
101001010101. = 1.01001010101 * 2^1011" j2 T! u; |0 n5 x) \. Y
概念: 尾数: 1.01001010101 % P9 U$ q* X9 V) |4 [/ M) Z 指数: 1011 + L; g5 i4 u& `8 W: J1 o( ?! C 基数: 2 4 n g% _3 r7 y6 a# A! ~* v: ~1 t8 [3 W1 V
float: 32位 其中: 1位符号位, 8位指数, 23位尾数 % R" \7 t& e8 z( w% |9 d. ]/ J. ^5 s0 E H5 t4 _
精度: 23 位0 v/ t ^9 H2 @6 v
int max = 01111111 11111111 11111111 11111111 $ H+ N% H# Y# |. Q l float f = 1.111111 11111111 11111111 1 * 2^00011110 5 Z" K/ Q% h$ T2 Z; X7 n; W* U6 E8 _5 n$ B3 R, B
double: 64位 其中: 1位符号位, 11位指数, 52位尾数; N% G0 d/ z. ^( e( S- u$ o
. W8 w L2 G4 S$ i2 F8 h$ v# B2 R# M
浮点数的字面量: 默认是double, D d 后缀是double, f F 是float - e$ [+ q9 g' q# D, T# y2 R/ Q0 s `/ C$ K! ]0 f/ H% {! U
4) 字符类型 char, 字符是一个16位无符号整数, 是一个二进制数 u# _4 u& ~( |/ F 数值是一个字符的unicode编码值. ( P5 J" P, M3 o, b6 ^; w unicode 编码: 是全球范围内的编码方法, 编制了英文, 中,日,韩 ) ~" O+ b' b( R, x 阿拉伯, 希伯来, ..... 8万+ 字符+ y* u* }# Y& v3 c6 j& ] R
其中英文部分与ASCII 兼容, 英文字符和数字是连续编码的. ) q) e) c9 ~* B: Y ASCII: 0~128 $ e; m% I# k3 z2 r1 {4 D Java char 的范围 0~65535 不能表示全部unicode 但是可以表示 " R3 w# u: ?. G) z4 E+ X, X unicode只能够最常用的部分 1 F8 n. J: c% }* F4 j6 N4 p* I7 e3 `& Q E/ s& r4 i
*最小值:0, 最大值:65535 = 2^16-1 ) e3 C& e9 _6 W" ?" x( Z *字符字面量使用单引号为定界符号:'中' '0'->0 '4'-'0'->4& k8 |) }& L) t1 J5 U3 O; U. O
字面量也是整数常量! 52 48 ) ]1 K3 M- a, ]) r) N# a
特殊字符采用转义字符表示: 2 C8 F$ A3 {& | S# i! r 如: '\n' '\t' '\\' '\b' '\r' 1 v K6 I6 e9 w% ~" R '\'' '\"' '\u4e2d' D: v/ ~+ g8 H9 j2 Y2 k 0 F1 Y9 t1 n0 Z) r char c = '\\'; 9 ^/ A% V0 o% w1 H; L ; [# F) G7 g! y( x* ~ 'X' - 'A' = N " i; ^; i9 @/ E8 q 'x' - 'a' = N ) L, V% {% f( N$ s X = 'c' - 'a' + 'A' ! B% w- m4 u c* `& D ) z8 l( w" ~9 d 5) boolean 布尔类型 表达: 真(true)/假(false); a' ] }2 }5 F* \
建议使用长变量名定义变量& _/ P* ^( F2 t+ ?
boolean started = true; % k' J6 b6 z' y8 P boolean isMan = true; 5 P" v. ^+ c1 U; Q+ v( D/ r, c isMan = false;+ t6 v6 ]# [1 [" v
boolean used = true;//二手的 7 p" h' o4 f F0 y- {% j if(used){ % |9 W. z! D3 ?& k* W" T System.out.println("打八折"); 8 x9 P3 }4 |& p! s2 o* Y7 D$ ^2 Z }' ?, u' x6 f+ G& y2 k
不建议 定义没有意义的变量, H: d. A# t- F8 A" K! S& k
boolean u = true;//u = you 0 t o6 q& y3 T% y; O0 D* ? boolean flag = false;/ Y& `2 f8 `" Y, W) U( @
; ]9 l3 ]7 O: q& R. y
if(flag){2 ?& R8 A* L- d: Q
System.out.println("打八折"); 3 z' L9 t. R& C5 H6 @$ P: k
} ) A# \, I- Q! s+ J/ Z: j
& T+ }3 w, U" O' y( m+ |, [' i- Q% r
4. 数据类型转换 : p# F ~; i! ]) E# R char -> 9 \, Y: a N$ @4 P6 n byte -> short -> int -> long -> float -> double " a' N' X' Q9 Q/ c" u# r9 ~" ~* X) X/ Q- t0 H/ ?. v6 X" O
1) 自动类型转换,正方向,小类型到大类型的转换会自动完成 # b; g8 f8 _" q2 I4 G+ o* i 符号位会自动扩展, 负数补1, 正数补0, 保证补码数值不变8 C7 _+ ` k6 q3 D) ~* [
注意, 整数到浮点数转换会损失精确度 / D+ o6 s4 [6 `: [' I7 X0 | 自动类型转换也叫"隐式类型转换", 是自动发生的, 一般不需要处理& M z/ g' R) G- S7 U& P
& Y# z6 E0 i; q6 i2 @9 L5 O
int i = -1;* ]. l3 Y* u/ P: x1 W
long l = i;2 L3 A: L5 b- }; y% k
1 c' w; E' D, z 2) 强制类型转换(显示类型转换), 需求明确处理, 是按照反方向,进行 # K0 b+ v, ~1 V" @% }5 e' L9 m 的转换, 这种转换会溢出, 或者损失精度. 要注意数据的范围 ( [9 F$ W; o6 Y# Z. W1 B/ I7 T' w int i = 128+256;// 00000000 00000000 00000001 10000000 ' ]8 n# q4 `1 ~: P4 x byte b = (byte)i;//-128 ; t3 k: l O" v7 R m7 [) I& n# P3 b8 M# u. K; l+ U long l=0xf80000000L;" h3 I, J' L1 s0 _# x
int c = (int)l;//负数. W3 T7 m9 k+ V5 E- |: K( b
4 e4 @+ f8 p7 B' P2 r3 Z l = 8; ) l5 `3 o0 I/ y+ ^$ D int d = (int)l;% Z5 R1 g/ M! x/ g- U
% _( ?+ T5 q: A+ T0 i2 i, B
float pi = (float)3.1415926535;//损失精度 7 }, }- w6 Z5 I9 }+ Y; Y! ?/ \2 |/ P% g , U0 }# n, P$ O* {: {+ P char c = '0';$ d2 I5 k8 \; s# {# \
char x = (char)(c+2);/ J! q: A$ g4 o# \: k+ E
( w% k8 L6 ]5 l$ Z U