java面向对象三大特性,继承篇

简介: 1.继承的概念继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。


1.继承的概念


继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。


继承可以解决代码复用的问题,极大的提高代码的简洁性✌


2.继承原理图



3.类的继承格式


在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:


class 父类 {
}
class 子类 extends 父类 {
}


接下演示一个继承的实例:

我们先写一个父类:


/**
 * 三大特性:继承演示的父类
 */
public class Inherit {
    // 共有的属性
    public String name;
    public int age;
    private double score;
    // 共有的方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    public void showInfo() {
        System.out.println("学生姓名:" + name + " 年龄:" + age +
                " 成绩:" + score);
    }
}


写一个小学生类继承这个父类:


/**
 * 小学生,继承父类的子类
 */
public class Pupil extends Inherit {
    // 小学生独有的方法
    public void say() {
        System.out.println("爱你孤身走暗巷~");
    }
}


再写一个大学生继承这个父类:


/**
 * 大学生,继承父类的子类
 */
public class Graduate extends Inherit {
    public void say() {
        System.out.println("我是大学生,我叫:" + name);
    }
}


测试类:


/**
 * 继承演示的测试类
 */
public class InheritTest {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.setName("王强");
        pupil.setAge(12);
        pupil.setScore(100);
        pupil.say();  // 爱你孤身走暗巷~
        pupil.showInfo();  // 学生姓名:王强 年龄:12 成绩:100.0
        Graduate graduate = new Graduate();
        graduate.setName("大河");
        graduate.setAge(22);
        graduate.setScore(60);
        graduate.say();  // 我是大学生,我叫:大河
        graduate.showInfo();  // 学生姓名:大河 年龄:22 成绩:60.0
    }
}


4.继承的小细节


私有属性和方法的继承:


私有属性和方法不能在子类直接访问,要通过公共的方法去访问


上述程序中,我们对score属性做了private的访问修饰,随后发现在子类无法访问这个属性,那么应该怎么做呢?🐱‍🐉


可以看到,我们通过封装完美解决了这个问题,而封装的方法的访问权限应该设置为public✨


子类必须首先调用父类的构造器,完成对父类的初始化:


我们的父类:


// 父类的无参构造
public Inherit() {
    System.out.println("父类的无参构造执行~");
}


我们的子类:


// 子类的无参构造
public Pupil() {
    System.out.println("子类的无参构造执行~");
}


当我们新建子类的对象时,会输出如下:(首先初始化父类的构造器,再初始化子类的构造器)


父类的无参构造执行~
子类的无参构造执行~


需要说明的是,默认情况下总会去调用父类的无参构造器,如果父类没有提供一个无参构造器,则必须在子类使用super指定父类的构造器,否则会发生一个错误!❌


如果希望指定去调用父类的某个构造器,则显式的调用以下,使用super关键字


super在使用时,必须放在构造器的第一行,this也是同样的,所以他们不能共存使用


另外,java中所有的类都是Object的子类:👴🏻



需要注意的是 Java 不支持多继承,但支持多重继承:



5.继承的本质


现在我们来分析如下的代码块:



加载类的时候,首先会加载Object类(祖宗类),随后加载GrandPa类 - Father类 - Son类

随后会创建对象的堆空间,并在堆中分配空间,首先并分配GrandPa的属性

分配Father的属性,虽然和GrandPa的属性有冲突💥,但是java会选择开辟一个新的空间存放

分配Son的属性,同Father

返回堆中的地址给son



现在我们再来看,如果执行了下面的这行代码,它会输出什么信息呢?


System.out.println(son.name);


这时候就需要按照查找关系来返回信息啦!就近原则🚀



综合上述,显然它会输出:大头儿子


谨记:当属性按照就近原则向上查找时,一旦遇到一个不能访问的错误(存在该属性但是权限不不够),就会停止查找,产生一个编译错误🤳

目录
相关文章
|
8天前
|
缓存 运维 Java
Java静态代码块深度剖析:机制、特性与最佳实践
在Java中,静态代码块(或称静态初始化块)是指类中定义的一个或多个`static { ... }`结构。其主要功能在于初始化类级别的数据,例如静态变量的初始化或执行仅需运行一次的初始化逻辑。
25 4
|
2月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
162 15
|
4月前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
368 60
|
3月前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
3月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
120 6
|
3月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
45 1
|
4月前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
41 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
4月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
55 4
|
4月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
72 2
|
5月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
77 3

热门文章

最新文章