面向对象的三大特征之一继承

继承

继承的特性

  • 概念:可以使得子类具有父类的属性(成员变量)和方法(成员方法),还可以在子类中重新定义,追加属性和方法。

  • 继承的格式: public class 子类名 extends 父类名{}

  • 父类:基类、超类 子类:派生类

  • 继承中子类的特点:

    • 子类可以有父类的内容(继承父类非私有的属性和方法
    • 子类还可以有自己特有的内容(自己重新定义新的属性和方法)
    public class Animal{
         
        private String name;
        public void show(){
         
            System.out.println("你好!");
        }
    }
    // 子类继承父类,可以继承非私有的,
    public class Dog extends Animal{
         
        private int age;						// 子类自己特有的内容
        
    }
    public class Test{
         
        public static void main(String args[]){
         
            // 创建一个狗的对象
            Dog d = new Dog();
            // 调用方法
            d.show();							// 我们看 Dog 类中并无 show() 方法,但是调用并不出错,是因为继承了父类
        }
    }
    

继承的好处

  • 提高了代码的复用性(多个类相同的成员可以放到同一个类中)

  • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)

    // 比如人类,和学生、老师、工人
    public class Person{
         
        private String name;
        private int age;
        public void eat(){
         
            System.out.println("吃饭!");
        }
    }
    // 学生继承人类
    public class Student extends Person{
         
        
    }
    // 老师继承人类
    public class Teacher extends Person{
         
        
    }
    // 工人继承人类
    public class Worker extends Person{
         
        
    }
    

    我们可以看到,学生、老师、工人,都可以继承人类,提高了代码的复用性,我们知道,继承非私有的成员方法和成员变量,都可以继承 eat() 方法,那我们只需要Person类中修改 eat() 方法,那学生、老师、工人继承的也都修改了,这样提高了代码的维护性

继承的弊端

  • 继承让类与类之间产生了关系,类的耦合性增强了
  • 父类变化时,子类也随着变化,削弱了子类的独立性

什么时候使用继承

  • 继承体现关系:is a (有两个类A和B,满足A是B的一种,或者B是A的一种,就说说明他们存在继承关系)

继承中成员变量访问的特点

  • 在子类中访问一个变量

    • 子类局部范围找(可简单理解为方法内)
    • 子类成员范围找(类内)
    • 父类成员范围找

    注意:不考虑父亲的父亲,也就是说,假设子类和其父类中都无这个变量,就报错!

继承中成员方法访问的特点

  • 通过子类对象访问一个方法

    • 子类成员范围找
    • 父类成员范围找

    注意:不考虑父亲的父亲

super 关键字

  • 通过上述的一些特性之后,我们发现,继承是子类和父类的关系,我们涉及到了在子类中访问父类的概念,this 关键字是指代本类对象,我们需要找到一个指代父类对象的关键字–super。

    形式 作用
    super.age 访问父类成员变量
    super.成员方法(…) 访问父类成员方法
    super(…) 访问父类的构造方法

    注意:括号中的 “…” 是代表参数的意思,参数个数是 从 0 到多个

继承中构造方法的访问特点

  • 接下来我们看段代码,来了解下,继承中构造方法的访问特点

    public class Animal{
         
        private String name;
        private int age;
        // 构造方法
        public Animal(){
         
            									  // ③
        }
        public Animal(String name , int age){
         	  // ④	
            this.name = name;
            this.age = age;
        }
    }
    
    // 继承动物类
    public class Dog extends Animal{
         				// 产生继承关系
        public Dog(){
         
            super();								// ①
        }
        public Dog(String name , int age){
         
            super(name,age);						// ②
        }
    }
    
  • 我们先看 ①和③ 的区别,在③中并无 super() 这行代码,根据我们super关键字的学习,我们知道 super() 其实就是调用 父类的 无参构造方法,其实也就是 调用 ③所在的 无参构造方法,那为什么 ③ 这行没写呢,其实自带 super() 只不过我们看不到而已。

  • 根据上述这句话,我们思考一个问题:那 Animal 类中无参构造也有 super() 这行代码,那Animal 明明没有父类啊,那他调用的是谁呢?

    // 这个就涉及到我们说的,所有类的祖宗类是谁呢,就是我们的 Object
    public class Animal extends Object{
         		// 原本这行应该这样写,只不过默认不写罢了
        
    }
    
  • 看完①和③ 的区别之后,我们看 ②和④的区别,那 ②相当于调用了 ④,那④中有没有 super() 这行代码呢,可以根据下面两图,发现,super(),只能在构造方法的第一行

综上所述:

​ ①:子类继承父类中的数据,可能使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化

​ ②:每一个子类构造方法的第一条语句默认都是: super()

继承的注意事项

  • Java中类只支持单继承,不支持多继承

  • Java中类支持多层继承

方法重写(Override)

  • 学继承后,我们知道,子类会继承父类的成员方法,但是我们不想要父类的方法,怎么办呢?那就是方法的重写。举个列子:你继承了你父亲的公司,但是你不想按照父亲的来,你重新调整公司的模式和经营方向,这就可理解为方法重写。
  • 特点:
    • 子类中出现了和父类一模一样的方法声明(下述代码,会讲解什么是定义什么是声明)
    • 子类有自己特有内容的时候,重写父类中的方法
    • 父类中的私有方法子类无法重写(父类私有成员子类是不能被继承的)
    • 子类重写方法时候,访问权限(即权限修饰符,可点击了解这篇文章)不能比父类低
public class Person{
   
    private String name;
    private int age;
    public void show(){
   
        System.out.println("我是人类!");
	}
    // 私有无法被继承
    private void eat(){
   
        System.out.println("人类要吃饭!");
    }
}
public class Student extends Person{
   
    // 方法重写
    public void show(){
   						
        System.out.println("我是学生!");
    }
}

注意:

①:public void show() 就是方法的声明
②:public void show(){} 就是方法的定义

相关推荐

  1. 面向对象特征——封装,继承

    2024-02-10 07:36:01       33 阅读
  2. 面向对象特征和五基本原则

    2024-02-10 07:36:01       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-10 07:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-10 07:36:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-10 07:36:01       82 阅读
  4. Python语言-面向对象

    2024-02-10 07:36:01       91 阅读

热门阅读

  1. STL - 容器适配器

    2024-02-10 07:36:01       52 阅读
  2. 数据分类分级

    2024-02-10 07:36:01       44 阅读
  3. (52)只出现一次的数字III

    2024-02-10 07:36:01       58 阅读
  4. 深入解析 Spring 和 Spring Boot 的区别

    2024-02-10 07:36:01       55 阅读
  5. 浅聊一下redis的雪崩,穿透和击穿

    2024-02-10 07:36:01       51 阅读
  6. 数据结构——5.3 二叉树的遍历和线索二叉树

    2024-02-10 07:36:01       44 阅读
  7. 千里马平台设计说明-字典缓存

    2024-02-10 07:36:01       48 阅读