在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java learn 02 OO & Exception

2016-8-29 13:17| 发布者: zhangjf| 查看: 596| 评论: 0

摘要: Chap 3 Java OO focus on : * 对象和类的概念 * 类 (对类) 之间的关系 * 面向对象设计思想 * class * new * 引用的概念 * constructor-metho ...
Chap 3 Java OO

focus on :

  1. * 对象和类的概念
  2. * 类 (对类) 之间的关系
  3. * 面向对象设计思想
  4. * class
  5. * new
  6. * 引用的概念
  7. * constructor-method的概念
  8. * method重载
  9. * constructor-method重载
  10. * this
  11. * static
  12. * package & import
  13. * private default protected public
  14. * extends
  15. * override
  16. * final
  17. * Object
  18. * toString
  19. * equals
  20. * upcasting downcasting
  21. * polymophysm / dynamic binding
  22. * abstract class
  23. * interface
  24. * implements
复制代码
3.1 OO 设计思想

为什么用 OO ?

OO 编程 -- 一组对象互相配合通过沟通完成特定功能

汇编是对机器语言的抽象

面向过程的语言是对汇编的抽象

对象更加符合对于现实问题的抽象

对象都有对外服务的接口

通过继承可以复用

对象隐藏内部服务的实现

通过聚合可以复用

向对象更加容易使我们达到这些年苦苦追求的境界

Reusable, Extensibility

组件 -- 比对象更高层次上的抽象

Web Service

3.2 Class 之间的关系

关联关系 -- 学院 - 研究生 - 教授

继承关系 -- 运动员 { 游泳运动员,球类运动员, 射击运动员 }

聚合关系 -- 聚集 - 球队 {队长,队员} 组合 - 人-{ 头, 身体, 四肢 }

实现关系 -- implements

3.3 Class 和 Object

Java 中万事万物皆 Object (对象)

Object 可看成 静态属性 (成员变量) 和 动态属性 (method) 的封装体

Class 是用来创建同一类型的 Object 的 “模板”

成员变量 = 属性 & method = 函数

同一类的每个对象共享该 Class 的method

非static method 是 针对每个对象进行调用

局部变量分配在 Stack内存

成员变量分配在 Heap内存

3.4 new & Constructor

new -- 引用的概念

Constructor

Constructor in class extends

如果调用 super 必须写在 Constructor-method 的第一行

如果没调用,系统自动调用 super(), 如果没调,parent-class 中又没写参数为空这个 Constructor-method 则出错。

3.5 this keyword

this 可处理 method 中 成员变量参数重名 的情况。

this 可看作是一个变量,它的值是当前对象的引用

3.6 static keyword

static 声明的 成员变量 为 static 成员变量,它为该类的公用变量,在第一次使用时被初始化。

static 声明的 method 为 static-method 在调用该method时, 不会将对象的引用传递给它

static-method 中不可访问 非static成员。

可通过对象引用 or 类名 访问 static成员, static 成员 属于 Class, 不属于对象

3.7 package / import

package named method : 公司域名倒过来!

class文件的最上层包的父目录位于classpath下。

执行一个 Class 需要写 all package name

J2SDK 中主要的包介绍

java.lang - 包含一些 java 语言的核心类

java.net

java.io

java.util

把自己的文件打成 jar文件method : jar -cvf test.jar *.*

3.8 Class extends
修饰符 类内部 same package 子类 Anywhere
private Yes
default Yes Yes
protected Yes Yes Yes
public Yes Yes Yes Yes
3.9 method-override

override-method 不能使用比 被override-method 更严格的访问权限 -- 其实这和polymophysm有关

3.10 Object Class

Object Class 是所有Java类的根基类

toString() Object 类中定义有 public String toString() method,其返回值是 String 类型。

equals method Object 类中定义有 :

public boolean equals(Object obj) method 提供对象是否 “相等” 的逻辑

Object的 equals method定义为:x.equals(y) 当 x 和 y 是同一对象的应用时返回 true

J2SDk 提供的一些类,如 String, Date等,重写了 Object 的 equals method.

  1. 属性内容相等时 (并不一定是相同对象), 返回 true 否则返回 false.
复制代码
3.11 Object casting

upcasting

downcasting

基类引用 可以指向 子类对象

基类引用 不可访问 子类对象新增加的成员

可以使用引用 变量 instanceof 类名 来判断该引用型变量所指向的对象是否属于该类或该类的子类

子类的对象可以当作基类的对象来使用称作 upcasting,反之 downcasting

内存分析 - 明白了内存你就明白了一切!

3.12 polymophysm / dynamic binding

继承

重写

父类引用指向子类对象

  1. package com.bjsxt.chap03;
  2. class Lady {
  3. private String name;
  4. private Animal pet;
  5. Lady(String name, Animal pet) {
  6. this.name = name;
  7. this.pet = pet;
  8. }
  9. public void myPetEnjoy() {
  10. pet.enjoy();
  11. }
  12. }
  13. public class TestPolymoph_01 {
  14. public static void main(String[] args) {
  15. Cat c = new Cat("catName", "blue");
  16. Dog d = new Dog("dogName", "block");
  17. Lady l1 = new Lady("L1", c);
  18. Lady l2 = new Lady("L2", d);
  19. l1.myPetEnjoy();
  20. l2.myPetEnjoy();
  21. }
  22. }
