Java learn 02 OO & Exception

451 查看

Chap 3 Java OO

focus on :

        * 对象和类的概念  
        * 类 (对类) 之间的关系  
        * 面向对象设计思想  
        * class  
        * new  
            * 引用的概念  
            * constructor-method的概念  
        * method重载  
            * constructor-method重载  
        * this  
        * static  
        * package & import  
        * private default protected public  
        * extends  
        * override  
        * final  
        * Object  
            * toString  
            * equals  
        * upcasting downcasting  
        * polymophysm / dynamic binding
        * abstract class  
        * interface  
            * implements  

3.1 OO 设计思想

为什么用 OO ?

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

    • 汇编是对机器语言的抽象

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

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

  • 对象都有对外服务的接口

    • 通过继承可以复用

  • 对象隐藏内部服务的实现

    • 通过聚合可以复用

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

    • Reusable, Extensibility

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

    • Web Service

3.2 Class 之间的关系

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

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

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

  4. 实现关系 -- 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

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

  2. 如果没调用,系统自动调用 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.

      属性内容相等时 (并不一定是相同对象), 返回 true 否则返回 false.  

3.11 Object casting

  1. upcasting

  2. downcasting

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

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

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

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

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

3.12 polymophysm / dynamic binding

  1. 继承

  2. 重写

  3. 父类引用指向子类对象

package com.bjsxt.chap03;  
  
class Lady {  
    private String name;  
    private Animal pet;  
    Lady(String name, Animal pet) {  
        this.name = name;  
        this.pet = pet;  
    }  
    public void myPetEnjoy() {  
        pet.enjoy();  
    }  
}  
public class TestPolymoph_01 {  
  
    public static void main(String[] args) {  
        Cat c = new Cat("catName", "blue");  
        Dog d = new Dog("dogName", "block");  
        Lady l1 = new Lady("L1", c);  
        Lady l2 = new Lady("L2", d);  
        l1.myPetEnjoy();  
        l2.myPetEnjoy();  
    }  
}  

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

动态绑定, 池绑定, 多态

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

3.13 abstract Class

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

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

  3. abstract-class 不能被实例化

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

3.14 Final 关键字

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

    • final 的成员变量

    • final 的局部变量(形参)

  • final method 不能被 override

  • final Class 不能被 extends

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

3.15 interface

概述

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

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

public interface Runner {  
    //public static final int id = 1;  
    int id = 1;  
    public void start();  
    public void run();  
    void stop(); // public void stop();  
}  

interface特性

  1. interface 可以多重实现

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

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

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

  5. 多个 Class 可 implements 同一 interface

  6. 一个 Class 可 implements 多个 interface

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

其中的变量全部都是 public static final int id = 1;
java.lang - Comparable 我看就像 cmp 一样!(个人认为)  
Interface Comparable<T> 可以扩展  
接口与接口之间也可以相互继承  
类与接口只能 是 实现关系   

Example Program

public interface Valuable {  
    public double getMoney();  
}  
  
interface Protectable {  
    public void beProtected();  
}  
  
interface A extends Protectable {  
    void m();  
    // void getMoney();  
}  
  
abstract class Animals {  
    private String name;  
      
    abstract void enjoy();  
}  
  
class GoldenMonkey extends Animals implements Valuable, Protectable {  
    public double getMoney() {  
        return 10000;  
    }  
      
    public void beProtected() {  
        System.out.println("live in the room");  
    }  
      
    public void enjoy() {  
          
    }  
      
    public void test() {  
        Valuable v = new GoldenMonkey();  
        v.getMoney();  
        Protectable p = (Protectable)v;  
        p.beProtected();  
    }  
}  
  
class Hen implements A  {  
    public void m() {}  
    public void beProtected() {}  
    public double getMoney() {  
        return 1.0;  
    }  
    // public void getMoney() {} // 不常见,怪异的问题  
  
}  

Chap 4 异常处理

4.1 写程序有友好界面

  1, 鼻腔内感觉异常  
  2, 体温持续升高  
  3, 分泌乳白色液体  

  直接说感冒不就得了么?
 
 e.printStackTrace(); 非常好!给程序员读。堆栈信息都打印出来!

 java.lang.Throwable { 开车在上山走,  
   1, Error         山爆发 JVM 出问题。  
   2, Exception {   你可以处理的 -- 刹车坏啦!修好再走。。。  
   1, ...  
   2, RuntimeException  (经常出,不用逮) 压路面上的小石子  
  }  

4.2 Exception Deal

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

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

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

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

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

4.3 Example Program

import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
  
import javax.imageio.IIOException;  
  
public class TestTx {  
    public static void main(String[] args) {  
        FileInputStream in = null;  
        try {  
            in = new FileInputStream("myfile.txt");  
            int b;  
            b = in.read();  
            while (b != -1) {  
                System.out.println((char)b);  
                b = in.read();  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
              
        } catch (IOException e) {  
            System.out.println(e.getMessage());  
        } finally {  
            try {  
                in.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }
}