Java面向对象进阶2——继承

简介: 继承可以让类和类之间产生父子关系。要注意的是两个类之间一定要有共同内容或者共性内容,且是父类的一种(如老师和学生都归属于人这个大类)

一、前言


本文将介绍面向对象三大特征之一的继承


二、概述


就是子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。


1df55307a39a43fc8e3575493065db53.jpg


继承可以让类和类之间产生父子关系。要注意的是两个类之间一定要有共同内容或者共性内容,且是父类的一种(如老师和学生都归属于人这个大类)

71b7a4f68b6746c78d896fa1cf85f652.jpg


三、格式


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


public class Cat extends Animal{
  ...
}


四、方法的重写


1.概述


方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。当父类的方法不能满足子类现在的需求时,需要进行方法的重写


1184daf0723d4255bada936318040c6a.png


2.本质


c0b1b9b1d6ac4af3853ac5ac177f4211.png


3.书写格式


  • @Override:放在重写后的方法上面,以校验子类重写时语法正确性


public class Animal  {
    public void run(){
        System.out.println("动物跑的很快!");
    }
    public void cry(){
        System.out.println("动物都可以叫");
    }
}
public class Cat extends Animal {
     // 声明不变,重新实现
    // 方法名称与父类全部一样,只是方法体中的功能重写写了!
    @Override
    public void behaviour(){
        System.out.println("会发出呜呜声");
    }
}


4.注意事项


  1. 方法重写是发生在子父类之间的关系
  2. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限
  3. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样
  4. 子类重写父类方法时,返回值类型必须小于等于父类
  5. 只有被添加到虚方法表中的方法才能被重写


五、构造方法


1.调用父类构造方法


super():写在第一行,有参构造时一定要手动添加


2.代码演示


class Person {
    private String name;
    private int age;
    public Person() {
        System.out.println("父类无参");
    }
    // getter/setter省略
}
class Student extends Person {
    private double score;
    public Student() {
        //super(); // 调用父类无参,默认就存在,可以不写,必须再第一行
        System.out.println("子类无参");
    }
     public Student(double score) {
        //super();  // 调用父类无参,默认就存在,可以不写,必须再第一行
        this.score = score;    
        System.out.println("子类有参");
     }
}
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("----------");
        Student s2 = new Student(99.9);
    }
}


父类无参

子类无参

················

父类无参

子类有参


六、继承中的特点


1.继承后子类特点


  • 子类可以使用父类的属性和行为
  • 子类可以在父类基础上增加新功能,使得子类更强大


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


  • 就近原则
  • 逐级往上:先从局部变量中找,如果找不到就到本类成员位置上寻找,如果还没有就在父类成员位置中寻找

用IDEA来测试一下


public class test1 {
    public static void main(String[] args) {
        Zi z = new Zi();
        z.ziShow();
    }
}
class Fu{
    String name = "Fu";
}
class Zi extends Fu{
    String name = "Zi";
    public void ziShow(){
        String name = "ziShow";
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}

a7061af5f4014412bdfe1d9959b82c21.png


原理如下


dd604c8decd246b58153017ca3f9fb53.png


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


  • this 调用:就近原则
  • super调用:找父类


用IDEA实现一下


public class Test {
    public static void main(String[] args) {
        Teacher t = new Teacher();
        t.lunch();
    }
}
class Person{
    public void eat(){
        System.out.println("吃饭");
    }
}
class Teacher extends Person{
    public void lunch() {
        this.eat();
        super.eat();
    }
    public void eat(){
        System.out.println("吃面条");
    }
}


其原理如下


8aedca78e4914132860bde6c0da5bb9a.png


4.继承中构造方法的特点


  • 子类无法继承父类的构造方法,但是可以通过super()调用
  • 子类中所以构造方法默认先访问父类中无参构造,再执行自己
  • 若想父类是有参构造,要手动书写super()


七、结语


继承中的知识点较多,并且还有方法的重写相关知识点,若有写的不足之处,请多多指正,接下来会讲述继承内关键字

相关文章
|
2天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
7 3
|
2天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
8 2
|
2天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
9 2
|
2天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
9 1
|
13天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第4天】Java零基础教学篇,手把手实践教学!
16 2
|
2月前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
17天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
19 5
|
17天前
|
Java
java继承和多态详解
java继承和多态详解
35 5
|
17天前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
20 3
|
22天前
|
Java
为什么Java不支持多继承
本文讨论了Java不支持多继承的原因,包括避免菱形继承问题、简化编程语言和防止层次膨胀,同时提供了实现多继承效果的替代方案,如实现多接口、使用组合和继承加接口的方式。
14 0
为什么Java不支持多继承