|
该用户从未签到
|
1 面向对象(OO)
+ W' ^. w& g8 @& b- m" d 1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例
3 o/ f$ k5 x' m. i0 ~7 k 2) 面向对象, 面向客观事物之间的关系.
2 U4 j7 I9 e$ P; ` 4) OOA面向对象分析/OOD 面向对象设计
' D; S+ t- e( r4 G. K 客人来了(来了一个客人类型的某人)
3 S, |1 N* D& O; y: Y: _, ~$ a
) Q" M# Q8 y) ?* P6 _- c 5) 面向对象概念" m3 P$ F" ~3 B: [+ I' v: m) |
A 类型: 名词概念, 如: 客人, 菜品, 厨师9 W' [* k( U7 f4 L" j% n8 H, H5 K9 E& `
B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜
2 v$ E; b$ I) ^, [ C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡6 j2 s* | E8 l% g& n
D 行为(方法)
' p9 f$ p- p' }& Y1 Q$ K 基本特征:
: Z @& N& r3 M% G7 m/ S A 多态: 行为/引用, 在具体情形下发生了变化的现象
, ]. V( s% h* L% h! [1 G7 c# i7 u 一盏灯: 多态的
6 ]7 H) C5 L1 Q$ ?6 Y 打: 根据宾语发生变化
8 l1 R5 v: M' ~! {# ^/ P B 封装: 任何对象实例都是尽可能封装, 减少暴露* T: ?/ y1 `/ ~% C( J- Y
C 继承: 概念的继承关系
# c) ~/ I5 y, s' Q" h0 V* x/ ]' s3 V% m
2 java 类型, 引用变量 与 堆对象
) [8 Y: [) B! b9 B9 D! y9 l 1)Java 类, 是用来描述事物类型的. 如: 书
3 [# b5 l: x5 U0 [& R! ` <图书馆管理系统>中的概念: 书 Book/ o5 \* n9 `6 q2 M1 g q
书的特征: 书号, 书名, 编号, 作者, 价格...
7 `1 q* V6 @5 }4 K# _ C 2) 类的声明:- K" v! T# m8 W4 y
public class Book{6 }& Q! Y3 T9 n3 |. c, P! B. A! R+ o
long id;9 z- z, \+ v6 N& a( q& ]
String name;
( V" P* @2 E4 Q' w) q% K& k. o String isbn; //书号/ Z; P, }7 y& S& ~- [7 ~
String[] authors; //作者8 \' [+ T: G9 k% l: S
double price;6 B( S+ j9 |* \" t
}
) R; J' k( _' y 3) 引用变量与对象的创建过程:
& y5 {; `+ |$ z A Java的内存管理与分配:
7 y+ |- ^9 h. {" w4 y8 b7 G. Q 栈是一块Java使用内存区域, 使用的方式 IFO(后来者居上); ]" }# \& c9 t& C0 x; D
堆也是一块Java使用内存区域, 使用方式: 无需随机分配' E% w( M( P3 Y) t% I9 d2 @+ v
B 局部变量 与 堆对象空间分配
+ N! `( ~0 a+ C# B& ~ Java 局部变量在栈中分配, 是按照变量的类型分配
' U: Y! ~5 V+ `% ^ 对象在堆中分配, 按照类的属性(实例变量)分配空间
+ w7 ^5 d+ ]4 U# ], s' k# V6 m C 变量类型与分配% ~+ \/ S; ~8 d
变量分为: 基本类型和引用类型
6 I. |- I% c' P( y0 x0 t; u. e 基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型
; n4 x5 F) a5 w- A x9 `9 T 的值- T" J$ G: {0 Y* p& T
引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆! O& a& R2 N/ H
对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)",
+ m& i3 q* z' O; R2 e4 j& N% M 由Java系统管理: 变量占用空间以及值的管理, 都是透明的. 3 H5 k+ d' `( e0 T7 Y; Z* s
1 q( B P2 }$ r! w7 j: T 4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null
9 B# k- t; K/ I$ f+ X/ J 5) 在null引用上调用属性或方法, 会发生运行时异常
. h& h, t0 P3 a Q% h5 L/ Y0 G t, h, D5 ]7 P$ y7 V/ a
案例:
% d) L+ I7 h8 ]1 j2 C 平面绘图坐标系中的一个点(Point),定义合理的属性
/ n" J' d0 q% B3 s4 A' U 坐标是int类型.- b# K) [! ]4 O! H+ |6 ~
O+-----------------------------> X
4 S' z [5 r+ {; a6 X: P |
9 U# t# \" o/ B: m7 O |2 C) {0 T& y4 j( w, H
|7 i/ P. s: {, B8 f( m N
|
5 R2 N% g: y# I. Q' B | . p(x,y)& z3 N% x$ `; K# ]! D& u% H
|
$ O$ G* k# i0 X |
; ]6 D6 b- h, ?- r z- T |
& R* x* h: R, U- R# P1 F6 x! H |+ B# k+ j2 `* f& N8 P8 e1 K' s- G
. g% M4 D' L1 h
Y
0 n# y, i( ^ S, d" m$ `+ i
4 g3 U/ f- |% u3 f, o; A8 R7 i3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.5 L. ?/ b2 G8 @) I, Z
1)
" n' w$ C6 _3 |0 @9 B 如: 月饼实例的创建, 使用面和馅创建.# V6 Y' }5 ^0 J5 S1 N
制作(构造器)9 H: G# }7 f) N* B: C- I
月饼模子(类) -----> 月饼(对象)
4 c" K3 ^2 P; N6 c9 n7 v, v 原料(构建参数)
+ k8 I: f" ]* x% I2 Y1 X j" M" G; r O) {! E' k+ x
点类型 --------> 原点 6 E* x3 P w2 t2 N/ r3 b
坐标(1,2)0 ^; W! C' w5 R- C0 K! N0 A
7 t5 T9 }7 P' |: }/ \
2) Java中的构造器: 声明在类内部, 方法名与类名一致
) _. i6 T1 |- I 的方法叫构造方法, 构造方法不能声明返回值类型.
' j6 G0 ~/ Y- n3 m& V: ? 构造方法可以包含参数, 参数一般是创建对象实例% U# u4 B% Y/ ^9 E3 A( I+ |6 A' J8 U( o
必须依赖的条件(前提条件).
! b: s+ @8 m N+ E3 w1 F+ t @* c public class Point {
! n Z# q' _0 L' ]$ g) Q int x;4 D# d) K2 [' u ]8 ~/ A# L
int y;( a& s M4 y$ w3 q3 f4 A$ {
/** 构造器 */. ?4 }7 E% `( Y
public Point(int x, int y){
: c( e$ Z' Q+ ^; n: B+ t, M" A5 y' @5 J this.x = x;
; b! o0 q& a/ k5 X) a6 O6 f7 s/ c( M this.y = y;
! H' v3 a9 i% ^$ k. v( b }
. z: \% Q4 z9 a- B$ {/ D; u7 e }3 O/ I$ f" |0 H/ o7 n0 r3 ?, i8 s/ _
; c2 v, d8 T) L4 g% v+ c" Q
3) 对象实例化过程:- S- `+ X' Q' O6 ^" Y3 {
new运算: 创建对象实例. t' u4 R E/ o' r
1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量/ v4 G1 A% S: ]1 Z' v; Y) U8 I+ |# }
2 根据参数类型调用构造器. : q! w; j& Z5 ]" i2 d3 J ^) U
3 new运算返回对象的引用地址.1 ~. }" J3 m7 o' A) n5 j
/ }& x9 Q9 w, n \0 ^
4) this 关键字, E8 y) f$ X( ?* x Z" T: ?
this 是对当前对象的引用, 是运行期间当前对象本身.
3 F: r" a1 f- C7 N% j% B) W 可以使用this明确的访问当前对象的属性或者方法( }- v) q, |3 G% P
类似于"我".+ G2 e1 u3 @/ |# a3 T5 u
this() 是调用本类的其他构造器, 可以使用构造器的重用, ( z: A4 o6 m% }. | ~4 _% d, j* K' N
简化代码的实现.
* z& H% P0 S/ e' {( ^ * this() 必须写在构造器的第一行!6 P2 {8 u" o6 s% b
4 o# I8 Q* i5 h% u
5) 构造方法重载: 参数不一样的构造器
i8 S/ {2 [0 r d/ |( G2 t; K+ d3 ] 案例: Point.java
5 ]! [4 ^% _+ B# f( W& d! L 方法签名 = 方法名+参数类型列表
2 b; A8 }% P2 C X. W 方法重载:a 方法名一样 b 方法参数不一样
: x J& q! _) E- }4 [ 也可以说: 方法名一样, 方法签名不同的方法' Y% R/ |: G# o& u' g) s
7 v; B' o ]. k! D7 Z6 r4 e
6) 默认构造器( l! ^* N1 p+ |6 S
1 java 类一定有构造器
2 g% ~2 r( X9 U! F1 d2 X8 J* S 案例: ConstructorDemo.java
( @ W& @2 w, q2 c% O# p7 B& W 2 如果类没有声明任何构造器,Javac自动提供一个
( Z p' h4 @" L. h6 | 默认构造器, 无参数默认构造器
# _5 {0 g. X+ @ 3 如果提供构造器声明, Javac将不再提供默认构
6 ~- U" Y) ^1 b. K 造器.
2 e+ h" B4 f$ N* A4 S) G6 [' T6 C3 X$ N6 }
4 对象的方法
0 I J6 J" k# H! W 1) 表示对象的功能, 依赖于对象存在.
$ Y5 X& m1 i7 p; \* y% O4 c7 H8 G' K 案例: Point.java6 T2 t( ~2 y' q* d. _( m0 [. J8 W4 @
如: p1.distance() 和 p2.distance()$ R# s- Y2 O& j0 V% m' Y
方法是动作,是功能,一般用动词声明. 2 j- J) K) j8 O2 l$ m& S- L
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
3 m6 [# F+ ^2 ?3 ~ c- ~5 Q 功能的多态.重载的方法经常互相重用. z( c/ u s- A2 X' |
+ v3 P# Z# N1 ?) F% Y! ]
对象: java运行期在堆(内存空间)中分配, 大小按照属性分配$ g- A3 q- `( c2 w" W( j
引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配
1 i" C* `" l: Z/ W& e9 { 实例变量(对象属性)对堆对象中分配(如: 书的名字)* [2 a" J' m5 R1 l
引用变量的值是地址值(透明管理,不可见), 通过这个地址
/ @% w, W2 T8 f& |$ ~( w# v1 j 值引用了一个堆对象.
5 E' V2 K$ j! ]: ?0 n ` L, x7 y1 X# Y- S7 j/ `
不确切说法: 引用的值是对象
7 V! l$ N, V9 B/ {) ~& U. E' b 引用变量在栈中分配: R1 W" s( P$ e+ t' {% L' a9 X' }
类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了0 l- }& ^' F! B' m) g
对象的样子.
2 h) W u6 C- G: H7 a' d
8 d+ ?. `5 K/ w! O 想着对象写类型: 面向对象, 类是对象的抽象化
# S& w$ e& b# p" a5 o. O: k. S
( p, S# F) b7 a8 N9 U 方法的重载: 体现了行为的多态现象6 s! G2 w6 a' V, K3 ~
+ P% O% z( n6 C( t* z
|
|