|
该用户从未签到
|
1 面向对象(OO)
6 E. \% v, Q$ M6 V7 ~ 1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例
& h+ R) s1 ?7 x0 O 2) 面向对象, 面向客观事物之间的关系.
( ]/ P4 N8 Z1 J) R2 t4 H& q7 C R 4) OOA面向对象分析/OOD 面向对象设计/ T) g) }4 {) Y5 e6 z# s8 Z' R
客人来了(来了一个客人类型的某人)
* h7 U0 F. O7 C/ i! O0 c. X5 a P4 ~8 ~7 v' R, C. C; Z
5) 面向对象概念 {% b& r8 |+ d u# Q) n( u# B" B2 a
A 类型: 名词概念, 如: 客人, 菜品, 厨师
, {8 a' g5 d# k0 C B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜; a) S/ ]6 g9 D3 N1 f6 X5 g. Q
C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡4 v2 W4 T7 L: F {) ^0 P' ^! D
D 行为(方法)
0 Q( E$ m+ x" ]) i) \ 基本特征:
7 b8 [: C- v$ r A 多态: 行为/引用, 在具体情形下发生了变化的现象
4 h" B# v4 N9 o; b% l0 ^( u, L 一盏灯: 多态的
# y8 X6 E6 S' g3 a2 I 打: 根据宾语发生变化
4 j! Z9 i( E& Q8 M/ G B 封装: 任何对象实例都是尽可能封装, 减少暴露2 `0 I) n0 F0 ^" k0 W
C 继承: 概念的继承关系
+ t% S$ @2 I2 `) ]8 m# t2 L- w4 E- l6 \( \; ~$ @
2 java 类型, 引用变量 与 堆对象0 J5 A6 l _3 W1 r+ `4 E& g
1)Java 类, 是用来描述事物类型的. 如: 书8 u* _2 }$ N. w1 H W
<图书馆管理系统>中的概念: 书 Book
: n/ E7 z5 @& E1 G 书的特征: 书号, 书名, 编号, 作者, 价格... . z- o4 S; m8 x1 m
2) 类的声明:
Z; M# ]8 `! W; ]% c5 Q7 \ public class Book{$ U7 m$ M$ a# X$ M
long id;% z% b) o0 S+ i. r p
String name;. e) Z( z8 j5 \3 [
String isbn; //书号8 U3 w$ _/ [0 C) C. v
String[] authors; //作者
" d% g" m) i. j3 N& V, [4 G9 t double price;/ { a+ y2 V& j, l) c9 Q8 d
}
) o% m) r: [7 z0 I4 @. }+ f 3) 引用变量与对象的创建过程:) a2 a; C' R: m
A Java的内存管理与分配:
0 z+ V$ E. d. G5 E1 ? 栈是一块Java使用内存区域, 使用的方式 IFO(后来者居上)9 C- l0 S& b1 Z+ O
堆也是一块Java使用内存区域, 使用方式: 无需随机分配8 X* ^0 t8 ]8 \ O
B 局部变量 与 堆对象空间分配0 ?: P9 t' z& \1 N( m
Java 局部变量在栈中分配, 是按照变量的类型分配
2 t9 s+ Z2 p) U+ d) ^' ^ 对象在堆中分配, 按照类的属性(实例变量)分配空间# q) J; w8 ~+ S7 Y6 _
C 变量类型与分配
/ z* g1 y9 K1 n; N/ s% w: k 变量分为: 基本类型和引用类型
% W8 B! u1 Q. S$ W* ]+ \/ `7 s k 基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型4 L% J" Z7 c: U/ F; K) X$ L' W
的值" ?# r/ Q2 l' ?8 d- v; x# s
引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆
6 [( I" G q, ? 对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)",
# F7 H# _% `, T! A; d 由Java系统管理: 变量占用空间以及值的管理, 都是透明的. v g) y. s! s9 q3 Z/ B
# _; @* {9 p7 U- _& M 4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null0 b1 t E! u4 z& t
5) 在null引用上调用属性或方法, 会发生运行时异常
4 ]( F9 t# N2 Q6 z R q) A- I. T* X
案例:
( O2 I& T( y2 q 平面绘图坐标系中的一个点(Point),定义合理的属性+ \" i' S8 G6 n
坐标是int类型.
% U# Q- q0 \0 b3 L" Z, r s0 T/ n$ A m O+-----------------------------> X
6 {; q4 n4 G1 c. c6 F% i |
1 t7 p9 p5 H$ U |% O: ~1 i x; Q# h# [; [' y1 I. c
|
! Y, g5 q7 A n. d |
' k+ G! P* {- D" J | . p(x,y)* N8 E0 D) ^5 H& s
|
- |$ W- U. n# r0 E z |
# g0 x5 {8 j I% S9 m9 u2 j1 P( d |. t3 c4 b7 m- z+ W; s* ^+ ]; {& e
|
" v, M1 V! V' Y/ w5 Z
, O% [: J/ i) l: v; D( [# _% ] Y
% v: Q& f- v$ }2 o/ B c
% }) l# F- m" U3 v! e8 R K3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.
' B y# _8 k0 h0 ?! x# ]1 K2 S 1) " z6 }3 f; {# Y f
如: 月饼实例的创建, 使用面和馅创建.: V* W% F8 U5 d& R9 r6 p: P6 |! h
制作(构造器)- ~1 t$ |" k) m6 E, Y4 p, E6 P
月饼模子(类) -----> 月饼(对象)3 P, {+ W( ~# z9 p
原料(构建参数)
+ f, E6 W& C: x8 }' [/ r8 S0 Y- c" Z$ x
点类型 --------> 原点
8 z, U+ m; ^& q 坐标(1,2)
( P: }- E& V% n
' q) U7 a1 s7 _4 t 2) Java中的构造器: 声明在类内部, 方法名与类名一致
4 F( j. z, P/ U: W% b# ]6 | 的方法叫构造方法, 构造方法不能声明返回值类型.
$ F4 l1 _0 ?+ X' N5 \! b+ _4 ] 构造方法可以包含参数, 参数一般是创建对象实例9 Q, o# {0 a8 u) N- i2 A: T3 D
必须依赖的条件(前提条件).5 H6 @' d V3 O# o" z
public class Point {3 R5 k- D M+ h; c
int x;
) ?8 j5 j9 I# I* K$ l1 y int y;; ~/ O5 ^) W7 A/ \- A
/** 构造器 */
, u0 }2 J/ }+ j* N public Point(int x, int y){ E& ?' U* ^0 a/ Z0 j
this.x = x;+ W; X2 G& c% E2 }3 |6 L0 d
this.y = y; f: t; R, O; R: b' |
}
. s* Q/ L$ ~0 i6 c) d4 S }
+ C+ N5 D D H8 t7 w6 S* g" Y! i8 W
& L, s+ g' }( D) @% {, S" x9 ^ 3) 对象实例化过程:$ Z$ U6 j# J& c: J
new运算: 创建对象实例
4 L' v3 W' @, u2 [5 l) u 1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量' P5 L3 M: f5 s0 G( t8 U+ ]9 T
2 根据参数类型调用构造器. 9 F) O' E" S# q5 v9 G$ R
3 new运算返回对象的引用地址.
- D5 G& }7 U/ D" I4 e3 L6 w; Q- Y' B: X* T
4) this 关键字
K, N6 L2 ?1 X- I% Z* L this 是对当前对象的引用, 是运行期间当前对象本身.1 Y; h* |, R; h9 A
可以使用this明确的访问当前对象的属性或者方法6 I: j. X( C: H: s( O
类似于"我".# E4 v* z- L: e% ]! E
this() 是调用本类的其他构造器, 可以使用构造器的重用, ; A. r, }0 Z, O! ~) j) A8 O
简化代码的实现. z3 T8 P5 \: H. }9 O) @- o- s5 l9 ]
* this() 必须写在构造器的第一行!
# W7 u6 m. ~7 ^; x5 z( R* L3 U. O* g
/ ^+ }! t$ a3 {0 N' x% {/ I% f 5) 构造方法重载: 参数不一样的构造器
0 P+ y1 p1 R3 n+ p F 案例: Point.java( `% }5 \$ b9 O B& I
方法签名 = 方法名+参数类型列表3 ~. \# m6 t' q5 `& o
方法重载:a 方法名一样 b 方法参数不一样3 k8 k6 \* h9 Z" E+ z' O
也可以说: 方法名一样, 方法签名不同的方法
* b1 t! T6 N1 f v' f$ G$ g. E1 G" b! U) R1 H8 Y
6) 默认构造器
0 U8 M. j6 y- \3 o& D( P 1 java 类一定有构造器
4 b$ m+ O% g; }! R5 y6 K! Y8 v& h6 f 案例: ConstructorDemo.java
v+ Z1 V0 K& s9 P 2 如果类没有声明任何构造器,Javac自动提供一个9 x7 f3 \) Q: j4 Q8 P
默认构造器, 无参数默认构造器6 I3 D; k7 u$ W- e7 o4 `! J, l2 e
3 如果提供构造器声明, Javac将不再提供默认构
8 |$ c4 t# u( p# z! S" j 造器.
$ R1 W: p$ q- I7 a- m+ u& T" G8 B# |4 v( a
4 对象的方法0 b0 ?6 i1 H9 [0 }+ @1 G7 Q
1) 表示对象的功能, 依赖于对象存在.
3 U" N; S8 w# }( y, g! b/ z) ^ 案例: Point.java
, N6 s- d8 z% C5 E, F4 ~; t7 s/ D+ N 如: p1.distance() 和 p2.distance()( j& h1 d# T" ~, h3 R
方法是动作,是功能,一般用动词声明.
: S) B/ n( E1 W' T9 P/ H7 F 2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
' Z; m! ?' m) L; U8 t 功能的多态.重载的方法经常互相重用.. Q; p( [. X8 K% n; S+ h( ?! c1 x7 ~0 G
, i& C2 G1 I3 ~' P. \: Q
对象: java运行期在堆(内存空间)中分配, 大小按照属性分配
( g+ U) `9 p4 p: Z( Y- W6 s 引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配) ~- z: @" \# S& ?
实例变量(对象属性)对堆对象中分配(如: 书的名字)0 T& E2 N2 o% ?& W! m6 _) n# Q
引用变量的值是地址值(透明管理,不可见), 通过这个地址
1 v: q8 a: M4 Q" { ? 值引用了一个堆对象.3 ^: t7 ?8 z( H+ l. ~+ Z, n; L5 w
* L6 ~% j" G* y* Q1 s& A. @
不确切说法: 引用的值是对象
" i: K! W3 h0 L# j* k 引用变量在栈中分配
" h; G4 i, F! E P; E 类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了
; E/ K6 ^8 N9 G% H9 n% m 对象的样子.' Y2 ]$ @$ n- m: C
$ |6 G5 x" J2 n; H) A$ ~, H
想着对象写类型: 面向对象, 类是对象的抽象化
- m( E6 Y2 f. }' F+ z e; G0 C
方法的重载: 体现了行为的多态现象! ]2 O% j9 J3 Q' x
, I8 e' k# f1 m |
|