悄悄学习Java的继承机制,然后惊艳所有人

简介: 悄悄学习Java的继承机制,然后惊艳所有人


前面学习过,面向对象程序设计的基本原则有四个,即抽象原则、封装原则、继承原则、多态原则

今天来学习一下第三个基本原则——继承原则


一、继承概念

继承原则的主要作用就是代码复用,降低编码量。
在Java中,有extends这样一个关键字负责继承的模块,表示一个类继承了某一个父类。

比如先定义一个User类,代表人类

public class User {
    private String name;
    private int age;
    // ...省略get set方法
}

再定义一个学生类继承User类

public class Student extends User{
}

此时,学生类就包括了User类的变量,可以在测试类调用

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("张三");
        student.setAge(18);
    }
}
在Student类并没有定义成员变量,但存在两个父类的成员变量,这就是继承!

二、访问级别

public class User {
    // private 级别
    private String name1;
    // 默认 级别
    String name2;
    // protected 级别
    protected String name3;
    // public 级别
    public String name4;
}

访问权限明细如下

访问权限 类内部 包下的类 非本包子类 非本包非子类
public
protected ×
默认 × ×
private × × ×
java.lang.Object类是所有Java类的超类,即所有Java类都直接或者简介继承了java.lang.Object类。

在Object类中,定义了Java对象都应具备的方法。

即使某一个类没有使用extends关键字,也默认直接继承了Object类,这是Java的约定。

比如User类

public class User {
    // private 级别
    private String name1;
    // 默认 级别
    String name2;
    // protected 级别
    protected String name3;
    // public 级别
    public String name4;
}

等同于

public class User extends Object{
    // private 级别
    private String name1;
    // 默认 级别
    String name2;
    // protected 级别
    protected String name3;
    // public 级别
    public String name4;
}

三、super关键字

之前学习了this关键字,this代表着当前对象本身。

在Java的继承关系中,子类也需要去调用父类的资源,Java提供了super关键字来实现这类功能。

super还可以调用被覆盖或者被隐藏的父类方法。

父类User定义了say方法

public class User{
    public void say() {
        System.out.println("我是User类");
    }
}

子类Student也定义say方法

public class Student extends User{
    @Override
    public void say() {
        System.out.println("我是Student类");
        super.say();
    }
}

在测试类中,调用Student方法

public class Main {
    public static void main(String[] args) {
        new Student().say();
    }
}

输出如下,即子类Student调用了父类User的say方法

我是Student类
我是User类
Process finished with exit code 0
在实际编程中,一般在类的构造方法中,或者调用父类被覆盖/隐藏方法的场景下会用到super关键字。

四、方法覆盖

方法覆盖即方法重写,至子类存在和父类同名同参同返回类型的方法,覆盖掉了父类的方法,即子类重写父类继承下的方法,给出新的执行代码。

之前介绍的User和Student的say方法就是方法覆盖的demo。


五、属性隐藏

属性隐藏指在子类重新定义了父类同名的成员变量,从而导致在子类中不能找到父类继承而来的成员变量。

子类可以通过属性隐藏,来实现父类未完善的功能,对父类的功能进行进一步扩展。

public class User{
    public String post;
}
public class Student extends User{
    public String post = "学生";
}
public class Main {
    public static void main(String[] args) {
        System.out.println(new Student().post);
    }
}

输出

学生
Process finished with exit code 0
但继承不是万能的,父类的构造方法不能被继承,private的私有成员变量/方法也不能被继承,子类覆盖方法的访问权限不能比父类低,不能修改父类方法的是否静态属性。

六、方法重载

前面学习的方法覆盖,指的是Java继承关系中,子类对父类继承而来的方法进行了重写,存在于不同的类中,要求子类的方法声明和父类一致。

而方法重载指的是同一个类中有多个同名的方法,但方法的参数、返回类型至少有一个不同,且方法的代码也不一样,要求子类的方法声明和父类不完全一致。

如下面的add方法

