面向对象进阶--继承(Java继承(超详解))

目录

1. 继承

1.1 继承概述

1.2 继承特点

1.3练习

1.4继承父类的内容

构造方法是否被子类继承

成员变量是否被子类继承

成员方法是否被子类继承

1.5总结

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

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

方法重写概述

方法重写的本质

继承中:构造方法的特点

this,super使用总结


1. 继承

1.1 继承概述

继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

继承是指在原有类的基础上,进行功能扩展,创建新的类型。

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
JAVA中类只有单继承,没有多继承!
继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示
子类和父类之间,从意义上讲应该具有"is a"的关系。
extends的意思是“扩展”,子类是父类的扩展。

继承的格式:

  • 格式: public class 子类名 extends 父类名{}
  • 例如: public class Zi extends Fu {}
  • Fu:是父类,也被称为基类、超类
  • Zi: 是子类,也被称为派生类

继承中子类的特点:

子类可以有父类的内容,子类还可以有自己特有的内容

1.2 继承特点

Object类是所有子类的父类 如果你没有写父类 默认父类就是Object类

1.3练习

如果父类加了private私有关键字 ,子类就不能使用父类的特性了

测试类

package comitheima.a01oopextendsdemo01;public class Test {public static void main(String[] args) {//1.创建布偶猫对象Ragdoll r1 = new Ragdoll();r1.eat();r1.drink();r1.catchMouse();System.out.println("----------------");//2.创建哈士奇对象Husky h=new Husky();h.eat();h.drink();h.DownHome();}}

package comitheima.a01oopextendsdemo01;public class animal {public  void eat(){System.out.println("吃饭");}public  void drink (){System.out.println("喝水");}
}
package comitheima.a01oopextendsdemo01;public class cat extends  animal {public void catchMouse(){System.out.println("猫在抓老鼠");}
}
package comitheima.a01oopextendsdemo01;public class dog extends  animal {public void watchhose(){System.out.println("狗在看家");}
}
package comitheima.a01oopextendsdemo01;public class Husky extends dog {public void DownHome(){System.out.println("哈士奇拆家");}}

package comitheima.a01oopextendsdemo01;public class LiHua extends cat {
}
package comitheima.a01oopextendsdemo01;public class Ragdoll extends cat {}
package comitheima.a01oopextendsdemo01;public class Teddy extends dog {public void touch(){System.out.println("泰迪蹭一蹭");}
}

1.4继承父类的内容

构造方法是否被子类继承

构造方法的类名和子类的类名不一样,违背了构造方法的特征,所以父类的构造方法不能被子类继承

package comitheima.a01oopextendsdemo02;public class Test {public static void main(String[] args) {Zi zi = new Zi();//Zi zi1 = new Zi("zhasa",18);}
}class  Fu{String name;int age;public Fu(String name, int age) {this.name = name;this.age = age;}public Fu(){}
}
class Zi extends Fu{//如果一个类没有构造方法,虚拟机会自动给你添加一个默认的空参的构造方法
}

说明了子类没有继承父类的构造方法,空参构造也是虚拟机给的

成员变量是否被子类继承

public修饰的成员变量

对象先找子类再找父类

private修饰的成员变量

private修饰的变量 子类调用不了变量只能继承不能直接使用

成员方法是否被子类继承

只有非static修饰 非private修饰非final修饰的方法是虚方法
虚方法就可以继承给子类,子类就会加载方法,每次子类调用方法的时候就可以从自己的虚方法里面去调用

1.5总结

1.构造方法的类名和子类的类名不一样,违背了构造方法的特征,所以父类的构造方法不能被子类继承,不管是public修饰还是private修饰都不能被子类继承
2.成员变量不管是private修饰还是public修饰都能继承 ,但是private修饰的成员变量只能继承不能直接调用
3. 只有public修饰的成员方法才能继承,private修饰的成员方法不能继承
4.只有非static修饰 非private修饰非final修饰的方法是虚方法
虚方法就可以继承给子类,子类就会加载方法,每次子类调用方法的时候就可以从自己的虚方法里面去调用
 

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

遵循就近原则

在子类方法中访问一个变量

最先在子类局部范围找,如果没有就在子类成员范围找,最后在父类成员范围找,如果都没有就报错(不考虑父亲的父亲...)。

name先在局部位置找,然后再到本类的成员位置找,然后在到父类找,一级一级往上找

this访问的是本类的成员变量 ,super是访问父类的成员变量

 例如:创建一个父类Fu

public class Fu {public int age = 10;
}

创建一个子类Z

public class Zi extends Fu {public int heigth = 180;public int age = 20;// 若果没有这句,和下面那句,输入的是10public void show() {int age = 30;// 若果没有这句,输入的是20System.out.println(age);System.out.println(heigth);}
}

创建一个测试类Test

public class Test {public static void main(String[] args) {// 创建对象调用方法Zi z = new Zi();z.show();}
}

结果:

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

通过子类对象访问一个方法:

先子类成员范围找,如果找不到就在父类成员范围找,如果都没有就报错(不考虑父亲的父亲...)


 

方法重写概述

方法重写概述:子类中出现了和父类中一模一样的方法声明
方法重写的应用:当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容

@Override
是一个注解可以帮助我们检查重写方法的方法声明的正确性

方法重写的本质

只有被添加到虚方法中的方法才能被重写

package comitheima.a01oopextendsdemo04;import java.util.SimpleTimeZone;public class Dog {public void eat() {System.out.println("狗在吃狗粮");}public void drink(){System.out.println("狗在喝水");}public void lookhome(){System.out.println("狗在看家");}
}
package comitheima.a01oopextendsdemo04;public class Husky extends  Dog {public void downhome(){System.out.println("哈士奇在拆家");}
}
package comitheima.a01oopextendsdemo04;public class Chinesedog extends  Dog {public void eat(){//父类的方法不能满足我们的需求,所以进行了重写,且父类的方法我根本用不到System.out.println("中化田园犬在吃剩饭");}
}
package comitheima.a01oopextendsdemo04;public class sharper extends Dog {//因为沙皮狗吃的是狗粮和骨头//父类的方法不能满足我们的需求,所以进行了重写//方法重写@Overridepublic void eat(){super.eat();System.out.println("沙皮狗在吃骨头");}
}
package comitheima.a01oopextendsdemo04;public class Test {public static void main(String[] args) {Husky h= new Husky();h.eat();h.drink();h.lookhome();h.downhome();System.out.println("----------");sharper sh=new sharper();sh.eat();sh.drink();sh.lookhome();System.out.println("----------");Chinesedog Ch=new Chinesedog();Ch.eat();Ch.drink();Ch.lookhome();}

继承中:构造方法的特点

子类中所有的构造方法默认都会访问父类中无参的构造方法。

  1. 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
  2. 每一个子类构造方法的第一条语句默认都是: super()

 例如:创建一个父类Fu

public class Fu {public Fu() {System.out.println("Fu中无参构造方法被调用");}public Fu(int age) {System.out.println("Fu中带参构造方法被调用");}
}

创建一个子类Zi

 
public class Zi extends Fu {public Zi() {// super();System.out.println("Zi中无参构造方法被调用");}public Zi(int age) {// super();System.out.println("Zi中带参构造方法被调用");}
}

测试:Test

public class Test {public static void main(String[] args) {Zi z = new Zi();System.out.println("-------------------");Zi zi = new Zi(18);}
}

子类的初始化之前,要调用父类的构造方法先完成父类的数据初始化
如果想要调用父类的有参构造 ,必须手动加上super.
我还想强调的是父类的构造方法,子类是不能继承,但是子类可以去调用父类的方法,继承不了不代表调用不了,不管是private修饰还是public修饰的构造方法,子类都继承不了父类的构造方法

 如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?

  1. 通过使用super关键字去显示的调用父类的带参构造方法
  2. 在父类中自己提供一个无参构造方法
  3. 推荐: 自己给出无参构造方法

例如:创建一个父类Fu

public class Fu {// public Fu() {// System.out.println("Fu中无参构造方法被调用");// }public Fu(int age) {System.out.println("Fu中带参构造方法被调用");}
}

创建一个子类Zi

public class Zi extends Fu {public Zi() {super(18);System.out.println("Zi中无参构造方法被调用");}public Zi(int age) {super(18);System.out.println("Zi中带参构造方法被调用");}
}

测试:Test

public class Test {public static void main(String[] args) {Zi z = new Zi();System.out.println("-------------------");Zi zi = new Zi(18);}
}

super访问父类的构造方法

package comitheima.a05oopextendsdemo05;public class Student  extends  Person{public  Student(){//子类构造方法中隐藏的super()去访问父类的无参构造super();System.out.println("子类的无参构造");}public  Student(String name,int age){//子类构造方法中手动去在super方法中传参数 就可以去调用带参构造super(name,age);System.out.println("子类的无参构造");}
}

package comitheima.a05oopextendsdemo05;public class Test {public static void main(String[] args) {Student s1 = new Student("zhangsa",18);System.out.println(s1.name+" "+s1.age);}
}
package comitheima.a05oopextendsdemo05;public class Person {String name;int age;public Person() {System.out.println("父类的无参构造");}public Person(String name, int age) {this.name = name;this.age = age;}
}

      


this,super使用总结

例如:定义一个父类Fu

public class Fu {public int age = 10;}

定义一个子类Zi

 
public class Zi extends Fu {public int age = 20;public void show() {int age = 30;System.out.println(age); // 30// 访问本类中的成员变量ageSystem.out.println(this.age);// 访问Fu类中的成员变量ageSystem.out.println(super.age);}
}

测试:Test

public class Test {public static void main(String[] args) {Zi z = new Zi();z.show();}
}

this访问本类的构造方法

测试类

package comitheima.a06oopextendsdemo06;import com.sun.tools.javac.Main;public class Test {public static void main(String[] args) {Manager m=new Manager("001","zhangsan",6666,1000.0);System.out.println(m.getId()+" "+m.getName()+" "+m.getSalary()+" "+m.getBonus());m.word();m.eat();System.out.println("--------------");Cook c=new Cook("002","lisi",1111);System.out.println( c.getId()+" "+c.getName()+" "+c.getSalary());c.word();c.eat();}
}

父类

public class Employee {private String id;private String name;private int salary;public Employee() {}public Employee(String id, String name, int salary) {this.id = id;this.name = name;this.salary = salary;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public void word(){System.out.println("员工在工作");}public void eat(){System.out.println("在吃米饭");}
}

子类经理类

public class Manager extends Employee {private double bonus;public Manager() {}//带全部的构造方法//父类+子类的构造方法public Manager(String id, String name, int salary, double bonus) {super(id, name, salary);//调用父类的有参构造,把id,name,salary,bonus的值给父类this.bonus = bonus;//子类的特有的奖金在本类赋值}public double getBonus() {return bonus;}public void setBonus(double bonus) {this.bonus = bonus;}@Overridepublic void word() {System.out.println("经理在管理其他人");}}

子类厨师类

package comitheima.a06oopextendsdemo06;public class Cook extends  Employee {public Cook() {}public Cook(String id, String name, int salary) {super(id, name, salary);}@Overridepublic void word() {System.out.println("厨师在炒菜");}
}

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

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

相关文章

飞睿智能LR-WIFI无线数据采集模块,6公里视频图传,安防监控、工业传输数据更高效

在数字化浪潮席卷全球的今天,无线数据采集技术已经成为推动社会进步的重要力量。特别是在安防监控和工业领域,高效、稳定的数据传输成为了实现智能化、自动化的关键。飞睿智能LR-WiFi无线数据采集模块不仅具备可靠的传输性能,还能在复杂环境下…

尚硅谷爬虫学习第一天(3) 请求对象定制

#url的组成 #协议 http,https,一个安全,一个不安全。 #主机, 端口号 学过java 的肯定知道 沃日,以前面试运维的时候,问到主机地址,我懵逼了下,回了个8080 # 主机地址 80 # …

GEE(六边形制作)——实现研究去边界蜂窝状(六边形)矢量的转换

简介 在GEE中实现研究区边界蜂窝状矢量的转换,这里我们首先获取研究区边界,然后进行边界坐标点进行获取,然后根据六边形坐标点计算公式,然后遍历研究区即可。 在Google Earth Engine(GEE)中,可以使用以下步骤来制作去边界的六边形矢量: 1. 首先,选择一个区域或图像…

python pandas 读取excel表格

情况说明 py文件和数据已经在同一文件路径中,excel表名为“BloombergESG_ClosePrice.xlsx”,内含两张工作表。第一张工作表名为“ESG_score”,数据较少;第二张工作表名为“all_stock_close(1209)”&#x…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为,保障用户的合法权益,自2023年9月15日起,对于涉及处理用户个人信息的小程序开发者,微信要求,仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

Datacom HCIE实验考试通过率90%!深圳智汇云校传来5月捷报!

坚持不懈地努力,才能取得成功的果实 这是不变的真理 深圳云校传来5月捷报 在Datacom HCIE实验考试中 共有10名学员应战 其中9名学员凭借出色的表现 一次性通过了考试 展现出了扎实的技术能力 通过率高达90% (华为历年考试平均通过率约60%&#…

超级棒的时钟屏保 芝麻时钟颜值高 屏保界的天花板

太酷了!这个时钟屏保太有个性了 屏保时钟软件推荐!超级棒的时钟屏保 芝麻时钟颜值高 屏保界的天花板,今天小编给大家分享一个非常实用好看的时钟屏保(芝麻时钟),从美观、功能、效果、操作方面去评估&#x…

junit mockito Dao层

Dao层单元测试需要启动服务的上下文 业务逻辑需要别名进行MOCK打桩 为了不影响测试结果和对数据库产生脏数据&#xff0c;使用Sql注解来完成相关数据的初始化和清除 Dao public interface BranchDao extends BaseDao<BranchPO, Long> {ModifyingTransactionalQuery(n…

【机器学习】机器学习重要方法——无监督学习:理论、算法与实践

文章目录 引言第一章 无监督学习的基本概念1.1 什么是无监督学习1.2 无监督学习的主要任务 第二章 无监督学习的核心算法2.1 聚类算法2.1.1 K均值聚类2.1.2 层次聚类2.1.3 DBSCAN聚类 2.2 降维算法2.2.1 主成分分析&#xff08;PCA&#xff09;2.2.2 t-SNE 2.3 异常检测算法2.3…

Java new HashMap 指定容量,代码怎么写? 学习源码小记

之前针对 创建map 指定容量&#xff0c;写过一篇吐槽教学文章&#xff1a;HashMap 使用的时候指定容量&#xff1f;你真的用明白了吗&#xff1f;&#xff08;值得一阅&#xff09;_new hashmap<>(4);-CSDN博客 因为我们经常要通过代码做一些数据的分组&#xff0c;比如查…

深入理解网络协议——搞懂协议在系统中的应用

1. 不精确指明的协议软件接口 在多数实现中&#xff0c;TCP/IP协议软件驻留在计算机的操作系统中。因此&#xff0c;只要应用程序使用TCP/IP通信&#xff0c;它就必须与操作系统交互并请求其服务。从程序员的观点看&#xff0c;操作系统所提供的那些例程定义了应用程序和协议软…

重庆地区媒体宣传邀约资源整理

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆地区媒体宣传邀约资源整理 一、主流媒体资源 电视台&#xff1a;重庆电视台&#xff1a;作为重庆地区最具影响力的电视媒体之一&#xff0c;拥有多个频道&#xff0c;涵盖新闻、综艺…

C#面:C#中有没有静态构造函数,如果有是做什么用的?

在C#中是存在静态构造函数的&#xff0c;它被称为静态构造器&#xff08;static constructor&#xff09;。静态构造函数是一种特殊的构造函数&#xff0c;用于初始化静态成员变量或执行一些静态初始化操作。它与普通的实例构造函数不同&#xff0c;静态构造函数没有参数&#…

数据提取的艺术:如何通过数据治理提高效率

数据提取的艺术&#xff1a;如何通过数据治理提高效率 在当今数字化浪潮下&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何从海量的数据中提取有价值的信息&#xff0c;并将其转化为实际的业务效益&#xff0c;却是一个挑战。数据治理&#xff0c;作为确保…

在 Qt Quick 中的布局:Grid,Row

Grid 在 Qt Quick 中&#xff0c;网格布局可以使用 Grid 元素来实现。Grid 元素允许您以网格形式对子元素进行布局&#xff0c;类似于 HTML 中的表格布局。以下是一个简单的示例&#xff0c;展示如何在 QML 中使用网格布局&#xff1a; import QtQuick 2.0Grid {columns: 3 /…

python-日历库calendar

目录 打印日历 基本日历类Calendar TextCalendar类 HTMLCalendar类 打印日历 设置日历每周开始日期(周几) import calendarcalendar.setfirstweekday(calendar.SUNDAY) # 设置日历中每周以周几为第一天显示 打印某年日历 print(calendar.calendar(2024, w2, l1, c6, m…

flutter实现UDP发送魔法包唤醒主机

魔法包 魔法包是用16进制表示的数据包&#xff0c;它是由固定的前缀数据(FFFFFFFFFFFF)以及固定重复次数(16次)的目标主机MAC地址组成。 假设目标主机的MAC地址是&#xff1a;"50:eb:f6:27:ae:a8" 那么魔法包就是[FFFFFFFFFFFF50EBF627AEA850EBF627AEA850EBF627AEA8…

数据结构与算法笔记:基础篇 - 分治算法:谈一谈大规模计算框架MapReduce中的分治思想

概述 MapReduce 是 Google 大数据处理的三姐马车之一&#xff0c;另外两个事 GFS 和 Bigtable。它在倒排索引、PageRank 计算、网页分析等搜索引擎相关的技术中都有大量的应用。 尽管开发一个 MapReduce 看起来很高深。实际上&#xff0c;万变不离其宗&#xff0c;它的本质就…

重磅!首个跨平台的通用Linux端间互联组件Klink在openKylin开源

随着智能终端设备的普及&#xff0c;多个智能终端设备之间的互联互通应用场景日益丰富&#xff0c;多设备互联互通应用场景需要开发者单独实现通讯协议。因此&#xff0c;为解决跨平台互联互通问题&#xff0c;由openKylin社区理事单位麒麟软件旗下星光麒麟团队成立的Connectiv…

<provider>标签的android:authorities属性,和androidx.appcompat.androidx-startup库有什么关系?

<provider> 标签的 android:authorities 属性在 Android 中是用于唯一标识一个 ContentProvider 的。这与库或特定的组件&#xff08;如 androidx.appcompat&#xff09;本身并没有直接的关系&#xff0c;除非该库或组件内部定义了一个 ContentProvider 并指定了它的 aut…