JAVA-继承

news2024/9/21 14:34:09

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

目录

文章目录

前言

1.为什么需要继承

2. 继承的语法

3.子类构造方法

 4.super和this的异同

5.final 关键字

总结



前言

继承是面向对象语法的三大特征之一。在以后写代码的过程中,我们不可避免的会用到相关的知识,那么就跟着我一起去看看吧!


1.为什么需要继承

继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

文字上的描述或许不太清楚,下面代码块我相信足够了

无继承时

class Dog {

    String name;
    int age;

    public void eat(){
        System.out.println("吃饭");
    }

    // 小狗特有的方法
    public void lookHome(){
        System.out.println("看家护院");
    }
}

class Cat{

    String name;
    int age;

    public void eat(){
        System.out.println("吃饭");
    }

    // 猫咪特有的方法
    public void meow(){
        System.out.println("喵喵");
    }
}

有继承时,猫和狗都可以看做是动物,将相同的方法和变量抽取出来定义为Animal类,子类使用extends关键字即可继承Animal

class Animal{
    String name;
    int age;

    public void eat(){
        System.out.println("吃饭");
    }
}

class Dog extends Animal{

    // 小狗特有的方法
    public void lookHome(){
        System.out.println("看家护院");
    }
}

class Cat extends Animal{

    // 猫咪特有的方法
    public void meow(){
        System.out.println("喵喵");
    }
}

现在有点感觉了吗?  

有人或许会说了,这代码也没少呀! 不是说减少代码,避免冗余吗? 你不会是在逗我吧!

唉,我可没逗你,这个Animal类可不是只有猫和狗可以继承,只要是动物都可以继承,这样说,我想你就

恍然大明白了吧!

现在再来理解下这张图,相信屏幕前的帅哥美女们不会有任何压力了,这就是继承,那么接下来我将带  着你去深入学习相关的语法,一定要坚持下去哦。

2. 继承的语法

1.extends关键字: 表示类之间的继承关系(不可多继承)

纳尼? 啥是不可多继承呀,别急,看下面

看到了没,类不能扩展多个类,这里多提一句,C++是支持多继承的,当然了,我们JAVA为了解决多继承问题引入了接口,想要了解接口吗?,见下回分解

2.子类访问父类成员变量

2.1 不存在同名的成员变量,直接访问即可

class Father{
    int a = 10;
    int b = 20;
}

class Son extends Father{
    int c = 30;
    int d = 40;

    public void test(){
        System.out.println(a);//10
        System.out.println(b);//20
        System.out.println(c);//30
        System.out.println(d);//40
    }
}

2.2 存在同名的成员变量(重在理解)

1.如果访问的成员变量子类中有,优先访问自己的成员变量。

2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。

总结:  成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

这时或许就有人问了,难道我就不能先访问父类的变量和方法吗?这怎么可能不行吗? 

 2.3 super关键字(子类中调用父类的成员变量和方法)

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成 员时,该如何操作?直接访问是无法做到的,Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。

class Father{
    String name = "Father";
    int age = 48;

    public void method(){
        System.out.println("Father");
    }
}
class Son extends Father{
    String name = "Son";
    int age = 18;
    
    public void method(){
        System.out.println("Son");
    }
    
    public void test(){
        System.out.println(name);// Son
        System.out.println(super.name);// Father
        System.out.println(age);// 18
        System.out.println(super.age);// 48
        method();// Son
        super.method();// Father
    }
}

 不要理解复杂了哦,super就是个关键字!

注意事项: super只能在非静态方法中使用(这里不过多赘述,想了解请查看static详解)

3.子类构造方法

且看

public class Test {
    public static void main(String[] args) {
        Son son = new Son();
    }
}

class Father{

    public Father(){
        System.out.println("Father()");// 父类构造方法
    }
}

class Son extends Father {

    public Son(){
        System.out.println("Son()");// 子类构造方法
    }
}

 

 

 

