Chp8-继承


为什么要有继承

因为我们在开发过程中类与类之间的代码会出现代码冗余,这个时候就需要我们的继承了。

就是将重复的代码都提炼到第三个类中,然后通过后面的操作书写双方的继承关系


提示:以下是本篇文章正文内容,下面案例可供参考

一、继承的概念

继承就是将子类中的共性(就是重复 相似的内容)进行抽取,生成父类,建立在继承关系下,子类可以拥有父类所有的可被继承的类( private 私有类不能被子类继承)

语法

public class 子类类名 extends 父类类名{
    
}

二、使用

注意事项

  1. 必须建立在is a (既对象与对象之间的关系)关系之上
  2. 子类可以拥有独有内容
  3. 子类可以调取到所有的可以被调取到的内容(包括属性和方法 函数)
  4. 一个类在身为一个子类的同时仍然可以是其他类的父类
  5. 一个类在身为子类的同时仍可以是其他类的父类

  6. 子类可以继承拥有所有父类所有可被继承的内容

  7. 一个子类只能拥有一个直接父类

  8. 一个父类可以拥有多个直接子类

  9. 父类构造子类无法继承

  10. 父类的私有内容子类无法直接继承访问(需要 get set 方法)

代码如下(示例):

//动物类-父类
public class Animal {
    //特征:名字、年龄、性别
    public String name;
    public int age;
    public String sex;
    //行为:吃饭、睡觉
    public void eat(){
        System.out.println("吃饭");
    }
    public void sleep(){
        System.out.println("睡觉");
    }
}
/**
 * 狗
 */
public class Dog extends Animal{
    //独有方法-看门
    public void lookDoor(){
        System.out.println("看门");
    }
}
//金毛类
public class JinMao extends Dog{
    
}
/**
 * 猫
 */
public class Cat extends Animal{
}
//测试类
public class Test {
    public static void main(String[] args) {
        //创建Dog对象
        Dog dog = new Dog();
        dog.name = "小黑";
        dog.eat();
        dog.sleep();
        //创建Cat对象
        Cat cat = new Cat();
        cat.name = "小花";
        cat.eat();
        cat.sleep();
        
        //创建一个Animal对象
        Animal animal = new Animal();
        //animal.lookDoor();错误
        //创建一个金毛对象
        JinMao jm = new JinMao();
        jm.lookDoor();
        jm.eat();
        jm.sleep();
    }
}

方法重写(覆盖)

在继承关系中,如果说子类不满足于父类提供的方法实现,那就可以选择对方法实现重写

概念

子类对父类中继承过来的方法进行方法体的重新书写,简称方法重写

使用

方法重写之后,子类对象会优先执行自身重写之后的代码

父类的作用

  1. 解决子类之间的代码冗余问题

  2. 强制子类拥有某些内容

子类的内存结构

子类的内存空间由父亲内容+独有的内容构成

父类封装

父类也是类,所以内部属性也应该进行系统性的封装

父类将属性封装之后,子类无法直接通过对象名.属性名的方式直接访问父类声明属性,必须通过对象名.getter()|对象名.setter()的形式对属性进行访问

Super 关键字

代表父类对象

Super()

作用为调用父类构造内容

使用
  1. 通过实参列表决定调用的是哪个父类构造

  2. 必须写在构造方法有效代码第一行

  3. 无法与this()共存

  4. 子类构造第一行默认存在无参的super(),当手动调用super方法之后或书写了this方法调用之后,该默认存在的super()将会失效

语法

可以借助super()实现在子类有参构造中为父类中声明的属性赋值的操作

1. 父类中正常声明有参构造
   public class Animal {
    //特征:名字、年龄、性别
    private String name;
    private int age;
    private String sex;
    public Animal(){}
    public Animal(String name,int age,String sex){
        System.out.println("正在执行animal有参构造...");
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //getter、setter方法
   ...
    //行为:吃饭、睡觉
   ...
}
2. 子类书写有参构造,将希望赋值的形参正常声明,内部调用super()利用对应的父类有参构造实现赋值
    public class Dog extends Animal{
        public Dog(){}
        public Dog(String name,int age,String sex){
            //调用父类中的有参构造方法为父类中声明的属性赋值
            super(name,age,sex);
        }
    }

super.

  • 指明调用父类属性或方法

super.属性名
super.方法名(实参)

父类属性封装之后,无法通过super.属性名访问父类属性

有继承关系的对象创建过程

  1. 给父|子类属性分配空间,赋默认值

  2. 给父类属性赋初始值

  3. 执行父类构造再次赋值

  4. 给子类属性赋初始值

  5. 执行子类构造再次赋值


总结

这就是今天学习的内容讲了对象的继承,使用规则,方法覆盖 和 他的规则,Siper()的使用、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值