【Java基础】面向对象三个特征(2):继承

一、什么是继承?

日常生活我们理解的继承:子女继承父母的财产;徒弟继承师父的功夫/衣钵等等;

计算机中的继承:

  1、子类继承父类的属性和行为;如,小猫、小狗都属于动物,具有高度相似的属性和行为(属性:名字、毛色、年龄等;跑、吃东西等)

  2、子类也可以拥有自身的特性

  3、Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类

 

二、为什么引入继承?(简答:共性抽取)

以上述小猫、小狗为例,如果各自定义一个类,我们会发现代码具有高度的重复性;

  小猫类:

public class Cat {

    String name;
    int age;
    String color;

    public void eat(){
        System.out.println("吃东西呢");
    }

    public void run(){
        System.out.println("撒欢");
    }

}

  小狗类:

public class Dog {

    String name;
    int age;
    String color;

    public void eat(){
        System.out.println("吃东西呢");
    }

    public void run(){
        System.out.println("撒欢");
    }
}

而如果我们定义一个它们的父类:动物类,并定义属性及方法

然后我们通过继承的方式,小猫、小狗就可以继承动物类的属性和行为,这部分相同的代码只需写一次,提高了复用性,后期维护成本也会相对降低;

 

三、继承的格式

关键字:extends

格式:

  1、首先定义一个父类:如动物类Animal

  2、定义子类:public class 子类名称 extends Animal{}

如:

public class Cat extends Animal{
    //继承父类中的属性及方法
    
    //同时也可以有自身的特性

    public void catchMouse(){
        System.out.println("猫捉老鼠");
    }
}

 

四、方法的重写Override

  重写与重载的区别:

  重写(Override):在继承关系当中,方法的名称一样,参数列表一样;也称为覆盖、覆写

  重载(Overload):方法的名称一样,参数列表不一样

方法覆盖重写的注意事项
1、必须保证父子类中的方法名称一样,参数列表也一样
  @Override 写在方法前面,用来检测是不是有效的正确覆盖重写

2、子类方法的返回值必须 【小于等于】 父类方法的返回值范围
  ps:Object类是所有类的公共最高父类(祖宗类)

3、子类方法的权限必须 【大于等于】 父类方法的权限修饰符
  ps:public > protected > 未写权限修饰符 > private

 

五、super 与 this 关键字

  super关键字:访问父类内容。我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

  this关键字:访问本类内容。

/*
super关键字用法:
1、子类的成员方法中,访问父类成员变量
2、子类的成员方法中,访问父类的成员方法
3、子类的构造方法中,访问父类的构造方法
 */
public class Zi extends Fu{

    int num = 20;
    public Zi(){
        //如果不写,编译器会默认赠送一个
        super();//必须是第一个语句,否则会报错
        System.out.println("子类构造方法");
    }

    public void methodZi(){
        System.out.println(num);//子类中的num
        System.out.println(super.num);//父类中的num
    }
    public void method(){
        super.method();//访问父类中的method方法
        System.out.println("子类方法");
    }
}
/*
this关键字用法:
1、在本类的成员方法中,访问本类的成员变量
2、在本类的成员方法中,访问本类的另一个成员方法
3、在本类的构造方法中,访问本类的另一个构造方法
 */
public class Zi extends Fu{

    int num = 20;
    public Zi(){
        // super和this两种构造调用,不能同时使用
        // super();
        //this调用也必须是构造方法的第一个语句
        this(2);
    }

    public Zi(int num) {
        this.num = num;
    }
    
    public void showNum(){
        int num = 100;
        System.out.println(num);//局部变量
        System.out.println(this.num);//本来中的成员变量
        System.out.println(super.num);//父类中的成员变量
    }

    public void methodA(){
        System.out.println("AAA");
    }
    public void methodB(){
        //在本类的成员方法中,访问本来的另一个成员方法
        this.methodA();
        System.out.println("BBB");
    }
}

 

posted @ 2020-06-13 23:57  蹲马路牙子吃炒面  阅读(257)  评论(0编辑  收藏  举报