首页 > 代码库 > 继承 与 接口

继承 与 接口

继承(上):
          1. 提高了代码的重用性     
          2. 让类与类之间产生关系,有了这个关系,才有多态性
     注意:千万不要为了获取其他功能,简化代码而继承:
               必须是类与类之间有所属关系才可以继承,所属关系 is a。
               在java语言中只能是单继承,不支持多继承。
               因为:多继承容易带来安全隐患,当多个父类有相同的功能,
                         当功能内容不同时,子对象不确定运行哪一个。
                         但是java保留这种机制,用另一种形式表示:多实现。
                         并且存在多层继承,也就是一个继承体系。
如何使用一个继承体系中的功能?
     要想使用体系,先查阅体系父类的描述,因为父类中定义的是体系中共性功能。
     通过了解共性功能,就可以知道该体系的基本功能。
为什么具体调用时,创建最子类的对象?
     1. 因为有可能父类不能创建对象。
     2. 创建子类对象可以使用最多功能,包括基本的还有特有的
          简单的一句话:     查阅父类功能,创建子类对象使用功能。

聚集:has a 
     1. 聚合:球员 和 球队
     2. 组合:更紧密    人 和 手
1.变量
     如果子类中出现非私有的同名成员变量时
          子类要访问本类中的变量,用this
          子类要访问父类中的同名变量,用super
     super 和 this的使用基本使用几乎一致
          this代表的是本类对象的引用
          super代表的是父类对象的引用
     clas Fu{
          public String num = 4;
      }
     class Zi extends Fu{
          int num = 5;
          public void show(){
               S.o.p(num);
          }
     }
     输出结果:5
     假如注销public  String num = 5;
     输出结果 : 4
结论:super 和 this 指向同一个对象,父类(super)的引用指向子类的对象。
     javase 7.png

子父类中的函数(重写,覆盖)
     当子类出现和父类一模一样的函数时,
     当子类对象调用该函数,会运行子类函数的内容。
     如同父类的函数被覆盖一样。
这种情况就叫做重写(覆盖)
     当子类继承父类,沿袭父类的功能,到子类中
     但是子类虽然具备该功能,但是功能的内容却和父类不一致,
     这时,没有必要定义新的功能,而是使用覆盖特殊,保留父类的功能定义,并且重写功能的内容
     
public class Tel{
     public void show (){
          s.o.p("number");
     }    
}
class NewTel extends Tel{
    public NewTel(){
          super(); //第一行必须    
     }
     public void show(){
          super.show();
          s.o.p("name");
          s.o.p("pic");
     }
}
     
覆盖:1. 子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败
           2. 静态只能覆盖静态

子父类构造函数:
     不能覆盖:因为覆盖名称要一模一样,而构造函数是跟类名走,不可能存在覆盖。
     
     子类对象进行初始化时,同时也会调用父类的构造函数。
      因为在子类的构造函数中默认会调用父类的构造函数通过super();

为什么子类一定要访问父类的构造函数
    因为父类中的数据在子类中直接获取,所以子类建立时需要查看父类是如何
     对这些数据进行初始化的。所以子类在初始化时,先要访问一下夫列的构造函数
     如果要访问父类中指定的构造函数,可以通过手动的定义的super语句的方式制定

     注意:super语句在子类构造函数的第一行
     结论: 子类的所有的构造函数默认都会访问父类空参数的构造函数
                    因为子类每一个构造函数的第一行内都有隐式的父类构造函数
                    当父类中没有空参数的构造函数,在子类中必须手动的通过super语句形式来指
                    定访问父类中 的构造函数,当然子类的构造函数的第一行也可以手动的指定this语句来访问
                    本类中的构造函数。子类中的构造函数至少有一个构造函数访问父类的构造函数

final 关键字:作为一个修饰符,相当于一个死锁永远打不开,也变不了。
     1. 可以修饰类,函数,变量。
     2. 被final修饰的类不可以被继承。避免被继承,被子类复写功能。
     3. 被final修饰的方法都不可以 被复写。
     4. 被final修饰的变量是一个常量,只能赋值一次,即可以修饰成员变量,又可以修饰局部变量
          当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都会给这个取一个名字
          而且这个值不需要更改,所以加上final修饰。常量的书写规范是所有的单词都要大写,并且每个单词之间用下划线分隔开.  
     5. 内部类定义在类中的局部位置时只能访问局部被final修饰的变量。
 继承(下):
     抽象类
          当多个类中出现相同的功能,但是功能主体不一样。
           这是可以进行向上抽取,这时只能抽取功能定义,而不抽取功能主体。
     抽象类的特点:
          1. 抽象方法一定在抽象类中。
          2. 抽象方法和抽象类都必须被abstract关键字修饰。
          3. 抽象类不可以用new创建对象,因为调用抽象方法没有意义。
          4. 抽象类中方法要想被使用,必须由子类复写这个类的所有的抽象方法后,被子类对象调用
               如果子类只覆盖了部分的抽象方法,那么该子类还是个抽象类。
     特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类创建对象。

     模版方法设计模式
          什么是模版方法?
               在定义动能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分时。
                那么这时就将不确定的部分暴露出去,由子类去完成。
示例代码:
     public class Demo2 {
     public static void main(String args[]){
          new GetTimes().getTime();    
     }
}
abstract class GetTime{
     public void getTime(){//final 确保方法不会被重写
          Long start = System.currentTimeMillis();
          doThing();
          Long end = System.currentTimeMillis();
          System.out.println("工作时间 = " + -(start - end));
     }
     public abstract void doThing();//暴露一个抽象方法给子类去实现想要做的具体事情
}

class GetTimes extends GetTime{
     public void doThing(){//子类实现父类的抽象方法,去干具体想干的事情
          for(int i = 0 ; i < 10000; i ++)
               System.out.print(i);
     }
}

接口
     当抽象类中的方法都是抽象的,那么该类可以通过接口的形式表示。
     class 用于定义类     interface用于定于接口
     
     接口定义时,格式特点:
          1. 接口的常见定义: 常量,抽象方法
          2. 接口中的成员都是有固定的修饰符
                    常量: public static final
                    方法: public abstract
               记住:接口中的成员都是public的
     接口: 是不可以被创建对象,因为有抽象方法。
               需要在被子类实现,子类对接口中的抽象方法全部覆盖以后,子类才可以实例化。
               否则子类还是一个抽象类
·     接口可以被类多实现,也是对多继承转换形式。