@@ -302,4 +302,128 @@ new Person();
302
302
new Person (). initialize(" 沉默王二" , 18 , 1 );
303
303
```
304
304
305
- <img src =" http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png " width =" 700px " >
305
+ ### 05、关于对象
306
+
307
+ ** 1)抽象的历程**
308
+
309
+ 所有编程语言都是一种抽象,甚至可以说,我们能够解决的问题的复杂程度取决于抽象的类型和质量。
310
+
311
+ Smalltalk 是历史上第一门获得成功的面向对象语言,也为 Java 提供了灵感。它有 5 个基本特征:
312
+
313
+ - 万物皆对象。
314
+ - 一段程序实际上就是多个对象通过发送消息的方式来告诉彼此该做什么。
315
+ - 通过组合的方式,可以将多个对象封装成其他更为基础的对象。
316
+ - 对象是通过类实例化的。
317
+ - 同一类型的对象可以接收相同的消息。
318
+
319
+ 总结一句话就是:
320
+
321
+ > 状态+行为+标识=对象,每个对象在内存中都会有一个唯一的地址。
322
+
323
+ ** 2)对象具有接口**
324
+
325
+ 所有的对象,都可以被归为一类,并且同一类对象拥有一些共同的行为和特征。在 Java 中,class 关键字用来定义一个类型。
326
+
327
+ 创建抽象数据类型是面向对象编程的一个基本概念。你可以创建某种类型的变量,Java 中称之为对象或者实例,然后你就可以操作这些变量,Java 中称之为发送消息或者发送请求,最后对象决定自己该怎么做。
328
+
329
+ 类描述了一系列具有相同特征和行为的对象,从宽泛的概念上来说,类其实就是一种自定义的数据类型。
330
+
331
+ 一旦创建了一个类,就可以用它创建任意多个对象。面向对象编程语言遇到的最大一个挑战就是,如何把现实/虚拟的元素抽象为 Java 中的对象。
332
+
333
+ 对象能够接收什么样的请求是由它的接口定义的。具体是怎么做到的,就由它的实现方法来实现。
334
+
335
+ ** 3)访问权限修饰符**
336
+
337
+ 类的创建者有时候也被称为 API 提供者,对应的,类的使用者就被称为 API 调用者。
338
+
339
+ JDK 就给我们提供了 Java 的基础实现,JDK 的作者也就是基础 API 的提供者(Java 多线程部分的作者 Doug Lea 是被 Java 程序员敬佩的一个大佬),我们这些 Java 语言的使用者,说白了就是 JDK 的调用者。
340
+
341
+ 当然了,假如我们也提供了新的类给其他调用者,我们也就成为了新的创建者。
342
+
343
+ API 创建者在创建新的类的时候,只暴露必要的接口,而隐藏其他所有不必要的信息,之所以要这么做,是因为如果这些信息对调用者是不可见的,那么创建者就可以随意修改隐藏的信息,而不用担心对调用者的影响。
344
+
345
+ 这里就必须要讲到 Java 的权限修饰符。
346
+
347
+ 访问权限修饰符的第一个作用是,防止类的调用者接触到他们不该接触的内部实现;第二个作用是,让类的创建者可以轻松修改内部机制而不用担心影响到调用者的使用。
348
+
349
+ - public
350
+ - private
351
+ - protected
352
+
353
+ 还有一种“默认”的权限修饰符,是缺省的,它修饰的类可以访问同一个包下面的其他类。
354
+
355
+ ** 4)组合**
356
+
357
+ 我们可以把一个创建好的类作为另外一个类的成员变量来使用,利用已有的类组成成一个新的类,被称为“复用”,组合代表的关系是 has-a 的关系。
358
+
359
+ ** 5)继承**
360
+
361
+ 继承是 Java 中非常重要的一个概念,子类继承父类,也就拥有了父类中 protected 和 public 修饰的方法和字段,同时,子类还可以扩展一些自己的方法和字段,也可以重写继承过来方法。
362
+
363
+ 常见的例子,就是形状可以有子类圆形、方形、三角形,它们的基础接口是相同的,比如说都有一个 ` draw() ` 的方法,子类可以继承这个方法实现自己的绘制方法。
364
+
365
+ 如果子类只是重写了父类的方法,那么它们之间的关系就是 is-a 的关系,但如果子类增加了新的方法,那么它们之间的关系就变成了 is-like-a 的关系。
366
+
367
+ ** 6)多态**
368
+
369
+ 比如说有一个父类Shape
370
+
371
+ ``` java
372
+ public class Shape {
373
+ public void draw () {
374
+ System . out. println(" 形状" );
375
+ }
376
+ }
377
+ ```
378
+
379
+ 子类Circle
380
+
381
+ ``` java
382
+ public class Circle extends Shape {
383
+ @Override
384
+ public void draw () {
385
+ System . out. println(" 圆形" );
386
+ }
387
+ }
388
+ ```
389
+
390
+ 子类Line
391
+
392
+ ``` java
393
+ public class Line extends Shape {
394
+ @Override
395
+ public void draw () {
396
+ System . out. println(" 线" );
397
+ }
398
+ }
399
+ ```
400
+
401
+ 测试类
402
+
403
+ ``` java
404
+ public class Test {
405
+ public static void main (String [] args ) {
406
+ Shape shape1 = new Line ();
407
+ shape1. draw();
408
+ Shape shape2 = new Circle ();
409
+ shape2. draw();
410
+ }
411
+ }
412
+ ```
413
+
414
+ 运行结果:
415
+
416
+ ```
417
+ 线
418
+ 圆形
419
+ ```
420
+
421
+ 在测试类中,shape1 的类型为 Shape,shape2 的类型也为 Shape,但调用 ` draw() ` 方法后,却能自动调用子类 Line 和 Circle 的 ` draw() ` 方法,这是为什么呢?
422
+
423
+ 其实就是 Java 中的多态。
424
+
425
+ ----
426
+
427
+ 更多 Java 对象和类的知识,请移步下一篇。
428
+
429
+ ![ ] ( http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png )
0 commit comments