public class Main {
    public static int add(int x,int y) {
        return x + y;
    }
    public static float add(float x,float y) {
        return x + y;
    }
    public static float add(int x,float y) {
        return x + y;
    }
    public static void main(String[] args) {
        System.out.println(add(1, 2));
    }
}
add方法当Java程序编译时,就能动态调用哪一个方法,而方法覆盖只有当Java程序运行时,才能唯一确定调用哪个方法。

idea工具会给与调用提示

七、final关键字

在实际开发中,父类只允许子类继承,但不允许子类修改。

在一些安全性较高的场景下会有这样一个需求。

此时可以将父类方法或父类成员变量增加final关键字修饰,子类将不能更改父类的成员方法。

public class User{
    public final void say() {
        System.out.println("我是USER");
    }
}

子类无法重写覆盖


预告:下一篇计划学习Java接口


相关文章
|
2月前
|
Java 程序员
Java中的继承和多态:理解面向对象编程的核心概念
【8月更文挑战第22天】在Java的世界中,继承和多态不仅仅是编程技巧,它们是构建可维护、可扩展软件架构的基石。通过本文,我们将深入探讨这两个概念,并揭示它们如何共同作用于面向对象编程(OOP)的实践之中。你将了解继承如何简化代码重用,以及多态如何为程序提供灵活性和扩展性。让我们启程,探索Java语言中这些强大特性的秘密。
|
8天前
|
Java 编译器
封装,继承,多态【Java面向对象知识回顾①】
本文回顾了Java面向对象编程的三大特性:封装、继承和多态。封装通过将数据和方法结合在类中并隐藏实现细节来保护对象状态,继承允许新类扩展现有类的功能,而多态则允许对象在不同情况下表现出不同的行为,这些特性共同提高了代码的复用性、扩展性和灵活性。
封装,继承,多态【Java面向对象知识回顾①】
|
22天前
|
Java 编译器
Java——类与对象(继承和多态)
本文介绍了面向对象编程中的继承概念,包括如何避免重复代码、构造方法的调用规则、成员变量的访问以及权限修饰符的使用。文中详细解释了继承与组合的区别,并探讨了多态的概念,包括向上转型、向下转型和方法的重写。此外,还讨论了静态绑定和动态绑定的区别,以及多态带来的优势和弊端。
24 9
Java——类与对象(继承和多态)
|
20天前
|
设计模式 架构师 Java
Java开发工程师转架构师需要学习什么
Java开发工程师转型为架构师需掌握多项技能:精通Java及框架、数据库与分布式系统;熟悉设计模式与架构模式;积累项目经验;提升沟通与领导力;持续学习新技术;培养系统设计与抽象能力;了解中间件及开发工具;并注重个人特质与职业发展。具体路径应结合个人目标与实际情况制定。
42 18
|
1月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
105 6
【Java学习】多线程&JUC万字超详解
|
11天前
|
Java
Java 的继承
在一个森林中,各种动物共存,如狗和猫。为了管理和组织这些动物,我们采用面向对象的方法设计模型。首先创建 `Animal` 超类,包含 `name` 和 `age` 属性及 `makeSound()` 和 `displayInfo()` 方法。接着,通过继承 `Animal` 创建子类 `Dog` 和 `Cat`,重写 `makeSound()` 方法以发出不同的声音。实例化这些子类并使用它们,展示了继承带来的代码重用、扩展性和多态性等优点。这种方式不仅简化了代码,还体现了现实世界的层次结构。
|
2月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
26天前
|
Java
java的继承详解
在 Java 中,继承是一个核心概念,它允许子类 `extends` 父类来重用和扩展其属性与方法。子类可以覆盖父类的方法以改变行为,同时使用 `super` 关键字调用父类的构造方法或方法。虽然 Java 不支持多继承,但可以利用抽象类与接口实现多层继承。这种方式极大地增强了代码的复用性和维护性。
|
2月前
|
前端开发 Java 编译器
【前端学java】如何从前端视角快速学习Maven
【8月更文挑战第12天】如何从前端视角快速学习Maven
43 2
【前端学java】如何从前端视角快速学习Maven
|
2月前
|
Java 编译器
Java继承
Java继承
16 1
下一篇
无影云桌面