该用户从未签到
|
1 面向对象(OO) * E2 u2 h4 [) m
1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例- o5 w8 p0 I/ K% ^
2) 面向对象, 面向客观事物之间的关系.# _6 C( `; ?) v }
4) OOA面向对象分析/OOD 面向对象设计8 ^; R# a; D0 Z1 O- M- O
客人来了(来了一个客人类型的某人)1 L+ w! L, W- G% P( d9 x% _- q
' i. v3 \5 Z2 s2 l
5) 面向对象概念2 N0 B0 x9 X+ J! D7 J
A 类型: 名词概念, 如: 客人, 菜品, 厨师
6 C7 X( A3 Y: _" n1 A% P5 A3 M B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜
' t5 D. K- {, g+ V' h1 q9 F C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡& o- n) C6 s+ n
D 行为(方法): r) Z5 {$ F, E' m+ a+ F! i
基本特征:, F5 ?! j$ L* o) P1 X' _* Q6 j
A 多态: 行为/引用, 在具体情形下发生了变化的现象4 T3 b7 Y% |% `; C }
一盏灯: 多态的
0 p6 c) V, c9 l. R! O1 X 打: 根据宾语发生变化
6 `& R4 q1 s# g" T& J( | B 封装: 任何对象实例都是尽可能封装, 减少暴露; t. Z, z N7 u0 G8 d8 _
C 继承: 概念的继承关系
8 }0 S6 z; j |! s( O: P P3 A
( j% a: h% r& D( Y2 q2 java 类型, 引用变量 与 堆对象
8 Q" Y/ `7 G( G$ E 1)Java 类, 是用来描述事物类型的. 如: 书
& S" z* D& K; a0 P! C <图书馆管理系统>中的概念: 书 Book
3 H- S, M0 o" T2 K 书的特征: 书号, 书名, 编号, 作者, 价格... 7 f) s: g$ W- P( y- r
2) 类的声明:
% M7 M/ \9 l, k8 Q4 N$ p public class Book{# ?3 w4 }+ |( ^: D y. u% K1 l5 t4 j
long id;& d8 Z" U1 X o" d( `& D
String name;. K3 s; W7 z, L2 [# K/ n
String isbn; //书号6 p, W8 a/ D# a* w a
String[] authors; //作者9 d& {( f0 L5 b' c% O/ B/ v; F0 J
double price;. M& |2 T# M( S: ?, G( _
}
( ~. t/ M& _; W4 f 3) 引用变量与对象的创建过程:
# \3 i! T8 W0 c% `3 R* K1 {4 F A Java的内存管理与分配:. d4 D3 A+ S5 `/ d2 t
栈是一块Java使用内存区域, 使用的方式IFO(后来者居上)8 h% ^6 y2 Y9 b( A# z+ @! ~
堆也是一块Java使用内存区域, 使用方式: 无需随机分配
& g1 A, r1 O. s- |# W6 [: W B 局部变量 与 堆对象空间分配6 M; {' q; \3 w
Java 局部变量在栈中分配, 是按照变量的类型分配 . g# R0 N3 ]; U
对象在堆中分配, 按照类的属性(实例变量)分配空间
7 h% Z9 H; M" L/ \0 t C 变量类型与分配
7 B& A% _4 w+ Q4 ^1 h 变量分为: 基本类型和引用类型/ |5 s9 I1 O) M; M& |
基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型
8 S* W- ~( M+ t, G9 N0 X8 M6 T6 _+ g 的值
% @- G Y4 l( y+ w: M# g$ @ 引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆
4 {% }8 q7 G7 q* U 对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)",4 W% t" j# P+ F6 E2 h: v
由Java系统管理: 变量占用空间以及值的管理, 都是透明的. , `8 T, z$ E3 D- K
& T2 m1 e$ p% l1 e. u
4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null
( z9 s ]+ \5 Z) |% H+ t# x' P 5) 在null引用上调用属性或方法, 会发生运行时异常( g% f( c. K1 y1 `
5 O% G x' S( D1 M/ s, ^/ N. i3 ^( `
案例:
! t( ^" m2 c8 [! G+ } 平面绘图坐标系中的一个点(Point),定义合理的属性
* i: t. @+ i& q+ H" l1 ? 坐标是int类型.
+ J% z- u* @, q5 }% } O+-----------------------------> X/ i' ?; b" j0 p
|
& D8 _: q0 X* p3 y' T7 K' [1 g: N, @ |5 N7 [7 ~2 J! R+ Z8 E/ x
|
3 T) h4 d2 ]5 `6 C |
n0 S; v6 y0 |% q | . p(x,y)( {+ P3 F( v$ Y# z% m8 w4 H4 \
|
& u1 s% f0 e# h% g5 x9 g |
9 r6 X, i3 s" e8 N. R# y |4 S8 j+ l, O& `+ X: C( u }9 b
|
& w' i8 R5 g. M( U. c
( V7 Q. Q* E" C1 ~/ k Y3 _. B3 M4 l0 J" t% t
/ G) k% {4 ?0 S+ H
3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.9 C! Z$ a# P8 `; b' i: k d9 g Q
1) ) e8 c0 c9 A: h
如: 月饼实例的创建, 使用面和馅创建.
# c/ O# P V) G+ ] ~# O1 r, x 制作(构造器). g G/ l$ k2 o) B& X; Q
月饼模子(类) -----> 月饼(对象)3 u* R% O3 y& z1 [ g* Q: a- g
原料(构建参数)
1 C8 j# x9 T* _6 q4 @# f
: B/ x) d6 c( H, y 点类型 --------> 原点 # X6 e5 C3 ?" |. q( r W
坐标(1,2)/ J% W* m M4 r0 }* c& I9 Q& D6 V
, c' O: m5 P+ H$ x$ k$ G 2) Java中的构造器: 声明在类内部, 方法名与类名一致
) J5 }0 h3 D$ z2 N: v/ \ K 的方法叫构造方法, 构造方法不能声明返回值类型.- M3 u% ?3 [# @( ^' O
构造方法可以包含参数, 参数一般是创建对象实例
8 A; Y4 G% |* a 必须依赖的条件(前提条件).! k/ K' e$ S9 \: e% C: j
public class Point {
4 n+ }. O; v0 J) \* I9 A. b1 V int x;8 z* E1 u5 G" |$ \6 o: A6 ^5 H7 J
int y;
4 L; F/ ^# I# x2 X8 M4 U% D4 } /** 构造器 */
) _% {! }! s3 [ public Point(int x, int y){
3 i+ J# L% j9 _5 q this.x = x;, `& e h2 n- @3 a7 A E
this.y = y;
7 P- f0 T$ o8 m! r; m/ O# V0 Q, S }
5 [5 K( A! t8 w- C O9 p5 q; ` }
! O8 z* b& ?& [) a* P* @; i2 d" c. R, L- k
3) 对象实例化过程:
6 Q3 |3 s S, {$ g new运算: 创建对象实例- t1 |# @ \' v% J& ^ {
1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量
! p: v0 h1 ^ I) k" b& U 2 根据参数类型调用构造器. . x' \2 w0 c2 G! o7 P$ H
3 new运算返回对象的引用地址.
7 C# h' F7 f+ o9 P$ w" l5 `& ]9 g* H* ~2 t5 ? q# k, C. U3 ~
4) this 关键字
) c( {% S% p" P6 ~1 d( B; m* k9 D this 是对当前对象的引用, 是运行期间当前对象本身.7 ~6 p4 O9 Q% W) E( V
可以使用this明确的访问当前对象的属性或者方法; ~, }$ x0 A$ S/ T% X
类似于"我".+ \0 B6 A/ [( Z8 o+ q1 C4 T& T( b
this() 是调用本类的其他构造器, 可以使用构造器的重用,
! `, `# H% q% w4 I) H 简化代码的实现. 1 K5 k5 G" Y1 |6 C
* this() 必须写在构造器的第一行!
% B! i, C( S9 ?5 ^* E' `. v) q4 v+ I; z- t# x
5) 构造方法重载: 参数不一样的构造器
$ Q5 ~& V) [+ q& E 案例: Point.java, ^2 a& P8 _% `: o, a3 A% R
方法签名 = 方法名+参数类型列表
* Z, Q: i6 f1 f4 ?7 j6 r/ o 方法重载:a 方法名一样 b 方法参数不一样- j& R6 _# K" l3 E9 ^; d
也可以说: 方法名一样, 方法签名不同的方法
' k9 E! `1 r w2 R1 ^ j7 R) [0 l" o$ F- Q' {2 ^. ]- i
6) 默认构造器4 U( ~" P+ v% y/ g2 I7 P! m
1 java 类一定有构造器; q3 f* m( R& v- a2 z- \
案例: ConstructorDemo.java2 L, `# w7 V7 A0 e7 y. n
2 如果类没有声明任何构造器,Javac自动提供一个
" f) t2 U$ n# _; Q 默认构造器, 无参数默认构造器 e4 [9 @1 i: J( K' T
3 如果提供构造器声明, Javac将不再提供默认构
) x4 J X0 S5 J! d. _4 x 造器. 1 N) W) o P) E. V1 _
6 Z( Q w. U& E. z: u
4 对象的方法" ~; z7 y' [% U( ?2 W6 l0 G
1) 表示对象的功能, 依赖于对象存在.
* j% [9 _* Q: s) w" V 案例: Point.java' Y2 }2 c6 a1 ~9 i
如: p1.distance() 和 p2.distance()6 \ c) t3 \) u' ~8 c9 U& q- S
方法是动作,是功能,一般用动词声明. , L9 v9 ?0 u" O" a' Q9 ]: m% F9 }
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
' W' f1 N, p+ }- H 功能的多态.重载的方法经常互相重用.
$ B8 d- w& E, J, Y7 Z+ s1 n$ z6 ?& R* q' b+ W& I, n, Q
对象: java运行期在堆(内存空间)中分配, 大小按照属性分配: `5 v7 N9 x( ^1 W! O
引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配( J' W9 _) i% U1 s1 s
实例变量(对象属性)对堆对象中分配(如: 书的名字)
' J( b8 M# a$ v7 h/ X$ X V 引用变量的值是地址值(透明管理,不可见), 通过这个地址9 }$ Z @) Q1 @5 Z
值引用了一个堆对象.
7 {' W4 u7 ]) r; W
7 R6 O% D0 k! t; X 不确切说法: 引用的值是对象/ L+ g7 f& r& P& t% s$ J
引用变量在栈中分配
) x& Q4 |. u% m+ ^' i) D, M; s 类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了/ H5 u7 h4 v# O) \, S$ C
对象的样子.# i& z6 R3 }6 z( @9 }( p
, b3 E+ d+ C& O+ @+ T9 z) q: W
想着对象写类型: 面向对象, 类是对象的抽象化; J6 i: N: a4 e+ [# N( K
5 e$ J) d% U" j' y( H, D( u 方法的重载: 体现了行为的多态现象
% h" J8 R4 `: H) I5 A$ X: V, v+ M/ v/ n; @
|
|