怎么个事? 为什么会打印出两个结果呀? 哥们不造啊! 别急 等看完下面的,你就恍然大明白了。

父子父子,先有父再有子,即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

 

子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。父子父子 肯定是先有父再有子,所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己增加的成员初始化完整。

明了个大白了吧! 

 4.super和this的异同

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语 句,那他们之间有什么区别呢?

相同点:

1. 都是Java中的关键字

2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段

3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

不同点:

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成 员的引用 

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造 方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

这里我只能说尽力吧! 尽力讲明白,人家也只是个大学生

 且听我一一道来!

这次讲清楚点,先说this关键字

对象实例化(对象被创建时),JVM(java虚拟机)就会给实例化的对象分配一个this,那么什么是this呢?

this就是对当前对象的引用!! 其实和C语言中的地址差不多,可以配合着理解,我再给大家画个图

 

细节:

1. this只能在成员方法中使用

2.. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法 对象的引用传递给该成员方法,this负责来接收

 相信看到这里你已经理解了this吧!

5.final 关键字

1. 修饰变量或字段,表示常量(即不能修改)

final int a = 10;

a = 20; // 编译出错

2. 修饰类:表示此类不能被继承

final public class Animal {

              ...

}

public class Bird extends Animal {

              ...

}

// 编译出错 Error:(3, 27) java: 无法从最终com.bit.Animal进行继

3. 修饰方法:表示该方法不能被重写(后面介绍)

 

总结

以上就是继承的主要内容了,大家敲敲代码,多理解一下,应该不成问题不大

 关注我,后续更精彩!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/512071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python 装饰器成长路径】零基础也能轻松掌握的学习路线与参考资料

Python装饰器是Python语言的一个重要特性,可以让代码更加简洁、优雅,并且让代码重用性更加高效。本文针对Python装饰器的学习路线,参考资料和优秀实践进行详细介绍。 文章目录 一、学习路线二、参考资料三、优秀实践 一、学习路线 了解函数…

10. 类的友元

一、类的友元 生活中你的家有客厅(public),有你的卧室(private),客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是,你也可以允许…

01-mysql安装篇(rpm方式安装+压缩包安装)

文章目录 一、rpm方式安装1、检查是否安装了mariadb2、下载mysql3、上传解压4、安装5、检查安装6、开启mysql服务7、登陆mysql8、修改密码设置规则(简单型-学习用)9、修改密码10、授权远程登陆11、启停mysql命令12、rpm方式安装说明 二、压缩包方式安装V…

前端技术搭建飞机大战小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了弹珠游戏,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节…

2023年第三届长三角高校数学建模竞赛】A 题 快递包裹装箱优化问题 详细数学建模过程

1 题目 2022 年,中国一年的包裹已经超过 1000 亿件,占据了全球快递事务量的一半以上。近几年,中国每年新增包裹数量相当于美国整个国家一年的包裹数量, 十年前中国还是物流成本最昂贵的国家,当前中国已经建立起全世界…

阿里云服务器建站教程来了(十分钟网站上线)

使用阿里云服务器快速搭建网站教程,先为云服务器安装宝塔面板,然后在宝塔面板上新建站点,阿里云服务器网以搭建WordPress网站博客为例,来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程: …

布朗运动模拟

布朗运动模拟 文章目录 布朗运动模拟[toc]1 布朗运动定义2 布朗运动模拟3 布朗桥4 带漂移布朗运动5 几何布朗运动 1 布朗运动定义 给定随机过程 { W ( t ) , t ≥ 0 } \{W(t),t \ge 0 \} {W(t),t≥0},满足以下条件,则称 W ( t ) W(t) W(t)为标准布朗运动…

1 ElasticSearch介绍

全文检索 Elastisearch 研究 目标 了解Elasticsearch的应用场景掌握索引维护的方法掌握基本的搜索Api的使用方法 约束 阅读本教程之前需要掌握Lucene的索引方法、搜索方法 。 1 ElasticSearch介绍 1.1 介绍 官方网址:https://www.elastic.co/cn/products/elas…

