1. java 变量 ) R% t- U2 e, Q& u 1) 变量就是自然语言中的代词 $ W' z2 X4 z/ c! Q7 s0 y Person he; int age = 15; & ^& y/ \( {8 S4 c: V, |0 ~
//age= 00000000 00000000 00000000 00001111 % [4 N; m. D/ t* [8 ^* R' l System.out.println(age);//15/ G3 g7 K6 j) N; m+ m$ j1 R# m( y1 Y
2) Java 中的变量, Java是强类型语言,6 K8 x9 c+ `( F) y P4 L% l
A 变量必须声明,并且初始化以后使用 int i=0;/ G/ K; ~7 Z# @" U1 ^
B 变量必须有明确的类型" C/ N# O- T. ` u* K. h7 v6 l& F/ Y
C 变量不能重复定义 1 ?" Y( p1 w7 K% M( r. N6 M9 |0 e 3) 变量的作用域 * ~; U1 Q$ |1 ?9 z& |# X6 F a 在声明的地方开始,到块结束为止1 ?6 E4 s, A- }* M+ K1 n; C
b 离开变量的作用域结束,变量将回收。: d( D6 H* }. \. \7 I7 ~$ b
; z( @4 S; {* W$ |3 v5 z2. 进制转换基础 ; F+ O2 J& z1 G$ d, l2 ^ v 1) 十进制 ) ]6 ]% y `8 W2 U, Y1 M
逢10进1 : [& s; K* l/ A 基数: 10 # H9 {6 F* d+ ]; Y2 o 权: 10^n, 10000 1000 100 10 1) J: |# K5 e( M" J1 @
23678(10) = 2*10000+3*1000+6*100+7*10+8*1 ' _+ f/ W2 H% q/ ]( ^7 [6 o6 S
= 2*10^4 + 3*10^3 + 6*10^2 + 7*10^1 + 8*10^0 ; n8 A2 @$ W/ n9 p0 O+ C: W
= 23679# B$ q! I' i+ p6 v! J3 A2 O& @7 }
% e$ {9 W+ E& D, q
2) 二进制9 _; H3 d4 k& n9 m6 D
逢2进1 ; w- O+ g, Y& n: x E! M 基数: 2 # d6 o# b/ u. U0 T2 y+ Q) _& X 权: 2^n, 128 64 32 16 8 4 2 1 6 p T: p) o' A' U8 A
01000001(2) = 1*64 + 1*1 : }& p8 c) b Y/ Z- A = 65(10)) M3 b ~$ N2 s& S# r1 H
3) 补码基础 $ P% s2 A) P) G2 A -128 10000000 11111111 11111111 11111111 10000000 R" w& G9 M7 c% E! D& h
10 2进制 ... ... 3 y9 P5 k/ Q% |. S- i) b 8421 11110111 11111111 11111111 11111111 11110111 7 h7 e" M6 ~8 J9 i6 {: V% ]-8 1000 11111000 11111111 11111111 11111111 11111000 3 g- e m4 W1 g-7 1001 11111001 11111111 11111111 11111111 11111001 $ S! l0 x R$ V/ e-6 1010 11111010 11111111 11111111 11111111 11111010 9 b' A) F1 j& h-5 1011 11111011 11111111 11111111 11111111 11111011' [3 A6 `8 s; o. K0 {8 \* [
-4 1100 11111100 11111111 11111111 11111111 11111100 9 \( I$ F) n, }% @% O; V. d-3 1101 11111101 11111111 11111111 11111111 11111101& T9 g8 T$ J: U) X
-2 1110 11111110 11111111 11111111 11111111 111111105 K+ r& E6 c9 \) n8 T/ x* Y
-1 1111 11111111 11111111 11111111 11111111 111111112 b1 ^& T& L$ G7 t. V
0 0000 00000000 00000000 00000000 00000000 00000000 " Q0 \; [% a, L! f 1 0001 00000001 00000000 00000000 00000000 00000001" q) l& v4 D' A! F8 _
2 0010 00000010 00000000 00000000 00000000 00000010 ! J$ f# O j" S: ^- ?( I 3 0011 00000011 00000000 00000000 00000000 00000011 & I+ X3 ^- `( F8 I 4 0100 00000100 00000000 00000000 00000000 000001009 _' i8 g+ h n# P. |
5 0101 00000101 00000000 00000000 00000000 00000101% M9 G- H( D) k4 N
6 0110 00000110 00000000 00000000 00000000 000001101 \* g8 G: B4 v* d" a# v
7 0111 00000111 00000000 00000000 00000000 00000111 ~' n3 v7 x- T+ n1 `( {6 J# Z 00001000 00000000 00000000 00000000 000010006 i! K' d( k) U% H
.... ... 2 g0 L$ @# ?1 a8 V: _8 ?2 |0 a 127 01111111 00000000 00000000 00000000 01111111 + u6 V6 Z* h. t$ B' N! c; z2 [ 补码运算:5 u4 z8 F5 B, e3 O3 Q I* I3 L$ N
-1 1111, f* t* m2 x! n/ H
-1 1111( m- d0 k& i( K3 f- k5 q
* / e, @- {: w9 l" e" a ---------- ' ?, T4 s$ z! N" V/ n) r% t
1111. Y4 }2 ~% L9 l/ F
1111 4 u$ m+ J* v- J7 C1 M 1111$ E, @+ l# C1 z+ r/ z
1111 1 l' g' s4 ~6 a$ j( O" N) j 1010101 3 i; ~0 u' P U! c -----------; |* `* F9 U0 d5 d+ Z/ u
0001 $ \8 J8 a8 n& Q9 r% ]: d3 W. p# B7 ]0 L& ~
4) A Java 内部只有二进制补码0 l2 ^- z2 [, b7 K, X' y" h5 D6 q
B Java 内部采用补码运算, 自动发送上溢出和下溢出 k1 a/ X& L, Q4 F# z0 A+ @" P C Java内部没有10进制! 但是Java尽量按照人类习惯输入输出" z2 \& y9 X- D4 T8 |6 {6 }4 f0 P4 C
D 补码的负数 最高位是 1, 也称作符号位 2 D" U/ U- g' B* H 5) 16进制, 是2进制的简写, 方便专业人员书写2进制数据 : `5 F* X/ V- z/ |. v 16进制 6 a; s5 ~) C9 y% r& H 逢16进1 9 L$ i7 R5 f( v# C- p$ k 基数: 16 ' o7 }" G4 [; M3 X) n5 e+ ~ 权: 16^n, 256 16 1 j, s% Y8 T' p0 ^ 16进制数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f# k' E( D | K: [" j' W% }
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 155 Q; \9 N6 W& _) v3 L% F
4 c4 y3 G. V2 j2 h; | 41(16) = 4*16 + 1*18 j8 z$ |& X# t P, u7 ~! V4 T6 J
= 65(10)3 t1 P: R; e- Y6 L) X b; k. [" A
= 0100 0001(2) z1 z4 X5 Z4 I
8421 8421 6 G; q( C* X- H2 H 4 1 (16) 5 i _- s7 r# ~7 v / V: M( [9 f7 G: T8 a 128 64 32 16 8 4 2 1 q7 o- r# I0 | D 0 1 0 0 0 0 0 1* ?$ J2 n0 q, z" S7 k4 k
练习:转换以下十进制为二进制 192(10) 137(10) 145(10) * r- N9 H8 [7 Y1 N# O8 a
192(10) = 1100 0000 (2), \$ Z$ i7 G Q; ` h
c 0 (16) 6 c' `/ A6 J( C% v+ Z+ B -8(10) = fffffff8(16)* C: z/ ?& V* d" F) Y6 o
进制总结: 3 K5 C K& \* m; z+ ~ 计算机内存只有 二进制补码4 v0 u. ?( O R0 p7 `. ^
默认输出, 按照人习惯输出10机制结果3 A C1 g8 A }- v: ~+ y
16进制是, 二进制的简写, 16进制本质就是2进制* S0 z g" i1 ]4 Q! H
16进制存在的价值: 方便书写2进制!/ h5 p* r, ?8 t: V# d, \' l T
+ }2 r& s* ^2 x
3. Java 数据类型: 分为引用类型和基本数据类型 * y5 Q& @4 t4 R' J 1) 基本数据类型: 8种 ?: ^8 ]- U) @5 y
byte, short, int, long2 S7 w+ P3 ? d, w8 |1 h, x
float, double + K5 Q( P$ t9 j5 S& y) @ r0 {
char 8 l. N" m& Z6 P boolean5 x. V0 q+ O- y9 b" S
2) 整数类型 byte, short, int, long, 都是有符号(补码)整数: C+ M" y2 B& l: X. S
byte 8位补码 最大值 0x7f 127 最小值 0x80 -1280 t# x: h/ z; V; D- ]% X- n. X
short 16位有符号数 0x7fff 32767 0x8000 -32768 + [ E M' L* k3 {+ @9 O$ J. g int 32位 0x7fffffff 2G-1 2^31-1 21亿 0x80000000 -2G ; a- G% y a2 u, R" W# l2 L
long 64位 ..... k6 b: k: a$ t5 Y6 l
整数字面量(直接量) 默认是int类型, 如果不超出范围, 可以给 ( m$ W3 n4 N- [! R) @ r0 ? 小类型直接赋值. v5 ~$ E0 a* h1 ]
使用整数类型(byte, short, int) 要注意取值范围, 超范围运算6 }; [$ l: Z A( a) b U
java 底层byte,short 按照32位计算4 S# G2 q: l9 \4 v1 `& w8 |
. ^7 N. |2 y( b2 h long 类型的字面量使用"L","l" 后缀: z* o% j* S1 L! s# m' \6 w. d
5 ?" ~$ a7 G$ q: s- G) Y
3) 浮点数, 小数 (不必掌握 浮点数的存储方式)$ U" ^# z! t! v. k( J. _/ ]
浮点数原理: 10进制浮点数(科学计数法)原理 ; b! }/ y$ k) i) A% t! v! _8 e) D 2356189. = 2.356189 * 10^6 ; u6 I7 u E" @' |: j 概念: 尾数: 2.356189 % ^% i; K) B; o; h' M0 P
指数: 68 y" d0 o9 X3 h/ m7 S
基数: 10 ! |+ p+ E$ c% N: a- ^7 y. A pi = 3.14 ! `+ ?* S0 w& g# T2 x 3.1415926535897932384626433 0 K v M+ {* B1 k5 Y: H1 D0 s. ~* d* g. x" F J
9 r* O. D2 k2 Z; T; I
二进制浮点数: ) I: ?( o# ]; A, u' G6 H% z3 L+ } 101001010101. = 1.01001010101 * 2^1011 8 W! Q5 [$ o6 z; I* q 概念: 尾数: 1.01001010101 5 G4 P: }1 M# U0 v1 g* C 指数: 1011* x% x1 x: i& l r
基数: 2 9 [4 n. r6 p, k6 _% t( R b& U; \# U; C0 t% _& y# V) [
float: 32位 其中: 1位符号位, 8位指数, 23位尾数2 @$ u/ [+ j7 X) m
) k- a. U& f$ [* y U% D1 c; ~4 e
精度: 23 位 2 x4 k7 H+ _: f int max = 01111111 11111111 11111111 11111111" M7 g& {5 [# R6 m- l
float f = 1.111111 11111111 11111111 1 * 2^00011110) {; R3 s1 P$ H9 W( {) q! E
: k4 a( }8 ~; F' j8 J" b' M7 r. P
double: 64位 其中: 1位符号位, 11位指数, 52位尾数% |/ _: J p: ^+ D
5 j1 ^3 F# x% j& _
浮点数的字面量: 默认是double, D d 后缀是double, f F 是float. T. i K, ^/ T& t6 H- Q
2 ~- l) u) C3 ^9 E# ^) d8 i' S 4) 字符类型 char, 字符是一个16位无符号整数, 是一个二进制数 0 h1 [( }0 t, I o# o/ g/ Q# e% P 数值是一个字符的unicode编码值. 3 h. O; J! H8 q# p
unicode 编码: 是全球范围内的编码方法, 编制了英文, 中,日,韩 * x7 d) }3 t" L1 H. G 阿拉伯, 希伯来, ..... 8万+ 字符 y8 h# o& y: b 其中英文部分与ASCII 兼容, 英文字符和数字是连续编码的. . T# S6 P& t# e# z. Y0 o ASCII: 0~128' o2 \5 b& Y! U5 n' Q& D
Java char 的范围 0~65535 不能表示全部unicode 但是可以表示4 e2 ~' g1 r/ [% O: A8 `' k
unicode只能够最常用的部分5 H O1 W" R0 u
# V! N+ t$ m% ?# S* h& U7 k
*最小值:0, 最大值:65535 = 2^16-1 * X. w* Z* `; F `2 x *字符字面量使用单引号为定界符号:'中' '0'->0 '4'-'0'->42 `$ J+ X' |7 r6 J# ]
字面量也是整数常量! 52 48 8 e( ^: `) K7 ~
特殊字符采用转义字符表示: " ]/ h# V+ ^$ |( f! ]( P& k! b 如: '\n' '\t' '\\' '\b' '\r' , D, f0 a* c, v& ~7 F, x4 S
'\'' '\"' '\u4e2d' & G. u6 q3 V1 v% Y8 v0 R) G6 u+ T( J' A; y) R% B
char c = '\\';! [% \$ h# N( N
9 Y4 K) q7 _0 z+ {; u: N 'X' - 'A' = N1 e6 C8 Q- z H
'x' - 'a' = N ( @0 y: D R' [! }/ Q, `' m1 m X = 'c' - 'a' + 'A' 1 w) c( x( C" S8 F0 Q 8 ]. O; q6 [4 x+ A; j) h; ~4 p 5) boolean 布尔类型 表达: 真(true)/假(false)0 Z+ S9 x6 `* J& P& T
建议使用长变量名定义变量 s6 E7 O1 ~* J: {; P" U: |' y
boolean started = true;, c0 H* R, U2 w/ n* n) X
boolean isMan = true; 6 D1 v9 ~( W. }. V isMan = false;) J; y( X8 C3 t% |% |, C) P% b7 w, ~
boolean used = true;//二手的* y* r" e( [ y- j7 U) o4 t4 H I- x
if(used){ `% B, u' \- c. ]- J6 T( D/ ?; D }
System.out.println("打八折"); 0 r+ \* B$ z2 [! } m/ G } - `7 e( {: a+ ]1 h4 S 不建议 定义没有意义的变量1 {9 I! G: q/ X5 D( {
boolean u = true;//u = you % w% r+ _/ }* T0 @; T boolean flag = false; ' U5 ^; d; N( F & z% O2 V3 c- p- O if(flag){ : C- t& h* r* L1 E" h( D System.out.println("打八折"); 0 K: _+ d1 y* y: {( }: t } 5 m1 A4 Q! w* T8 D7 D4 g+ s9 u/ o6 }+ f r4 q
4. 数据类型转换 * B9 |/ q. H% j3 }, _" X
char -> + }; q# C1 [9 X6 B l( g byte -> short -> int -> long -> float -> double - r2 h4 D5 T0 W( }$ B+ B i& V9 g, v9 a% }; T; g
1) 自动类型转换,正方向,小类型到大类型的转换会自动完成& k" _. L7 q( A& F2 q, }$ m, R
符号位会自动扩展, 负数补1, 正数补0, 保证补码数值不变$ m% v B" t5 ` }& d
注意, 整数到浮点数转换会损失精确度4 {4 j+ t) t$ z4 d9 E% o
自动类型转换也叫"隐式类型转换", 是自动发生的, 一般不需要处理 + I3 N0 U" ^, o 3 o% o* C/ V9 t6 {$ @- Q int i = -1;; W7 C4 u8 e0 C: U
long l = i;* C0 u8 d. C; s; U6 d+ @! U
8 t' X5 F0 Y0 e2 ? 2) 强制类型转换(显示类型转换), 需求明确处理, 是按照反方向,进行% j9 |- l8 ~1 ~) B
的转换, 这种转换会溢出, 或者损失精度. 要注意数据的范围3 G i u6 l' ?) a/ |. z e" J
int i = 128+256;// 00000000 00000000 00000001 10000000 7 F/ d* s6 H2 _% p byte b = (byte)i;//-128; ~5 ~1 @9 z4 F+ n" D) M" W0 R
, b3 I4 k B$ x long l=0xf80000000L;" }$ O" F; G5 A9 r& A! ^' J
int c = (int)l;//负数2 j4 u2 |- U* B0 [1 c
1 S+ V( ^5 b0 T j) X M1 O, N3 z6 I l = 8; $ M! i; l7 q3 o2 B T/ F int d = (int)l; 7 ^0 G( k4 {0 S8 Q3 S. r9 C. ^% F/ O. L) R6 n: I
float pi = (float)3.1415926535;//损失精度 1 |4 F/ }* p/ e# G' i |8 R+ ?! m o 9 f$ C* T2 R" [2 K9 l char c = '0'; * M9 U% f! ^5 Q. o3 K9 B char x = (char)(c+2); $ w( t# Z9 B# E7 E) p9 F 0 I- [( g* P2 q# X/ y