一、子类的继承性
    1、利用继承,可以先编写一个共有属性的一般类,根据一般类再编写具有特殊属性的新类,新类继承一般类的行为和状态,并根据需要增加它自己的新的状态和行为。
        由继承而得到的类称为子类,被继承的类称为父类(超类)
       声明一个类的子类的格式如下:  class 子类名  extends 父类名 { ......}
    2、如果子类和父类在同一个包中继承,那么,子类自然地继承了父类中不是private的成员变量作为自己的变量,并且也继承了父类中不是private的方法作为自己的方法,继承
       的成员变量或方法的访问权限保持不变,友好的变量和方法也要继承。
       如果子类和父类不在同一个包中,那么,子类继承了父类的protected 、public成员变量和方法,继承的成员或方法的访问权限保持不变,友好的变量和方法不能继承。
       
    3、instanceof 运算符是Java独有的运算符

        左面的操作元是一个对象,右边是一个类,当左面的对象是右面的类或子类创建的对象时,该运算符的结果为true,否则为false。

二、成员变量的隐藏、方法的重写和super关键字
    
    1、成员变量的隐藏
        在编写子类时,如果所声明的成员变量的名字和从父类继承来的成员变量的名字相同时(类型可以不同),子类就会隐藏掉所继承的成员变量,即子类重新声明定义了这个成员
      变量。需要注意的是,子类对象仍然可以调用从父类继承的方法操作隐藏的成员变量。
     2、方法重写
        重写的语法规则:如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。
            方法重写是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和
            父类的方法完全相同。
        重写的目的:子类通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以把父类的状态和行为改变为自身的状态和行为
    3、JDK1.5对重写的改进
        在JDK1.5版本之后,允许重写方法的类型可以是父类方法的类型的子类型,即不必完全一致。也就是说,如果父类的方法的类型是“类”,重写方法的类型可以是“子类”。
    4、重写的注意事项:重写父类的方法时,不可及降低方法的访问权限。
    5、super关键字
        在子类中想使用被子类隐藏的成员变量或方法就可以使用关键字super
        比如super.x、super.play() 就是访问和调用被子类隐藏的成员变量x和方法play()。

三、对象的上转型对象
    如果,A类是B类的父类,用子类B创建一个对象,并把这个对象的引用放到父类的对象中,此时这个父类的对象就称之为子类创建的对象的上转型对象。例如:
    A a;  B b = new B(); a = b;
    或者:A a; a= new B();
    或者: A a = new B();
    对象可以:调用新增的变量、调用新增的方法、调用继承或隐藏的变量、调用继承或重写的方法。
    对象的上转型对象可以:调用继承或者隐藏的变量、调用继承或重写的方法。
    注意事项:
    1、不要将父类创建的对象和子类对象的上转型对象混淆
    2、可以将对象的上转型对象再强制转换到一个子类对象,这时,该子类对象又具备了子类所有属性和功能。
    3、不可以将父类创建的对象的引用赋值给子类声明的对象。
    
四、继承与多态
    1、当一个类有很多子类时,并且这些子类都重写了父类的某个实例方法,那么当把子类创建的对象引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转型
    对象在调用这个实例方法时就可能具有多种形态,因为不同的子类在重写父类的实例方法时可能产生不同的行为。
    多态性就是指某个实例方法被子类重写时,可以各自产生自己的功能行为。    

五、抽象类和抽象方法(abstract类和abstract 方法)
    
    1、用abstract修饰的类是抽象类(abstract 类),如: abstract class A{...}
       用abstract修饰的方法是抽象方法(abstract 方法),如:abstract int main(int x,int y); //没有方法体

    2、注意事项
        (1)、和普通类相比,abstract类可以有abstract方法,也可以有非abstract方法。
        (2)、对于abstract类,只能声明,不能使用new 运算符来创建该类的对象。如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象的方法,给出方法体。
        (3)、abstract类可以没有abstract方法。
        (4)、如果一个abstract类是abstract类的子类,他可以重写父类的abstract方法,也可以继承这个abstract方法(即不重写这个abstract方法)。
        (5)、abstract方法只允许声明,不允许实现。
    3、面向对象编程
        使用多态进行程序设计的核心是使用上转型对象,即将abstract类声明对象作为其子类的上转型对象,那么这个上转型对象就可以调用子类重写的方法。
        所谓的面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。

