该用户从未签到
|
1 面向对象(OO) 2 P+ Z, b9 Z- L* A" u! A0 L8 ]
1) 什么是Object(对象), Object 本意:东西,是指一个具体事物实例
3 p, ~% k, G* j( w9 O c( b0 A 2) 面向对象, 面向客观事物之间的关系.# Y9 {: V& W N9 A$ l
4) OOA面向对象分析/OOD 面向对象设计 u3 O% X' R' M, H
客人来了(来了一个客人类型的某人)
% e- ?0 o- J, k6 m/ Z: S- k* K9 U5 |, e
5) 面向对象概念2 i& e: [2 L9 G
A 类型: 名词概念, 如: 客人, 菜品, 厨师
" t2 p2 h2 c( m% ~2 |! Z z B 引用(变量): 引用具体概念实例的代词, 如: 某人, 特价菜, m: M7 G5 _9 }+ a
C 对象(东西): 具体概念的个体实例,如:张三丰这个人, 一盘大盘鸡
$ [6 D- w& l+ d3 s. F# d @ D 行为(方法)
" u8 D# e+ Z9 G1 ? 基本特征:1 @( u' q# j6 _- n& X; P
A 多态: 行为/引用, 在具体情形下发生了变化的现象: P4 g2 l! e" F+ N2 y
一盏灯: 多态的
: `- x. M- Y6 i: J2 Q3 T3 Z8 C 打: 根据宾语发生变化
8 t- T1 D) p: ^% g3 O B 封装: 任何对象实例都是尽可能封装, 减少暴露
( \4 Y2 C# ?4 u5 x/ f* K( ^ C 继承: 概念的继承关系
x! r3 M* D; a) a
( b- T' D% y0 O* w- J( G3 A2 java 类型, 引用变量 与 堆对象) j* t, }7 U# e% u, o2 \
1)Java 类, 是用来描述事物类型的. 如: 书& D8 c7 v+ p! F) Z% {
<图书馆管理系统>中的概念: 书 Book8 C$ P# f: c/ B+ \7 y+ | `
书的特征: 书号, 书名, 编号, 作者, 价格...
! G9 O8 r8 Y0 R" J( O; K 2) 类的声明:
" S% N& N& M- C T3 V9 ]( J public class Book{
* @! ~/ k+ ?+ `' L' Y0 O t long id;
+ T0 y: M. l( I. m String name;
3 @' G7 A1 Z0 g* u& e String isbn; //书号
0 w' d1 k, ~& d& B- W" l7 D0 c' q String[] authors; //作者$ k# t8 C1 F6 w
double price;7 u; L1 x. ?, ]) _ z) b# g) A4 y
}
1 t3 s, V+ L5 n% e, Y, _0 j 3) 引用变量与对象的创建过程:
1 z( z) E! t2 p0 {$ m/ C1 J0 ] A Java的内存管理与分配:
! G- J1 x1 y( s: ]3 V 栈是一块Java使用内存区域, 使用的方式IFO(后来者居上)5 w1 a8 E7 l: @& M! ~
堆也是一块Java使用内存区域, 使用方式: 无需随机分配& W% j3 | }* j$ {9 F5 I
B 局部变量 与 堆对象空间分配7 T+ L, z/ Q! k
Java 局部变量在栈中分配, 是按照变量的类型分配
7 D) F" J/ H! x+ I 对象在堆中分配, 按照类的属性(实例变量)分配空间0 ~' N! X1 Q2 A0 X: g( t
C 变量类型与分配
c& [8 J# m5 M* `' P9 Q 变量分为: 基本类型和引用类型& w, c: `' H2 m u0 a6 C
基本类型变量的空间大小: 就是基本类型的空间大小, 值是基本类型
- |, J0 q6 v8 y2 Z2 _3 M 的值
( e/ Q! e: w: E; U a 引用变量的值是一个对象的地址值, 引用变量通过地址引用了一个堆/ i0 ?2 R+ }) q2 l5 G/ G+ W
对象.引用类型变量的占用空间大小和值管理是"透明的(不可看见)",
( ?7 Y+ X9 j& F# }# [ 由Java系统管理: 变量占用空间以及值的管理, 都是透明的.
# I, j; P+ z6 b4 ] b- ?+ e# p7 ^2 X' K
4) 对象的属性默认自动初始化的. 自动初始化为"零"值, 引用为null/ K! m! N5 U7 ^& Q4 c
5) 在null引用上调用属性或方法, 会发生运行时异常
3 m; K5 R+ S' M) F' s; m& d( J8 d5 H' Z
. F4 q$ {9 T; R! j 案例:
j! m: `. C6 _2 u2 h, a 平面绘图坐标系中的一个点(Point),定义合理的属性
5 J' | Y) g1 d 坐标是int类型.$ `; L/ \7 b0 x9 Y, I/ y0 `- ]
O+-----------------------------> X
+ _7 G) M, Z/ z A |
% T* p! S) y9 x& I6 j4 U3 L1 `; I |8 [5 z; W3 M6 @! {' I
|" I" a; Y+ F6 Q F
|
$ i( m# G8 O" n; a: V; J1 G | . p(x,y)
) P7 `4 H! C3 b" l5 l |
% U5 x4 B. {0 ^9 g: K! ?& _0 v1 | |* i- \3 G9 a1 `6 Q% Q
|
1 [5 o4 W! W' S \, |$ G! { |4 Z. m; G# T5 w, D- c! x
C0 `/ Z1 J+ \
Y
! k* P! y% N7 G }3 `
8 P$ G6 k5 U0 G9 f% h! u+ k6 N' G3 构造器(构造方法) 的作用: 用来描述对象的创建过程的.1 v. n" o8 Y) i+ l) {
1)
0 Y5 N$ S: t: T# `- P# J+ M$ W: ` 如: 月饼实例的创建, 使用面和馅创建.+ z' y0 P! |3 y6 k# a# ]5 N
制作(构造器): [ |9 |. c( M% ]* H" B n
月饼模子(类) -----> 月饼(对象)
% g& k. O0 V$ a9 {% u( a 原料(构建参数)2 c, m1 n6 E z2 e* I+ Q# n
0 R# o1 F9 t& m* h; I 点类型 --------> 原点
" {' K, A7 i- ]- O& ?# d! H% k# C 坐标(1,2)2 @& o8 ~% T- f
! P+ Q. f5 h C, e( ]: q5 s 2) Java中的构造器: 声明在类内部, 方法名与类名一致. c! L" i: s( I6 w! r' V
的方法叫构造方法, 构造方法不能声明返回值类型.! {) G8 g! v+ e! t, W
构造方法可以包含参数, 参数一般是创建对象实例
4 X3 R8 G5 F; R/ N M: Y 必须依赖的条件(前提条件)./ }- j1 t9 D V! |+ t
public class Point {
8 c4 [% P4 H* I. ~; ] int x;
1 B1 n+ h7 a# C! }7 x4 E int y;( ]0 e0 P$ ~, J% X% Y3 D! f: c
/** 构造器 */
. i, `$ k! n" x+ B public Point(int x, int y){6 G$ e5 S" N" ?! f2 x/ A
this.x = x;
9 A" y1 b# h9 n6 l this.y = y;
: d( r: K' `8 a7 D5 u }6 l* m$ x4 t- Z) e% R- X' F
}
) N- f9 I g. H; Y6 ~. f5 p; b( u& X2 O& H+ v
3) 对象实例化过程:
3 U$ M1 V% [6 S. z, s1 v6 b# y new运算: 创建对象实例
+ p# _- U. I2 G 1 根据类的属性在堆中分配对象空间.并且自动初始化实例变量
0 d. g. w9 F+ ]+ C* Z) |) s 2 根据参数类型调用构造器.
2 g7 [& X9 |1 A 3 new运算返回对象的引用地址.
, r. j! x: x0 {7 o6 Y
* t- A8 |4 I' y 4) this 关键字2 z: W; M/ l4 t/ r
this 是对当前对象的引用, 是运行期间当前对象本身.6 t- t) k/ S3 q+ g/ C/ \
可以使用this明确的访问当前对象的属性或者方法2 L: k3 ?" D* j. k" k
类似于"我".% n' ?( o, E2 @/ L$ ~0 Q2 c/ d
this() 是调用本类的其他构造器, 可以使用构造器的重用, $ \. o4 x; N' X! B8 l6 D1 f) @
简化代码的实现. 7 C. e X3 [2 R8 V, l4 f0 `2 {
* this() 必须写在构造器的第一行!7 b* C- z F( p9 l, u
7 E0 A2 _- O9 r9 ~7 [. ^: `$ Y$ x 5) 构造方法重载: 参数不一样的构造器/ ~4 G2 m9 J \& u2 ~8 n- f
案例: Point.java/ R$ y3 u+ w6 v p& c
方法签名 = 方法名+参数类型列表& I" L5 h! F/ f8 u
方法重载:a 方法名一样 b 方法参数不一样
& ?2 }* r/ L) |+ w 也可以说: 方法名一样, 方法签名不同的方法. b* j/ i8 D- Z% H
; b k+ {. x2 o& |7 d# W 6) 默认构造器
# v4 Y; `, X* _' z9 t: H 1 java 类一定有构造器# ]+ ]% m6 f# y
案例: ConstructorDemo.java; x8 K: H0 |6 r. S, P( z
2 如果类没有声明任何构造器,Javac自动提供一个* O' o; a/ w5 U$ E& A
默认构造器, 无参数默认构造器6 F3 Z" Z. L" L! |
3 如果提供构造器声明, Javac将不再提供默认构) i/ i! b8 [$ Z: l' Y: S
造器.
% S; V+ x3 q4 F5 A; D# a2 \% R5 X) f( q2 H* a3 l. }0 l+ I: r
4 对象的方法5 l9 U, p5 ~8 I
1) 表示对象的功能, 依赖于对象存在.
3 g8 ~, e7 O6 ] 案例: Point.java
* x1 v! R5 S c, c4 c 如: p1.distance() 和 p2.distance()
! p: N* E: T4 S 方法是动作,是功能,一般用动词声明. 7 H% N6 H: a9 s& E R$ [- u
2)方法也经常重载, 重载:方法名一样, 参数不一样重载体现了,
1 L6 W1 Q6 K( s0 ]; `5 A 功能的多态.重载的方法经常互相重用.0 A: n! @1 Q6 q( o0 ]$ P
, y0 h& R" @* N& L3 T
对象: java运行期在堆(内存空间)中分配, 大小按照属性分配
" k* J2 ^9 C+ }9 }- R 引用(引用变量): 临时变量(方法中的变量和方法参数)在栈中分配
# g( C9 n3 n2 t8 b 实例变量(对象属性)对堆对象中分配(如: 书的名字)0 c$ m/ I. i/ }; i7 ~+ V( o8 g
引用变量的值是地址值(透明管理,不可见), 通过这个地址% `$ o/ T; {$ V% K8 J# [ s
值引用了一个堆对象.+ @, I) v- T! }* k- p5 p. k
) v6 V! s; _8 ?# {
不确切说法: 引用的值是对象
) M; z& Q! @9 `1 K d0 v 引用变量在栈中分配( \2 W" v; |0 Y
类(类型, 是名词概念): 对象的模板, 是对象的样子, 蓝图, 类型决定了2 b; F3 S4 L4 D ?
对象的样子.0 u; j8 ~5 T3 _# T X) q9 s6 d* W& Z
" m! k0 y' q! W/ k! Y X 想着对象写类型: 面向对象, 类是对象的抽象化5 |2 I3 S! Q. j2 Q2 \8 S& v8 I
0 O6 U- {# x5 P& u3 p$ {' U S
方法的重载: 体现了行为的多态现象
6 \3 w- m! a9 L1 W: d* j9 @& S+ d
. }! K7 T( j- q: [" @7 S |
|