【OpenCV】学习课-图像获取与显示(1)!

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLA…

JAVA-多态

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 1.多态的概念 2.多态的实现条件 3.重写 总结 1.多态的概念 什么是多态? 通俗来说,就是多种形态,具体点就是去完成某个…

【仪器控制】LAN Web 浏览器界面!

仪器支持不同的接口和协议进行远程控制。下表给出了概述 LAN web 浏览器界面 : LAN Web 浏览器界面允许轻松配置 LAN 和远程控制 R&S FSW,无需额外的安装要求。 仪器的 LAN 网络浏览器界面可与所有 W3C 兼容的浏览器正常工作。 通过 R&S FSW 的 …

React组件实例state-事件绑定(三)

类组件中的属性 我们看一个简单的类组件实例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>hello_react</title></head><body><!-- 准备好一个“容器” --><div id&q…

Tech Talk | 还原照片不同亮度范围细节——RAW HDR技术

拍照时&#xff0c;你是否遇到过这些情况呢&#xff1f; 拍摄的成片暗区过暗&#xff0c;高亮区域过曝 逆光拍摄中&#xff0c;会出现“鬼影” 暗部噪声偏大导致图像出现瑕疵 ....... 照片的高光和暗区细节得总是不到完美呈现&#xff0c;这是所有拍摄设备都会出现的问题。那么…

淘宝拍立淘多码识别方案总结

本文通过拆解原始问题、发散思路优化等方式&#xff0c;记录了扫一扫从单码到多码识别的技术框架改造及多码识别率优化方案。其中涉及解码SDK的能力、码处理技术链路、码转换算法、降低漏检率策略等设计与实现。 背景与挑战 多码即在同一个界面中同时存在多个条码或二维码&…

国产自研数据库是更新换代首选

伴随着数字经济的高速发展&#xff0c;越来越多的企业都意识到了数据是现代企业最具价值的资产。而与之相对应的是&#xff0c;数据库的重要性也随之水涨船高。 近年来&#xff0c;在席卷全球的云原生大潮中&#xff0c;数据库产业迎来了极为重要的转型升级。特别是在自主创新的…

JVM系列-第7章-对象的实例化内存布局与访问定位

对象的实例化内存布局与访问定位 对象的实例化 大厂面试题 美团&#xff1a; 对象在JVM中是怎么存储的&#xff1f;对象头信息里面有哪些东西&#xff1f; 蚂蚁金服&#xff1a; 二面&#xff1a;java对象头里有什么 对象创建的方式 new&#xff1a;最常见的方式、单例…

真正的智能不仅仅是一个技术问题

智能并不是单一的技术问题&#xff0c;而是一个包括技术、人类智慧、社会制度和文化等多个方面的综合体&#xff0c;常常涉及技术变革、系统演变、运行方式创新、组织适应。智能是指人类的思考、判断、决策和创造等高级认知能力&#xff0c;可以通过技术手段来实现增强和扩展。…

【基础篇】nginx代理、动静分离、路径重写、高可用以及https配置

目录 正向代理 反向代理 负载均衡 负载均衡的策略 动静分离 alias与root UrlRewrite(资源路径重写) 防盗链配置 高可用配置 Https证书配置 安装BBS&#xff08;开源界的鼻祖&#xff09; 正向代理 用户知道nginx服务器的存在&#xff0c;与nginx服务器是一伙的。…

第五十五章 Unity 视频播放

使用视频播放器组件(Video Player)可将视频文件附加到游戏对象&#xff0c;然后在运行时在游戏对象的纹理上播放。首先&#xff0c;我们需要了解视频文件。视频文件的典型文件扩展名包括 .mp4、.mov、.webm 和 .wmv。可将许多不同的视频文件格式导入 Unity 中。Unity 将导入的视…

【Linux】编译器gcc/g++的使用

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、gcc/g的介绍二、程序的翻…