|
该用户从未签到
|
1 面向对象(OO) # n7 k8 |. O: ~6 H1 T
1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例% o& K% `- f2 n% Y( _
2) 面向对象, 面向客观事物之间的关系.
$ t) b1 r: @5 ~2 b 4) OOA面向对象分析/OOD 面向对象设计
! L3 t1 D* }: u( n' E6 S: ` 客人来了(来了一个客人类型的某人)/ l2 N5 C" ], ~
H- _) E M. n& L 5) 面向对象概念 i2 t/ ]% ], Z
A 类型: 名词概念, 如: 客人, 菜品, 厨师
# r, a- o5 ^2 U7 s B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜
) t+ y9 J" K$ o/ U: G0 M C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡
! U# m9 L8 s# t0 a9 f4 }5 o" U; F D 行为(方法)- s0 T- d% k6 ^+ O5 K% C$ }7 T m7 r
基本特征:
/ [, ? F: W: S3 w* w W+ `: C/ n A 多态: 行为/引用, 在具体情形下发生了变化的现象1 v5 U4 l4 s6 q Z8 _& J
一盏灯: 多态的
S* t* R* W9 K: u9 c 打: 根据宾语发生变化
) f# [+ T# m, B% O B 封装: 任何对象实例都是尽可能封装, 减少暴露' `4 q/ M4 I6 P0 q+ H* c, `
C 继承: 概念的继承关系 j: g/ j; ^6 @6 r
+ ~) }. F; ?2 Q: S# [4 K, X; k8 ~
2 java 类型, 引用变量 与 堆对象+ e. D5 q3 d; c( a+ t/ ?
1)Java 类, 是用来描述事物类型的. 如: 书' s0 Q! }9 r+ v* m
<图书馆管理系统>中的概念: 书 Book+ u& D* A1 P& O s- t$ _( f
书的特征: 书号, 书名, 编号, 作者, 价格...
: F: a1 `$ L2 \0 @: } 2) 类的声明:
1 x5 h! G9 Y4 o3 T: C6 ` public class Book{7 N0 U: C6 v/ C2 t( S$ c
long id;
6 Y0 K; @- f( \) U String name;' J/ m# i1 w0 T7 B2 y
String isbn; //书号0 Q1 X5 U( h, K! k; N, k
String[] authors; //作者
+ t& y" ]0 R8 A' K double price;' k3 s, O$ ^2 g; b
}0 F% N+ }! k' N: j0 i
3) 引用变量与对象的创建过程:
; b. Q& d9 f; ?7 C7 x/ q* N/ @; h A Java的内存管理与分配:
$ {5 G2 N) H1 w* D 栈是一块Java使用内存区域, 使用的方式 IFO(后来者居上)! p- r7 v4 ?. ?! o: C
堆也是一块Java使用内存区域, 使用方式: 无需随机分配
/ Y; L$ y& m* }+ b; ]. Y B 局部变量 与 堆对象空间分配
% M" T! z4 O( Y. A( _9 a6 C Java 局部变量在栈中分配, 是按照变量的类型分配 , z" O& B: v- G9 [: E
对象在堆中分配, 按照类的属性(实例变量)分配空间 G- ?- B2 }% X/ b
C 变量类型与分配9 _' W+ m7 ?' ^* }: Z
变量分为: 基本类型和引用类型8 U. g- n8 u2 W9 q, |9 t ~: e) g$ W
基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型! F, v" U+ o0 \& t" N5 g8 w5 d: D
的值
' m6 d% A5 |8 \5 g$ Y5 D: ^ 引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆
. W8 G0 ~: \3 o 对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)",4 Q% z$ P/ ?$ `
由Java系统管理: 变量占用空间以及值的管理, 都是透明的.
# b& Q/ g; k9 I$ ~: H1 t5 F3 R% k7 a0 a2 U3 M, A' q
4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null
6 X9 g; n u/ B# F, K/ t 5) 在null引用上调用属性或方法, 会发生运行时异常3 @2 l8 P5 `+ h5 ~- N
+ [ m! i! T; x! K, a" U+ ~ 案例:
- Y: N/ [+ i' U. W 平面绘图坐标系中的一个点(Point),定义合理的属性+ n- Y: {4 Q P! U5 v3 ?
坐标是int类型.3 }* p* n0 D4 W3 }4 }5 Q# |6 G
O+-----------------------------> X
6 p" ?9 i- u- ]0 ?1 `9 y) z |3 ]7 Y+ X N/ V# S
|
4 ~0 ~ u R J0 U; q$ g5 X' E |" X1 Z$ j1 L2 X; m$ h
|
) z3 O5 `# r- t, C' \! A | . p(x,y)
8 S" d/ W$ C1 F" d: Y5 r |
2 ?" L) K4 P4 n, Z4 f: T" ` |2 J! b" S, u- z1 K& F
|. [7 q: S9 X- g& p; ~+ A4 Z% J: t
|
- I& U' l; i4 x4 H+ b: B+ y! P: g% @3 ?, R1 Y: W& I: P" [
Y
% s. a& J4 R, R. k: U& t" E5 u B
1 ?% z. v) n4 D: e7 J1 i, @* {3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.
( F; @- N; J" R# D' @ 1)
0 L6 q- Q, H7 v& ] w% j 如: 月饼实例的创建, 使用面和馅创建.4 I6 A3 r/ u; U3 U8 O) K) `; l! H
制作(构造器)
$ `2 N% X* I0 T; \% | 月饼模子(类) -----> 月饼(对象)0 z; [/ x4 |9 T1 G, \2 n: C
原料(构建参数)' R" ~" i+ O% a! F& e
, f8 I' I- L! Z+ N 点类型 --------> 原点 - g- v' i+ j4 Z! ]5 G. A* H1 s
坐标(1,2)" _( W, \3 l. T a
$ r" s8 ?( g' p7 X
2) Java中的构造器: 声明在类内部, 方法名与类名一致7 _" x2 B, g, ^- W
的方法叫构造方法, 构造方法不能声明返回值类型.
c1 J. x* p; s1 A4 b3 h 构造方法可以包含参数, 参数一般是创建对象实例
6 u" k& I5 F3 T/ t 必须依赖的条件(前提条件).
: M9 T& \3 t2 J3 L public class Point {
4 R7 u; G/ i& X7 A/ \5 c$ I int x;
. V% x7 ~ q* s% d q- | int y;
, p3 @1 \5 d$ f9 u /** 构造器 */6 j# Z0 ^' ~7 @* a9 v9 o% n, Z0 u
public Point(int x, int y){/ `4 `* \, _) U- o7 |
this.x = x;( o) a/ h/ o2 [
this.y = y;/ X9 V# y& D6 k; r9 @3 O i
}& }6 n& i7 y/ i0 o
}; @" Z+ B8 H8 x4 K
! T$ ~; W% H( z: k2 v
3) 对象实例化过程:
I9 D3 F9 U- y. w4 w new运算: 创建对象实例
( a. ~9 l2 N& J# G A4 J0 w" J5 N* _5 E 1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量
! y1 M0 d1 P3 P" d4 x 2 根据参数类型调用构造器. 6 p4 n A* L! `. N5 A7 U, K
3 new运算返回对象的引用地址.: q5 W8 S; K0 @" P
7 X7 U1 A x# R 4) this 关键字
# }5 i! Z( R2 `' G4 n7 r/ L& s this 是对当前对象的引用, 是运行期间当前对象本身.
+ B" G/ G' ~' e# q3 S 可以使用this明确的访问当前对象的属性或者方法/ ^* @$ e3 w, P: F8 c
类似于"我".
0 Q5 E9 v! [+ S; \ this() 是调用本类的其他构造器, 可以使用构造器的重用,
. H% Q7 t3 d# `- S 简化代码的实现.
& C5 m6 s/ A# ^. O3 X/ x * this() 必须写在构造器的第一行!2 A' o! \0 J& Z) V0 g m) G
p6 ?- H4 a. r- ?
5) 构造方法重载: 参数不一样的构造器' h4 d" `, z6 a; r$ ^
案例: Point.java2 T3 R0 N# z* E' k' ^6 l
方法签名 = 方法名+参数类型列表
8 ~. ~0 V( J. N' Q2 F 方法重载:a 方法名一样 b 方法参数不一样
- O6 t4 }1 G- S* A 也可以说: 方法名一样, 方法签名不同的方法
5 _" U+ R: a, l
# ^* S0 _" D& O! S- C1 @9 P! v 6) 默认构造器& N& I# C* U( b( ~; a' Q
1 java 类一定有构造器# R) A9 M1 d. W5 E& v
案例: ConstructorDemo.java
0 X6 ~3 [" g& I8 _( c# I+ m$ j 2 如果类没有声明任何构造器,Javac自动提供一个
+ y8 ?! q9 A- v: V | 默认构造器, 无参数默认构造器
1 I* G0 T& d/ s4 e9 Y& r) b 3 如果提供构造器声明, Javac将不再提供默认构2 @ Y: V3 \2 f. T: a2 X) m
造器. & j& A0 V* r8 m9 A
( K0 d0 l+ t s0 z8 v4 对象的方法
. ~6 G: g* ?( L0 m 1) 表示对象的功能, 依赖于对象存在.
" X3 [( h8 `) U: x 案例: Point.java+ ]9 @" b8 O+ ]" P
如: p1.distance() 和 p2.distance()8 J# a; _5 a4 t& s4 y
方法是动作,是功能,一般用动词声明. ; ~1 o3 J$ H3 X
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,- V7 L7 F9 ~( R0 O- d! F. K% o
功能的多态.重载的方法经常互相重用.
" R9 B' X. r, i% v" o. \$ s4 L0 _% l9 R
对象: java运行期在堆(内存空间)中分配, 大小按照属性分配( E% g r6 Q$ c/ y# l/ Y
引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配
4 k0 b( ~- J7 o# W% T) H+ K 实例变量(对象属性)对堆对象中分配(如: 书的名字)$ K5 o, w+ W0 b0 p+ n
引用变量的值是地址值(透明管理,不可见), 通过这个地址" t( O/ S2 B* F, ]! F1 |
值引用了一个堆对象.
' G. m0 ?9 g; R3 _+ m- m3 h1 U3 @8 s2 {# ]9 g$ x
不确切说法: 引用的值是对象
. d7 r4 h% ]" ^9 F* z 引用变量在栈中分配$ x+ S* k. x' Z8 m6 {% z+ V
类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了" ]9 Y0 E9 Q1 v1 @. T5 c
对象的样子.3 M8 d: p$ z9 g) t7 T+ g5 d
, I: e3 s% e- b" K1 `
想着对象写类型: 面向对象, 类是对象的抽象化
, e9 v+ F9 l `: a6 b- ]/ G3 E* i- p+ f- x) b5 O, D9 y
方法的重载: 体现了行为的多态现象
8 I# K. g4 Z5 p0 J- e$ T
2 |9 @/ M) @1 ?) `- L |
|