zoukankan      html  css  js  c++  java
  • 【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");
        }
    }
    万丈高楼平地起。
  • 相关阅读:
    效能分析
    个人项目词频统计2
    PSP 进度条 柱状图 饼状图
    四人小组项目
    结对编程
    品评历届学生作品
    构建之法终于到手了
    补上周一的进度条进度条:
    燃尽图
    scrum站立会议
  • 原文地址:https://www.cnblogs.com/jcl226/p/13122399.html
Copyright © 2011-2022 走看看