面向对象-继承

多个类中存在相同属性和行为时,将这些内容抽取道单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可

继承的好处

  1. 提高了代码的复用性
  2. 提高了代码的维护性
  3. 让类与类之间产生了关系,是多态的前提

继承的弊端

  1. 让类与类之间产生了关系,使得耦合增强了
  2. 开发原则:高内聚(自己完成某件事的能力),低耦合(类与类的关系)

️  Java类中只支持单继承,不支持多继承,可以通过多层继承来实现继承多个类

简单的学生类继承人类:

public class Student extends Person{
    public void study(){
        System.out.print("study");
    }
}

Java继承中成员变量的特点:成员变量名称相等的时候,在子类方法中访问变量的优先级顺序为就近原则:

  1. 在方法的局部范围找
  2. 在子类的成员范围找
  3. 在父类的成员范围找

 

Super关键字

public class Student extends Person{
    public int age = 20;
    public void printAge(){
        int age = 10;
        System.out.println(age);
        System.out.println(this.age);
        System.out.println(super.age);
    }
}

this代表本类对象的引用而super代表父类的存储空间,也可以理解为代表父类对象的引用

 

继承中的构造方法

子类构造方法继承父类前都会先执行父亲无参构造方法,因为子类继承父类会继承父类的非私有成员,在子类初始化之前,一定要完成父类数据的初始化,️  在子类的构造方法中,默认第一行有一条语句:Super() 如果父类中没有无参构造方法,推荐在父类中手动添加无参构造方法,也可以通过super去访问父类的带参构造方法

继承中成员方法的特点

子类方法和父类方法调用的声明不一样,执行子类中的方法,所以首先在子类中找,没有的化然后再去父类中找

方法重写

子类和父类一样的方法声明的情况

当子类需要父类的功能,而功能主体子类又有自己的特有内容的时候,就考虑使用方法重写,这样既保证了父亲的功能,还添加了子类的特有内容

public class Student extends Person{
    @Override
    public void printAge(){
        System.out.println("20");
        super.printAge();
    }
}

可以用@Override表明该方法是重写父类的方法

️  父类私有方法不能被重写,子类重写父类方法时,访问权限不能更低 private < 默认修饰符 < public, 比如父类用public,子类只能用public,父类用默认修饰符,子类可以用public和默认修饰符

继承练习

通过有参和无参两种方法给学生对象赋值

学生有参构造的时候用super调用父类构造

public class Student extends Person{
    public Student(){}
    public Student(String name, int age){
        super(name, age);
    }
    public void study(){
        System.out.println("study");
    }
}
class hello {
    public static void main(String[] args) {
        Student sc = new Student();
        sc.setName("TIM");
        sc.study();
        System.out.println(sc.getName());

        Student s = new Student("Jerry",20);
        System.out.println(s.getName());
    }
}

 

多态

同一个对象在不同时刻体现出来的不同状体

Java多态的前提

  1. 有继承关系
  2. 有方法重写
  3. 有父类引用指向子类对象

比如Animal a = new Cat();

多态成员访问特点:

成员变量:编译看左边,执行看左边,比如 a.weight 或者 a.age 看的都是 Animal 类中的成员变量

成员方法:编译看左边,执行看右边,比如 a.eat() 用的是 Cat 类的成员方法,但是检查的时候检查Animal类中是否有重写

为什么会这样子呢? 因为成员方法有重写,而变量没有

多态的好处:

提高了程序的扩展性

多态的弊端:

不能使用子类的特有功能

多态中的转型

向上转型:由子到父,父类引用指向子类对象,比如多态中 Animal a = new Cat() 

向下转型:从父到子,父类引用转为子类对象

由于多态的弊端导致了无法访问子类特有的方法,如果这时候 Cat c = new Cat() 虽然可以访问子类特有方法了,但是内存中会存在两个Cat对象,这时候就要想办法把多态的猫还原,就要使用多态的转型了,父类引用转为子类对象

Cat c = (Cat) a;

类型转换内存模型

 

本文地址:https://blog.csdn.net/fang19970714/article/details/114266097