黑马程序员---继承

时间:2021-10-03 12:15:13

------ android培训、java培训、期待与您交流! ----------

 

1.继承

    类与类之间的关系:依赖,聚合,继承

    继承的由来:

    将多个类中公共的内容向上抽取抽取产生了父类(基类  超类)

    这个被抽取的类叫子类.

    通过继承:我们可以节省代码.

    继承的格式:

    class 子类 extends 父类 { }

******************************************************************************************

通过继承,子类自动拥有父类的所有非private成员.

也可以说private成员子类可以继承,但是不能使用.因为private限定使用的范围.

******************************************************************************************

    继承的好处:

    集成的出现提高了代码的复用性.

    继承的出现让类与类之间产生了关系,提供了多态的前提.

  Java中只支持单继承,一个父类可以派生多个子类.

    为什么只支持单继承?    -----为了避免 混淆

   

class Father{
     
     void fun(){}

     void method(){}
    }

    class AFather{
     void fun(){}
    }

    class ASon extends Father,AFather{
     //当前ASon有两个父类 Father ,AFather,那么对于ASon子类来说
     它里面存在fun方法,这个方法是从哪一个父类继承?为了避免这种
     情况的存在,java中只允许单继承
    }

    class BSon extends Father{
    
    }

   我们可以理解为: 一个儿子只能有一个爹,一个爹可以有多个儿子.
Java支持多重继承

class GradeFather{
    void fun(){}
   }

   class Father extends GradeFather{
    void fun(){} //这个方法是从GradeFather中继承的
   }

   class Son extends Father{
    //当前Son这个类也可以看成是GradeFather的间接子类.
    void fun(){} 这个方法是从Father继承的。
   }

通过多重继承产生了一个继承的体系

    上层的类中定义的行为对于这个体系来说,所有下层的类中都包括.

    因此,我们在了解一个体系时,一般从上层来观察,通过上层能了解整个体系的基本行为.

    在使用时,使用的是最下层的类.

    上层:表示的是整个体系的功能

     下层:标识的是特性的功能(根据具体的要求来选择)

怎样去使用继承:

    不要为了继承而继承(不要为了使用某个属性或方法去继承)

我们什么时候使用继承,要进行具体的分析.继承其实是一种is关系

class 动物{
   
   }
   
   class 哺乳动物{
    void eat();
   }

   class 犬科 extends 哺乳动物{
   
   }
   class 猫科 extends 哺乳动物{
   
   }

   class 狗 extends 犬科{}

   class 狼 extends 犬科{}

   class 猫 extends 猫科{}

   class 虎 extends 猫科{}


   class 蝙蝠 extends 哺乳动物{}


   class 跳蚤{
    //如果它也有一个吃的行为,就不应该继承犬科,猫科,也不能继承哺乳动物。
   }

 

继承中的构造方法:

构造方法不能被继承

通过下面代码发现,当子类对象实例化时Son son=new Son(),父类构造先执行了,然后执行的是子类构造.
   //父类
   class Father
   {
    String name;
    Father(String name){
     super();//执行Object父类的无参构造方法
     System.out.println("father构造");
    }

    Father(int age){
    
    }

    Father(){}
   }

   //子类
   class Son extends Father
   {
    String sex;
    Son(){
     //super();  //执行Father父类的无参构造方法
     
     super("tom"); //执行Father父类的字符串参数的构造方法
     
     System.out.println("son 构造");
    }
   }

    为什么出现这种情况:

     因为所有的构造方法中默认执行的第一句话都是super();

    super();它代表的意思是执行父类的无参构造方法.

    java中的所有类都有一个默认的父类 Object类,它是所有java类的父类.

    父类的构造方法的目的是为了帮助子类对象实例化.

继承中的成员属性:

    如果子类中存在与父类中重名的成员属性

    在子类中有一个方法,它显示这个重名的属性

    this存在成员方法中作用:用来区*部与成员属性

    super存在成员方法中作用:用来区分子类与父类中重名的成员.

class Father
   {
    String name="tom";//父类成员变量   

   }

   class Son extends Father
   {
    String name="james"; //子类成员变量

    public void show(){

     String name="tony"; //局部变量
     
     System.out.println(name);  //局部变量name

     System.out.println(this.name);//本类中的name 属性

     //要得到被子类隐藏的父类中的name属性

     System.out.println(super.name); //通过super可以得到父类中的name属性
    }
   }

继承中的成员方法:

    重写:子类中存在一个与父类中一样的方法

          一样的意思是返回值类型,方法名,参数列表都一样.

    重写的作用:通过重写可以将父类中的方法进行功能扩展.

    重写的注意事项:

        ①.静态只能覆盖静态

        ②.重写的方法的权限修饰符要大于等于被重写的方法

        ③.私有的方法不能被重写.

    关于多态的两种表现形式:重写与重载

重写与重载的区别:

      重载:一个类中具有相同的方法名,参数类型,个数,排列顺序不同产生了重载   

      重写:子类中有一个与父类一样的方法,方法的返回值类型,方法名,参数列表一样.

    重写的作用:可以在子类中对父类的功能进行功能扩展.

     在重写的方法中对父类的方法可以使用super调用.

 

 

 

------ android培训、java培训、期待与您交流! ----------