六、接口与多态
    
    1、Java不支持多继承性,即一个类只能有一个父亲,为了克服java单继承的缺点,java使用了接口,一个类可以实现多个接口,java的接口更加符合人的思维方式。
    2、接口声明和使用
        使用关键字interface来定义一个接口。
        接口的定义和类的定义很相似,分为接口的声明和接口体。

        接口声明: interface 接口的名字
        接口体:接口体中包含常量的声明(没有变量)和方法的定义两个部分。接口体中只有抽象方法,没有普通方法,而且接口体中所有的常量的访问权限一定都是public(允许省略
            public、final常量修饰符),所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符)
        例如:
        interface Test{  public final int MAX = 100;  public abstract void add();   public abstract float getSum(float x,float y);  }
    3、接口的使用
        类通过使用关键字implements 声明自己实现一个或多个接口,如果实现多个接口,则用逗号隔开接口名字。
        class A implements Pinttable,Addable;  //类A实现了 Printable、Addable两个接口
        class Dog extends Animal implements Eatable,Sleepable;  Dog继承了Animal 类,实现了Eatable、Sleepable两个接口。
        如果一个类实现了某个接口,那么这个类就必须重写该接口的所有方法。
    4、理解接口
        接口可以增加很多类都需要具有的功能,不同的类可以实现相同的接口,同一个类也可以实现多个接口。
        接口的思想在于它可以增加很多类都需要具有的功能,而且实现相同的接口类不一定有继承关系。
    5、接口回调
        接口回调是指可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法。
    6、接口的多态性
        由接口产生的多态是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。
    7、abstract类和接口的比较:
        (1)、abstract类和接口都可以有abstract方法;
        (2)、接口中只可以有常量,不可以有变量,而abstract类中既可以有常量也可以有变量;
        (3)、abstract类中也可以有非abstract方法,而接口不可以。
    8、面向接口编程
        使用接口进行程序设计的核心思想是使用接口回调,即接口变量存放实现该接口的类的对象的引用,从而接口变量就可以回调类实现的接口方法。

七、内部类
    
    1、类中有两种重要的成员:成员变量和方法。还允许有另外一种成员:内部类。
       内部类支持在一个类中声明另外一个类,这样的类称为内部类。而包含内部类的类称为内部类的外嵌类。内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也
       可以调用外嵌类中的方法。
    2、内部类的类体中不可以声明类变量和类方法。外嵌类的类体中可以用内部类声明对象,作为外嵌类的成员。
    3、内部类仅供他的内嵌类使用,其他类不可以用某个类的内部类声明对象。
    
        
八、匿名类
    1、与子类有关的匿名类
        Java允许直接使用一个类的子类的类体创建一个子类对象。也就是说创建子类对象时,除了使用父类的构造方法外还有类体,此类体被认为是一个子类去掉类声明后的类体,称为匿名类。
        假设Bank是类,那么下列代码就是用Bank的一个子类(匿名类)创建对象。
            new Bank(){ 匿名类的类体};    
        
    2、与接口相关的匿名类
        
九、异常类
    1、所谓异常就是指程序运行时可能出现一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。
       异常对象可以调用如下方法得到或输出有关异常的信息:

public String getMessage();   public void printStackTrace();   public String toString();

        2、Java使用try ~catch语句来处理异常,将可能出现的异常操作放在try部分,将发生异常后的处理放在catch部分。
       try{  包含可能发生异常的语句  }   catch( ExceptionSubClass1 e ){  .... }     catch( ExceptionSubClass2 e ){  .... }
 
    3、自定义异常类
       可以扩展Execption类定义自己的异常类,然后规定哪些方法产生这样的异常。
       方法在声明时可以使用throws 关键字声明要产生的若干个异常,并在该方法的方法体中给出产生异常的操作,即用相应的异常类创建对象,并用throw关键字抛出该异常对象,
          导致该方法结束执行。