1. java 变量+ N$ ], I2 {) a$ C& H/ }' h; D
1) 变量就是自然语言中的代词, D x) g6 E f4 |+ l0 [5 ~2 b# t
Person he; int age = 15; 6 B+ C; o6 Q. @' p! }
//age= 00000000 00000000 00000000 00001111 0 M+ Z- d4 f$ t# W( b8 Y System.out.println(age);//15 1 s, Z- a. R3 u7 | 2) Java 中的变量, Java是强类型语言,4 q3 q% @3 b5 A/ c3 i
A 变量必须声明,并且初始化以后使用 int i=0; 5 F2 Z% K$ R' U# z# n2 I B 变量必须有明确的类型" D; f$ k2 a) `9 q9 _
C 变量不能重复定义 0 F0 J2 [& H% v' I 3) 变量的作用域! _- p. O- n. V
a 在声明的地方开始,到块结束为止' |+ H- B- y! G) r' E% E
b 离开变量的作用域结束,变量将回收。 $ L& _8 k: ? a6 n4 ~0 P6 K& k6 ~0 p. a: {& J$ \
2. 进制转换基础 & g. r9 G3 M0 `6 E6 q' |3 x 1) 十进制 ' x' b) |7 u7 w5 Y { 逢10进1+ K; H& D5 W# _) P3 n
基数: 10 ) y, g9 G- ], ` 权: 10^n, 10000 1000 100 10 1 3 R6 ]1 \/ u N 23678(10) = 2*10000+3*1000+6*100+7*10+8*1 4 v) k. P% c) Q4 {8 }0 w% h
= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0 ) @8 Z$ i: [2 Y% i9 a3 ], E& u0 Z = 23679( O: O! q6 X# d
! d8 \7 n3 Q: c, S% O7 O0 b
2) 二进制, J5 ?! ]2 c/ a' D
逢2进15 g+ a9 b/ {& ~5 ^ O
基数: 2 4 _+ k5 J/ L/ I* p) I 权: 2^n, 128 64 32 16 8 4 2 1 : Q7 L; h) V) E( H+ t) ~9 T) n 01000001(2) = 1*64 + 1*1 6 @. k: b+ a. n+ u2 u% } = 65(10)* t& h A3 j5 g" ?
3) 补码基础 g" n/ i0 e8 b( p$ z8 x! ?
-128 10000000 11111111 11111111 11111111 10000000 % R' L; V5 k9 K( B* }' N/ H10 2进制 ... ... 4 q. A: W. F; ^; P" [ 8421 11110111 11111111 11111111 11111111 11110111: n: V( {7 e) h2 D
-8 1000 11111000 11111111 11111111 11111111 11111000 2 g& K8 a3 E5 U& ~) z6 q-7 1001 11111001 11111111 11111111 11111111 11111001/ e# E& k4 i7 m' z6 c
-6 1010 11111010 11111111 11111111 11111111 11111010) }/ y1 |; G0 S f* ]3 s+ |
-5 1011 11111011 11111111 11111111 11111111 11111011 4 B, {: H% U; s7 w-4 1100 11111100 11111111 11111111 11111111 11111100" e" w' Q. J1 b
-3 1101 11111101 11111111 11111111 11111111 11111101 $ h: S8 l2 q. `, }1 Y6 O6 k! z-2 1110 11111110 11111111 11111111 11111111 111111106 ^3 V, H0 v1 p7 s
-1 1111 11111111 11111111 11111111 11111111 111111119 M8 W7 v( ~ E. \9 |1 A( [! o
0 0000 00000000 00000000 00000000 00000000 00000000 : M9 t! F* B. A/ F# |5 r 1 0001 00000001 00000000 00000000 00000000 00000001 : L6 N* t: J7 t1 [$ v. K r& ? 2 0010 00000010 00000000 00000000 00000000 00000010 0 ]' a3 w/ p8 i" Z9 p( }/ V- h 3 0011 00000011 00000000 00000000 00000000 00000011 ' S% ~* V) Z* E E/ _; I* X3 _7 x, t 4 0100 00000100 00000000 00000000 00000000 00000100 8 \( i+ a& v" g4 A5 U' E 5 0101 00000101 00000000 00000000 00000000 00000101 & R8 i, n* L! d 6 0110 00000110 00000000 00000000 00000000 000001106 S" e2 f( K; t& _ q
7 0111 00000111 00000000 00000000 00000000 00000111 4 R. ]5 ~' G% c! M* K7 o. H 00001000 00000000 00000000 00000000 00001000 # F% c y; E, }' @# v .... ... : k' }% z1 I: H! G4 J( k 127 01111111 00000000 00000000 00000000 01111111 / k! j2 m' U. I, v6 P* r5 S 补码运算:% b2 v3 a6 ~7 _( v
-1 1111 & d0 B# F; Z" F0 x -1 1111 ! E0 ~3 F& B, G. X0 D * ( H/ V( n5 A( S& l: Z( P
---------- & X2 z% p7 x- ]1 D 1111 + |- \4 n9 }- E5 \$ u 1111( J1 \7 P( e$ g* G
11112 r% ~7 I# d; I- {/ Y
1111 " ]' l" g- i; F& C. Y; O$ _) P0 d 1010101 4 j' x3 r" x; ^ -----------4 @( P* w- m: j K' A+ M( r
0001 # p3 K2 _7 ]$ N* h 8 j; x! q3 ]6 L) h5 ]( p' p 4) A Java 内部只有二进制补码 1 d5 } J$ Y1 {1 ?- f B Java 内部采用补码运算, 自动发送上溢出和下溢出 # ?+ Y5 M, k1 e: u9 p/ ^: y3 z/ O C Java内部没有10进制! 但是Java尽量按照人类习惯输入输出 6 w+ i0 J: O# z9 f/ ?9 k D 补码的负数 最高位是 1, 也称作符号位+ Z$ i. C. E( W) S
5) 16进制, 是2进制的简写, 方便专业人员书写2进制数据5 x" q* h; B5 n7 K( A
16进制, n, C! c/ w$ ]* H0 v3 m
逢16进1! b4 w3 B+ g' F* @6 g
基数: 16) c/ {& B6 U+ h+ ?1 X
权: 16^n, 256 16 1 8 j% M1 x }: X) q 16进制数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f5 M! n5 K1 b1 U# O9 C( e
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 158 g( P: g+ e/ F. G& ?$ t& {' D
6 J) Q# X; U5 s& }0 y1 O D
41(16) = 4*16 + 1*1 ' Q+ i, }8 l% H3 b+ K I; U5 M5 r = 65(10) - a; ^% D$ Y" ~ [ b$ I$ \ = 0100 0001(2) ! w/ x6 w7 a! U! F* T: f 8421 84219 G1 p& f0 X5 c- X( i, q5 N
4 1 (16), H9 T1 Q7 R8 j/ y2 q% E0 J3 H
! J1 G" m* g- S( C" H& t 128 64 32 16 8 4 2 1 " Q2 l1 u0 l8 k/ W$ H 0 1 0 0 0 0 0 1 ( b1 h" H( @" Q( r9 p! F 练习:转换以下十进制为二进制 192(10) 137(10) 145(10) / e; Z2 b8 @' J2 e 192(10) = 1100 0000 (2)) B6 U6 n0 _: [5 G
c 0 (16)3 I+ O' I* j. P# R' R7 Z
-8(10) = fffffff8(16) 5 r2 [0 `5 a3 P& X- K! K 进制总结:2 B1 F) [2 D% l. L9 z3 [0 ?
计算机内存只有 二进制补码 # j S" n/ Q3 e7 C 默认输出, 按照人习惯输出10机制结果2 h* a$ t; t m7 M1 m
16进制是, 二进制的简写, 16进制本质就是2进制3 U6 }, n& ?: w
16进制存在的价值: 方便书写2进制!7 G0 U3 V7 H# q2 K3 i
7 v" Q! G/ ^5 ?2 L" p
3. Java 数据类型: 分为引用类型和基本数据类型 6 G, N5 `: h# R 1) 基本数据类型: 8种- x" b. U6 Q4 [, @% p H
byte, short, int, long ( O" ]8 _0 H) m2 Y2 }2 r float, double 5 @- q5 a! b4 J* D
char' H9 h' g' [8 d2 b3 f( I
boolean ; u% {2 A K, C+ l6 G 2) 整数类型 byte, short, int, long, 都是有符号(补码)整数9 ]; a# p7 N1 e2 L+ ^1 I) r& ?
byte 8位补码 最大值 0x7f 127 最小值 0x80 -128, P$ a5 E4 R0 |9 w! h) r" ~" j7 M3 g
short 16位有符号数 0x7fff 32767 0x8000 -32768) X/ G/ S/ v+ |% [
int 32位 0x7fffffff 2G-1 2^31-1 21亿 0x80000000 -2G # B/ u" T0 n& r! O% _+ \: ^ long 64位 ...., ]9 k$ z' U2 J8 P$ V3 G
整数字面量(直接量) 默认是int类型, 如果不超出范围, 可以给# I: W# @: s+ Q
小类型直接赋值. " }+ a" B& \! G9 j9 _! [" r# u 使用整数类型(byte, short, int) 要注意取值范围, 超范围运算% ]2 N6 c& O' Q5 n% f
java 底层byte,short 按照32位计算 4 Z" b% ^: f' T( B9 r- v! j# @! M0 |$ {, Q/ b4 ]2 t, H: N( k2 C
long 类型的字面量使用"L","l" 后缀 . M) U# n3 J, O4 E0 `* Y6 e: b 9 X7 v% i( L3 Z4 F/ A3 a6 ^ M 3) 浮点数, 小数 (不必掌握 浮点数的存储方式) 5 A, X6 u$ u0 @+ o0 Q 浮点数原理: 10进制浮点数(科学计数法)原理1 W: j0 E6 w2 e$ ]; f8 N6 X$ `. x/ E% {
2356189. = 2.356189 * 10^6 ' {2 z9 [8 x7 [, Y 概念: 尾数: 2.356189 . L! T) [# w+ l5 j" O
指数: 6 * c, x' A: p) r 基数: 104 v% h% a& v% Y9 R8 i- m
pi = 3.14! F0 l* ^4 |6 W/ i* C1 U4 t) g- v2 F
3.1415926535897932384626433 2 L: R2 f# ]' y& ?; k$ g c # c$ K' X1 M/ `3 i* D: x p& s' N& V7 ]9 t. d( t
二进制浮点数:( _8 j! @7 p4 W6 J, W) |9 `
101001010101. = 1.01001010101 * 2^1011 # T. n5 o; O( ~; ^. g- e+ j 概念: 尾数: 1.01001010101, N/ |- r+ O) Q8 n
指数: 10119 c+ z9 [/ y0 W; |7 Y, L7 I
基数: 20 H' }# x5 a( a
: w& @8 R9 f7 P0 ] float: 32位 其中: 1位符号位, 8位指数, 23位尾数 V7 D% J2 M. k4 ^
8 a$ h) {1 T: ^; v5 v1 _4 r, p( A% J
精度: 23 位 6 ?. ?; X! U* E( k2 {5 i! X7 E int max = 01111111 11111111 11111111 11111111 : @1 V1 ^) M- a! ~ float f = 1.111111 11111111 11111111 1 * 2^00011110 6 R5 [# H, E0 e; D. P: W% y' o4 M' y# ^4 j
double: 64位 其中: 1位符号位, 11位指数, 52位尾数 * G4 h6 U5 |, n$ j0 ?- \3 I/ q& \# n9 _/ M S( M
浮点数的字面量: 默认是double, D d 后缀是double, f F 是float7 I" S- S, P- M% D. w
! M& a& ?4 g0 i
4) 字符类型 char, 字符是一个16位无符号整数, 是一个二进制数3 S" q# G7 a! C$ `' U, \( L
数值是一个字符的unicode编码值. + x$ X8 Q. s6 { unicode 编码: 是全球范围内的编码方法, 编制了英文, 中,日,韩 & C$ @' n) C2 K- T6 u2 x 阿拉伯, 希伯来, ..... 8万+ 字符2 G1 N3 b! ^3 `) w% _8 i
其中英文部分与ASCII 兼容, 英文字符和数字是连续编码的. / K( C2 N9 Q$ J: h m+ M$ T) N ASCII: 0~128 3 d. s8 i! n3 `/ U1 j; w% T Java char 的范围 0~65535 不能表示全部unicode 但是可以表示 ) Q5 |; v, r# W) h7 S6 h unicode只能够最常用的部分 ]! U( ~+ I4 j5 W2 g4 Z( O/ o; K+ B& {5 d! Q. i7 _( y0 C6 ?1 o6 |
*最小值:0, 最大值:65535 = 2^16-1: j1 c! Q* m9 K. r, @1 _$ U6 P( o
*字符字面量使用单引号为定界符号:'中' '0'->0 '4'-'0'->48 E/ X G* M# r; e' V
字面量也是整数常量! 52 48 ! R% F6 l8 b. { 特殊字符采用转义字符表示: `. s0 z$ Q' F) Y$ g( s) y4 J 如: '\n' '\t' '\\' '\b' '\r' % g* D9 ` X2 U8 h j4 K( Z7 K '\'' '\"' '\u4e2d' % q6 g- I: l6 E+ C" B$ `
2 { b7 h) M" e k8 E
char c = '\\'; 5 |0 H. Z' s( F/ O$ K- U( t/ y) y# @: `' b1 X
'X' - 'A' = N' ]3 b4 N# S+ k6 b! H' M
'x' - 'a' = N F- ^ [% y, ~% z# H% u2 a X = 'c' - 'a' + 'A' 9 k2 G9 v/ L" {% v5 p / X7 ?& ]- ?. z 5) boolean 布尔类型 表达: 真(true)/假(false) , _/ j2 N" @% i) v" G 建议使用长变量名定义变量 0 W; N$ c; @, _; _ boolean started = true;) n/ N9 D; h S7 i/ C9 V
boolean isMan = true;6 V9 ^( Y* g' \( l5 U
isMan = false; * P3 o* l8 d- ^' \ boolean used = true;//二手的 # o# N2 k/ ~' x/ K+ J" z if(used){ * g# D6 ?, H. z6 M7 S6 |4 [; f System.out.println("打八折"); * ]' j6 C- w4 S" }& U- n& [* D
} 8 y W8 b( Q0 j5 S! P+ \3 Q 不建议 定义没有意义的变量 * S# H/ }2 K0 ~ boolean u = true;//u = you ) b- y" e& `/ M( q& h: } boolean flag = false; / N2 z4 M9 W% C+ h8 W. _, Y, [1 Q ; d% L8 X7 K* g1 Y. `+ W* K if(flag){ & f' U% o% ?( G( N8 e System.out.println("打八折"); 4 ~+ `8 B+ x1 r" S. _ } $ f% ~3 ]$ g3 n9 y
2 k6 |, t. y; Q: G4. 数据类型转换 , t9 I* v3 U5 S" r8 O, j |& s. q char -> , f; R$ H, [ j# [# V- F byte -> short -> int -> long -> float -> double 5 h# r# Q3 f7 ^; S) Z( c8 h. X8 H' E: c! v
1) 自动类型转换,正方向,小类型到大类型的转换会自动完成 4 _* M" o- r. a9 X8 p; W3 O' q! } 符号位会自动扩展, 负数补1, 正数补0, 保证补码数值不变 8 z' e+ Q" \" s$ q/ C 注意, 整数到浮点数转换会损失精确度 " [& M( M7 W5 A/ V3 s M1 `# I 自动类型转换也叫"隐式类型转换", 是自动发生的, 一般不需要处理 ( d9 `9 m$ ]! V/ Z8 F, n0 K2 I! w4 h: N" ]4 K5 e
int i = -1;4 A% q" p- \: g v2 b4 j% _' }5 A
long l = i;0 l" H( X! [2 t" N G0 t A2 T
: u! O3 I& `, ?( ]! O1 [
2) 强制类型转换(显示类型转换), 需求明确处理, 是按照反方向,进行 0 s# K0 c7 [' K/ X! B 的转换, 这种转换会溢出, 或者损失精度. 要注意数据的范围) N# {$ H' i- i
int i = 128+256;// 00000000 00000000 00000001 10000000 8 k" F) v/ Z; I: ?5 ?( H7 O
byte b = (byte)i;//-128- ]; Y5 T% r1 C
- c7 r' X: J5 m: a0 R long l=0xf80000000L; ( Z7 L* _5 W3 e/ h int c = (int)l;//负数 $ `: Q" d" ?, J5 h; P( G+ m, t % @8 y' r0 N, ^/ g9 `; p3 x k l = 8;6 [' Y5 @! P8 e5 v
int d = (int)l;$ s( g+ V% t" h, w1 E
& w$ I: Q, ]/ M$ ?8 \. h6 M+ u float pi = (float)3.1415926535;//损失精度 . k4 R3 V/ g$ x- {5 {$ J. g& j 8 x6 E) t( ?# j1 C; H( i6 Z- t% H8 {1 u char c = '0'; " }2 I8 Y1 ~# ~: ]; t n char x = (char)(c+2); 1 [ O9 O4 f/ i2 n3 G7 b) r . V( ^1 ?4 x. H, Z* O5 B