复制代码

知道了内存, 就知道了一切

动态绑定, 池绑定, 多态

  1. 1. 动态绑定的机制 是 实际类型 new 的是
  2. 2. 深一点 -- 是对象内部有一个指针。。。。。。
  3. 3. 动态绑定的机制是 : 是调用实际类型,不是引用类型。
  4. 4. 实际地址才会绑定到那个 method 上。 method 在 code segment
  5. 5. 只有在 runtime,才能判断调用哪一个 method
  6. 带来的莫大好处是 ... 可扩展性达到了极致好
  7. OO核心中的核心
复制代码
3.13 abstract Class

abstract关键字来 修饰一个 Class 时,这个类叫做abstract-class。abstract 修饰 method 时,该 method 叫做 abstract-method

abstract-class 必须被 extends,abstract-method 必须被 override

abstract-class 不能被实例化

abstract-method 只需声明,而不需要实现。

3.14 Final 关键字

final 的变量的值不能够被改变

final 的成员变量

final 的局部变量(形参)

final method 不能被 override

final Class 不能被 extends

System final Class 如 : String, Math, Boolean etc..

3.15 interface

概述

interface 是 abstract-method 和 常量值 的定义的集合

从本质上讲,接口是一种特殊的 abstract-class,这种 abstract-class只包含 常量 和 method definition,而没有 var 和 method 的实现。 只包含 常量 和 method 的定义,而 没有var 和 method 的实现。

  1. public interface Runner {
  2. //public static final int id = 1;
  3. int id = 1;
  4. public void start();
  5. public void run();
  6. void stop(); // public void stop();
  7. }
复制代码

interface特性

interface 可以多重实现

interface 中声明的属性默认为 public static final 的; 也只能是 public static final的;

interface 中只能定义 abstract-method, 而且这些 method 默认为public的,也只能是public的。

interface 可以继承其他的接口,并添加新的 属性 和 abstract-method。

多个 Class 可 implements 同一 interface

一个 Class 可 implements 多个 interface

与继承关系类似,接口与实现类之间存在多态性

  1. 其中的变量全部都是 public static final int id = 1;
  2. java.lang - Comparable 我看就像 cmp 一样!(个人认为)
  3. Interface Comparable<T> 可以扩展
  4. 接口与接口之间也可以相互继承
  5. 类与接口只能 是 实现关系
复制代码
Example Program
  1. public interface Valuable {
  2. public double getMoney();
  3. }
  4. interface Protectable {
  5. public void beProtected();
  6. }
  7. interface A extends Protectable {
  8. void m();
  9. // void getMoney();
  10. }
  11. abstract class Animals {
  12. private String name;
  13. abstract void enjoy();
  14. }
  15. class GoldenMonkey extends Animals implements Valuable, Protectable {
  16. public double getMoney() {
  17. return 10000;
  18. }
  19. public void beProtected() {
  20. System.out.println("live in the room");
  21. }
  22. public void enjoy() {
  23. }
  24. public void test() {
  25. Valuable v = new GoldenMonkey();
  26. v.getMoney();
  27. Protectable p = (Protectable)v;
  28. p.beProtected();
  29. }
  30. }
  31. class Hen implements A {
  32. public void m() {}
  33. public void beProtected() {}
  34. public double getMoney() {
  35. return 1.0;
  36. }
  37. // public void getMoney() {} // 不常见,怪异的问题
  38. }
复制代码
Chap 4 异常处理 4.1 写程序有友好界面
  1. 1, 鼻腔内感觉异常
  2. 2, 体温持续升高
  3. 3, 分泌乳白色液体
  4. 直接说感冒不就得了么?
  5. e.printStackTrace(); 非常好!给程序员读。堆栈信息都打印出来!
  6. java.lang.Throwable { 开车在上山走,
  7. 1, Error 山爆发 JVM 出问题。
  8. 2, Exception { 你可以处理的 -- 刹车坏啦!修好再走。。。
  9. 1, ...
  10. 2, RuntimeException (经常出,不用逮) 压路面上的小石子
  11. }
复制代码
4.2 Exception Deal

Java异常是Java提供的用于处理程序中错误的一种机制。

所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组越界,文件不存在等)

设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。

java程序的执行过程中如出现异常事件,可以生成一个 Exception-object,该异常类对象封装了异常事件的信息并将被提交给Java-runtime-system,这个过程称为 throw e (会被打印出来,默认的处理方式)

Java-runtime-system 接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为 catch e

4.3 Example Program
  1. import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.IOException;
  4. import javax.imageio.IIOException;
  5. public class TestTx {
  6. public static void main(String[] args) {
  7. FileInputStream in = null;
  8. try {
  9. in = new FileInputStream("myfile.txt");
  10. int b;
  11. b = in.read();
  12. while (b != -1) {
  13. System.out.println((char)b);
  14. b = in.read();
  15. }
  16. } catch (FileNotFoundException e) {
  17. e.printStackTrace();
  18. } catch (IOException e) {
  19. System.out.println(e.getMessage());
  20. } finally {
  21. try {
  22. in.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-6 22:09

Copyright 2015-2025 djqfx

返回顶部