该用户从未签到
|
1 面向对象(OO) 1 [+ x( ^! P0 [8 J M& E: u
1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例+ }3 E+ z( b- B! m0 j" i: K
2) 面向对象, 面向客观事物之间的关系.: g5 F3 r- S4 T5 W3 m
4) OOA面向对象分析/OOD 面向对象设计
/ e. n/ n3 h. \/ s! b' i, J 客人来了(来了一个客人类型的某人)7 m1 V) g- k4 ^2 J$ P; W
1 A/ F0 Y2 r* j6 `& c# L! q) e) O 5) 面向对象概念
6 ^- D4 @ w# x A 类型: 名词概念, 如: 客人, 菜品, 厨师7 U+ Q6 H: W: A( K* V6 a* S; [
B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜
- j2 {1 o: ^0 T$ D5 o5 y* R C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡
: i g, V2 g: O, ` D 行为(方法)
* Q& x/ d5 f8 V% K 基本特征:) u# H8 C3 l; A3 E; w k0 S
A 多态: 行为/引用, 在具体情形下发生了变化的现象- V! M3 ?# E+ J5 Y8 _/ t) }( d* d$ J
一盏灯: 多态的
0 t5 u; J3 n: T 打: 根据宾语发生变化
, h" K1 y; Y+ P B 封装: 任何对象实例都是尽可能封装, 减少暴露
- H0 G. \2 ?& \* E+ h C 继承: 概念的继承关系% _: k7 G1 u- B& y
) x8 _+ ?8 E8 ~9 Z
2 java 类型, 引用变量 与 堆对象
6 B) N; Q+ Z9 E! I- t 1)Java 类, 是用来描述事物类型的. 如: 书
' v6 H: t# }, F; e: U <图书馆管理系统>中的概念: 书 Book4 r& f9 `* s0 x* o
书的特征: 书号, 书名, 编号, 作者, 价格...
/ ], H! ]2 i K4 B6 n 2) 类的声明:
" X( X; B5 o' Z5 u# q public class Book{
4 \; X) g& J! t" [# z: K" a long id;; t2 `. i; P6 e: a% n
String name;
" ?) O8 |% l8 o( `, ^. `& X! t String isbn; //书号
0 p0 C! t" ^" ~$ g: ~+ Y$ k, z String[] authors; //作者
1 `5 b- {" O2 p double price;
' c5 Z: l: h4 g8 ?/ [3 c }
# c9 J: {8 }5 I3 p) X4 [ 3) 引用变量与对象的创建过程:
& |% S) T7 U* n0 D: P: j A Java的内存管理与分配:' U( |* E' G5 r+ y: C" B
栈是一块Java使用内存区域, 使用的方式IFO(后来者居上)
+ y2 {4 O. y! ?& L- ]8 ?" E: A 堆也是一块Java使用内存区域, 使用方式: 无需随机分配" [% U: L4 I6 X. D8 B
B 局部变量 与 堆对象空间分配- D$ }' L4 ^) D( T w
Java 局部变量在栈中分配, 是按照变量的类型分配 + {0 A: O! h0 q- Q
对象在堆中分配, 按照类的属性(实例变量)分配空间! x& E% |/ d$ ~1 v3 p, E
C 变量类型与分配/ u z8 g* R' p5 ?# `' B! g- S. q9 ~& |
变量分为: 基本类型和引用类型
9 {3 C3 M2 p" l! y( p$ E 基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型. D) I$ I, _" A! S4 p3 j/ f
的值
) u- V0 l3 L8 E" w. ^- K 引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆
8 V6 n2 O3 Q7 ? D 对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)", g" U& K0 m. e2 H/ v. l
由Java系统管理: 变量占用空间以及值的管理, 都是透明的. ' h2 m! S; ~/ C( s' @* W. E
9 S T/ j, M; r0 a6 h 4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null
$ _6 ]+ `+ q3 T- z' A- ? 5) 在null引用上调用属性或方法, 会发生运行时异常
* u) U; n2 h l# M/ J2 E
" I5 I7 d* v4 j! g- | 案例:( |5 p" n6 I; I* d6 r
平面绘图坐标系中的一个点(Point),定义合理的属性; K u/ J+ x7 i! V1 R9 Q0 }
坐标是int类型.
9 p8 ?8 H; a! u7 G9 V+ I$ V O+-----------------------------> X
& ]/ y3 \9 R' ]: E |( n' Z B2 l+ L7 l9 P z
|! s( W+ ]! |& ^; h/ L. _. ^' ~
|
6 w( c' G! Q5 i8 E3 b5 \ |
c4 F9 c+ N! `9 O5 m# k | . p(x,y)
) q6 I5 n! a4 H2 N |5 D; ]1 `2 w( ^: j3 B% k7 Y! {
|
; O! r" N# X9 d# ~ |
3 h1 x' q) E7 W/ O y) o# d |
1 H% d* r; q- p1 \( r* s, Y
) r, j+ O- u# t+ i" ?% ?5 ` Y+ m1 e$ V3 ?2 F1 v, v* C
$ R+ C0 f: E9 A' d Q s3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.
" y& y0 H5 N$ E L5 j. ?' o$ T 1) 7 D1 [% o" \/ n
如: 月饼实例的创建, 使用面和馅创建.9 r/ a/ ?3 |% k) l/ w9 T7 q0 A% r9 g
制作(构造器)
* h s. J* j. l( }& [! y( I! }* T) v$ O 月饼模子(类) -----> 月饼(对象)
6 d4 G" |8 C7 D0 I: G 原料(构建参数)+ ]' g8 z# ~4 |' f: q- \) R
1 ]* v5 E! P! p$ U0 N( j" y 点类型 --------> 原点
( X4 R+ C: h; c1 N6 L5 t+ | C. s 坐标(1,2)
) q& P( G. u0 j: U' `3 ^* Y2 n% w! x' V2 z2 V4 C, F: E
2) Java中的构造器: 声明在类内部, 方法名与类名一致
; {' c8 \/ R" P6 T) P 的方法叫构造方法, 构造方法不能声明返回值类型.
/ t3 M: F; r# K" c7 n& u 构造方法可以包含参数, 参数一般是创建对象实例7 x- c. |# H/ d& ^
必须依赖的条件(前提条件).' n5 j* N* Y* ?+ e! V9 M
public class Point {' I5 {6 Z8 A# B! j; g' O+ Z# c
int x;
+ ^4 ?9 S+ a8 b0 X int y;
O& h; L+ c3 ?7 e /** 构造器 */3 O; E2 m' T$ u1 e" L- h
public Point(int x, int y){ v8 _" P f& n( M" z5 A* r
this.x = x;3 z5 c& t" S/ m( ?1 m! [1 Z: c
this.y = y;: M% z# u1 a" T( F5 V8 D3 m
}, |" q3 k6 T6 r. ~1 t- b! z9 k" U0 G
}3 T" A) q& S3 a* D
6 Q( ]. `2 B6 N/ K8 m3 O. r
3) 对象实例化过程:; ] b- f+ c" Y) Q( N+ H8 C
new运算: 创建对象实例, J( O! I% E7 K) B
1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量
# U' W" B) E" B: b- p4 @ 2 根据参数类型调用构造器.
1 M1 S3 b. y0 \2 r 3 new运算返回对象的引用地址., q8 F9 U3 _+ |9 J" i
2 [3 B ?; y% L F9 x 4) this 关键字' o3 Y) W( P! c1 G/ U) U7 b) ?
this 是对当前对象的引用, 是运行期间当前对象本身.+ T$ y Y2 p' M6 m% a# [
可以使用this明确的访问当前对象的属性或者方法
% J% {" e7 `, i) i' W. [* n 类似于"我".
+ g0 D, o p+ g: w9 k3 V this() 是调用本类的其他构造器, 可以使用构造器的重用,
7 W- ]7 b0 ~4 x9 a' u/ T 简化代码的实现.
- u% ? Q# ~2 i * this() 必须写在构造器的第一行!: P0 E; @) U5 q; H
8 w5 ^- g+ |; [( l- T8 N. i
5) 构造方法重载: 参数不一样的构造器5 } U2 G7 a! I, v5 g7 @1 X) ~2 @
案例: Point.java
, @# N1 L, _: k7 T/ u 方法签名 = 方法名+参数类型列表5 B& c$ d5 L' s: D& F4 y, W
方法重载:a 方法名一样 b 方法参数不一样
4 i/ f! ^, L4 C: ]) ]% D 也可以说: 方法名一样, 方法签名不同的方法% D6 f8 R# M3 Z- b$ p; h5 @- I
7 t b) ~& X# w5 ^" n; k 6) 默认构造器
9 n7 T% N! |1 ~$ m; d# c 1 java 类一定有构造器% d" t2 l+ l/ v
案例: ConstructorDemo.java9 i1 o- o) x& e2 V# `& j
2 如果类没有声明任何构造器,Javac自动提供一个
% f& g: |+ \2 ] p1 T* } 默认构造器, 无参数默认构造器
$ I A8 h- J4 ~/ P4 o4 k0 A 3 如果提供构造器声明, Javac将不再提供默认构
* w, c* t' g$ e- |' w9 D; L9 t 造器.
! q* \) m2 I8 t: S: B! w/ S5 W/ ^2 N# |# R
4 对象的方法* u+ T3 Y6 ?1 x# }$ `2 v0 U8 {
1) 表示对象的功能, 依赖于对象存在.
* f# p; x' D/ Q( o. \ 案例: Point.java
* v+ ]' Z/ z8 Y9 J+ k' ]4 W9 U 如: p1.distance() 和 p2.distance()% {/ _3 U6 J* R$ P* B' T
方法是动作,是功能,一般用动词声明. 4 F, m9 y. X+ U2 N7 V
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
9 D+ i8 i- }# H( y 功能的多态.重载的方法经常互相重用.$ u0 ?. W# K1 m( x8 V
' K* ^! V8 v2 z& I/ x/ g/ [ 对象: java运行期在堆(内存空间)中分配, 大小按照属性分配
& I4 K# U7 ]% X+ {" G 引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配
7 {1 Y7 Q+ m6 @ 实例变量(对象属性)对堆对象中分配(如: 书的名字)
$ D0 i; f: g6 f [ 引用变量的值是地址值(透明管理,不可见), 通过这个地址
: z0 G8 T+ L. p4 ^& S% A 值引用了一个堆对象." ~3 l4 g3 G9 z Y5 ~% `4 c
4 }' @3 F$ o/ d1 X- A5 m) G# g
不确切说法: 引用的值是对象
' X/ ?% D% g6 }% B K7 G8 M- h 引用变量在栈中分配% _7 k0 z* M; x, ?3 N
类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了$ `7 R+ U7 E& c4 Y
对象的样子.7 H8 ?5 S- r9 {( m
5 _" k s9 g7 k: G2 x7 h. b" a 想着对象写类型: 面向对象, 类是对象的抽象化
6 C. K ^3 T( `4 q5 }0 Z2 z1 A l, E8 a: i: R6 ~8 t
方法的重载: 体现了行为的多态现象, c7 p" ?" i8 d. ~9 C4 y
. ?8 Q$ [' S9 a2 u% W/ ~. ] |
|