Java_继承

news2024/11/21 0:33:40

作者:爱塔居的博客_CSDN博客-JavaSE领域博主

专栏:JavaSE

文章目录

  • 前言
  • 一、pandas是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结

一、为什么需要继承

🍸继承最大的意义是:对代码可以进行复用。

Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体。但是现实世界错综复杂,事物之间会存在一些关联,那在设计程序时就需要考虑。

举个例子,如果我们要写一个猫类和一个狗类。它们都是动物。猫猫的属性有:名字、年纪、颜色、体重……狗狗的属性也有名字、年纪、颜色、体重等。通过继承的话,我们只需要写一个animal类,让猫类和狗类继承,就可以少写一些代码了。

不用继承的程序:

class Dog{
    public String name;
    public int age;
    public void WangWang(){
        System.out.println("汪汪叫");
    }
    public void print1(){
        System.out.print(name+" "+age);
    }

}
class Cat{
    public String name;
    public int age;
    public void print2(){
        System.out.print(name+" "+age);
    }

    public void MiaoMiao(){
        System.out.println("喵喵叫");
    }
}

public class Test {
    public static void main(String[] args) {
    Dog dog=new Dog();
    dog.name="旺财";
    dog.age=3;
    dog.print1();
    dog.WangWang();
   Cat cat=new Cat();
   cat.name="进宝";
   cat.age = 2;
   cat.print2();
   cat.MiaoMiao();
    }
}

使用继承的程序:

class Animal{
    public String name;
    public int age;
    public void print(){
        System.out.print(name+" "+age);
    }
}
class Dog extends Animal{
    public void WangWang(){
        System.out.println("汪汪叫");
    }
}
class Cat extends Animal{
    public void MiaoMiao(){
        System.out.println("喵喵叫");
    }
}

public class Test {
    public static void main(String[] args) {
    Dog dog=new Dog();
    dog.name="旺财";
    dog.age=3;
    dog.print();
    dog.WangWang();
   Cat cat=new Cat();
   cat.name="进宝";
   cat.age = 2;
   cat.print();
   cat.MiaoMiao();
    }
}

 🥑面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用、

二、继承概念

继承机制:是面对对象程序设计使代码可以复用的最重要的手段。

 继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。

子类会将父类中的成员变量或者成员方法继承到子类中。子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承。

三、继承的语法

在java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类{

}

四、父类成员访问

4.1 子类访问父类的成员变量

在子类方法中或者通过子类对象访问成员时:

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

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

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

🍒成员变量访问遵循就近原则,自己有,就优先自己的。没有的话,就向父类中找。

例子如下👇:

class Person{
    int a=0;
    int b=0;
    int c=1;
}
class Child extends Person{
    int a=1;
    char b='b';
    public void func(){
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
    }
}
public class Test {
    public static void main(String[] args) {
        Child child=new Child();
       child.func();
    }
}

输出结果:

 4.2 子类中访问父类的成员方法

如果成员方法名字不同:

class Base {
    public void methodA() {
        System.out.println("Base中的methodA");
    }
}

class  Derived extends Base {
    public void methodB() {
        System.out.println("Derive中的methodB");
    }
    public void func(){
        methodA();
        methodB();
    }
}

public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}

输出结果:

 如果成员方法名字相同:

class Base {
    public void methodA() {
        System.out.println("Base中的methodA");
    }
    public void methodB(int a) {
        System.out.println("Base中的methodB");
    }
}

class  Derived extends Base {
    public void methodB() {
        System.out.println("Derive中的methodB");
    }
    public void methodA() {
        System.out.println("Derive中的methodA");
    }
    public void func(){
        methodA();
        methodB();
        methodB(1);
    }
}

public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}

输出结果:

 🥝🥝总结:

1.成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的。自己没有的时候再到父类中找,如果父类中也没有就报错。

2.成员方法同名时,通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表相同,优先调用子类。如果父类和子类同名方法的参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问,如果没有则报错。


五、super关键字

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的,Java 提供了 super 关键字,该关键字主要作用:在子类方法中访问父类的成员。
class Base {
    int a=1;
    public void methodA() {
        System.out.println("Base中的methodA");
    }
}

class  Derived extends Base {
    public void methodA() {
        System.out.println("Derive中的methodA");
    }
    int a=2;
    public void func(){
        methodA();
       super.methodA();
        System.out.println(super.a);
        System.out.println(a);
    }
}
public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}

输出结果:

 🌵注意事项:

1.只能在非静态方法中使用

2.在子类方法中,访问父类的成员变量和方法 

🍎super和this:

super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句。

相同点:

1.都是Java中的关键字

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

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

不同点:

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

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

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

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

六、子类构造方法

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

当父类和子类都没有提供任何的构造方法时,编译器会自动添加,并且只能出现一次:

父类:

public Base(){
}

子类:

public Derived(){
super();

}

举例代码:

class Base {
    int a=1;
    int c=3;
//父类构造方法
    public Base(int a, int c) {
        this.a = a;
        this.c = c;
    }
}
class  Derived extends Base {
    int c=2;
    //子类构造方法
    public Derived(int a, int c, int c1) {
        super(a, c);//super要放第一条
        this.c = c1;
    }
}
public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived(1,2,3);
    }
}
在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行基类的构造方法,然后执行子类的构造方法,因为:子类对象中成员是有两部分组成的,基类继承下来的以及子类新增加的部分 。所以在构造子类对象时候 ,先要调用基类的构造方法,将从基类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。
🍒🍑注意:
1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的 super() 调用,即调用基类构造方法
2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3. 在子类构造方法中, super(...) 调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...) 只能在子类构造方法中出现一次,并且不能和 this 同时出现
5.super(a,c)只是帮我们把继承过来的属性进行初始化,并没有构造一个父类对象

七、再谈初始化

class Base {
 static {
     System.out.println("执行父类静态代码块");
 }
    {
        System.out.println("执行父类实例代码块");
    }
    public Base() {
        System.out.println("执行父类构造代码块");
    }
}
class  Derived extends Base {
   static {
       System.out.println("执行子类静态代码块");
   }
    {
        System.out.println("执行子类实例代码块");
    }
    public Derived() {
        System.out.println("执行子类构造代码块");
    }
}
public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived();
        Derived derived1=new Derived();
    }
}

输出结果:

 

 通过分析执行结果,可以得出以下结论:

1.父类静态代码块优先于子类静态代码块执行

2.父类实例代码块和父类构造方法紧接着执行

3.父类的实例代码块和子类构造方法紧接着执行

4.第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

八、继承方式

在java中只支持以下几种继承方式:

1.单继承

public class A{

……

}

public classB extend A{

……

}

2.多层继承

public class A{……}

public class B extends A{……}

public class C extends B{……}

 3.不同类继承同一个类

public class A{……}

public class B extends A{……}

public class C extends A{……}

 🥗注意:

Java中不支持多继承。

public class A{……}

public class B{……}

public class C extends A,B{

……

}

 在真实项目中,类的关系也可会更加复杂。但是,一般我们不希望出现超过三层的继承关系。如果继承层次太多,就需要考虑对代码进行重构。

如果想从语法上进行限制继承,就可以使用final关键字

九、final关键字

🍺final关键字可以用来修饰变量、成员方法以及类

1.修饰变量或字段,表示常量(即不能修改。有点像C语言中的const)

final int a=10;

a=20;//编译出错

 2.修饰类:表示此类无法被继承

final class Base {
}
class  Derived extends Base {
}
public class Test {
    public static void main(String[] args) {
        Derived derived=new Derived();
    }
}

编译出错:

 3.修饰方法:表示该方法不能被重写

总结

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

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

相关文章

Idea下载及配置

1、下载Vscode 1.1、官网 https://code.visualstudio.com/1.2、替换链接 将下载地址中的 az764295.vo.msecnd.net 更换为 vscode.cdn.azure.cn 使用国内的镜像服务器加速 https://vscode.cdn.azure.cn/stable/6261075646f055b99068d3688932416f2346dd3b/VSCodeUserSetup-x6…

【好文鉴赏】面试官说你回答的不够深入,怎么办?

关键词:[产品经理] [面试] 原文链接:https://coffee.pmcaff.com/article/3665424751688832/pmcaffutm_source 前言 生动,往往源于对事实的诠释; 面试官说逻辑力很强、沟通表达也很优秀,但在面试时效果并不太好&…

图片添加边框和文字怎么弄?图片编辑在线教学

大家平时在拍完照片后,会对它进行一些编辑处理吗?像我每次拍完照,都会对图片进行一些后期处理,有时也会给图片添加一些边框或者文字,美化图片并增加图片信息量。那你们平时都是怎么给图片加上边框和文字的呢&#xff1…

广和通5G AIoT模组引领亮相2022国际物联网展(IOTE),智赋行业数字化新价值

11月15-17日,2022国际物联网展(IOTE)于深圳盛大启幕,本届展会汇聚众多物联网行业大咖,共同展示并探讨物联网产业链的创新实践与成果。广和通以“5GAIoT深度融合,创新智造未来”为主题亮相现场。本次广和通展…

UI组件DevExpress ASP.NET Core v22.1亮点 - 甘特图、UI组件全新升级

DevExpress ASP.NET Web Forms Controls拥有针对Web表单(包括报表)的110种UI控件,DevExpress ASP.NET MVC Extensions是服务器端MVC扩展或客户端控件,由轻量级JavaScript小部件提供支持的70个高性能DevExpress ASP.NET Core Contr…

深入Spring 5 事务原理与源码分析【精品分享】

从一个编程式事务开始 Spring的声明式事务涉及到Bean的注入还有动态代理相关的知识,门槛会相对高一些。为了更容易理解事务,我们先从编程式事务的例子开始,逐步揭开Spring事务神秘的面纱。 //一个简单的编程式事务的例子Autowiredprivate Pl…

Linux常用工具及服务(ssh,rsync)

目录 一、SSH服务远程终端连接工具 1、SSH的登录原理 2、SSH基本用法 2.1 基本语法: 3、ssh服务认证类型 3.1 基于口令认证 3.2 基于密钥认证 4、ssh服务常见配置 4.1 常见配置 5、ssh客户端附带的远程拷贝scp命令 5.1 基本语法 二、Rsync远程同步及备份工…

k8s的接口文档——swagger-ui服务

文章目录1. 获取配置文件2. 启动swagger-ui2.1 用docker部署2.2 用docker-compose部署2.3 在k8s平台部署1. 获取配置文件 开启k8s的api临时端口 说明: 为导出k8s集群的api信息作为swagger-ui的配置文件,我们临时开一个api的临时端口该端口:只…

Qt 中设置窗体(QWidget)透明度的几种方法

Qt 中设置窗体(QWidget)透明度的几种方法 1. 设置窗体的背景色 在构造函数里添加代码,需要添加头文件qpalette或qgui QPalette pal palette(); pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); setPalette(pal); 通过设置窗体的背景色来实…

连花清瘟卖断货?近一个月解热药价格暴涨33%,销额超206万元

近日,“连花清瘟生产商以岭药业正在疯狂招短期工”的消息登上热搜,以岭药业一度涨停。此外,石家庄其他感冒类药品也迎来线上线下一同销量大涨。 为此,鲸参谋特意查询了京东平台近一个月“解热镇痛”类药品的销售数据。可以看到&am…

SpringBoot自定义banner,如何定制炫酷的banner提升项目B格?

文章目录写在前面自定义banner使用banner.txt文件使用图片手写一个bannerbanner参数在 application.properties 文件中可以配置banner其他属性banner自身参数源码分析在线生成banner写在前面 Springboot启动的时候默认是有一套自己的banner的: 我们如何自定义这个…

SpringBoot+Vue项目大学生网络教学平台的设计与实现

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版…

retrofit网络框架源码解析

App应用程序通过Retrofit 请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作。在服务器返回数据之后,OkHttp将原始的结果交给Retrofit,Retrofit根据用户的需求对结果进行解析。 一、retrofit框架网…

【Android】扩展BaseExpandableListAdpter实现ExpandableAdapter

今天分享如何扩展BaseExpandableListAdpter实现ExpandableAdapter,很简单的一个例子。 效果示例: 核心是重写BaseExpandableListAdpter,其中BaseExpandableListAdpter则分成了两部分:组和子列表,要注意的是&#xff0…

IDEA远程debug教程

IDEA远程debug教程 当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用。 JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系…

【Netty源码系列(二)】解读EventLoopGroup

【Netty源码系列文章中源码出自4.1.84.Final版本】 文章目录1. EventLoopGroup接口类2. NioEventLoopGroup创建过程2.1 Executor实现机制2.2 EventLoop对象创建(newChild()方法)本篇文章主要看一下 EventLoopGroup的源码,了解一下它的创建过程…

二、react的组件-state-props-setState

目标 理解组件和组件的创建、以及能够根据实际场景去划分合理的组件。理解并且能够灵活的应用组件中的state、props。可以使用组件去实现各种前端交互。 知识点 组件的定义:组件能够表示一块视图的结构表现以及逻辑交互,并且可以重复利用。如何创建组件…

【ROS】机械人开发四--ROS常用概念与Launch文件

机械人开发四--ROS常用概念与Launch文件一、ROS常用概念1.1 ROS 的结构1.2 ROS 话题通信1.3 海龟仿真器 仿真 例程二、Launch文件2.1 功能2.2 文件语法2.3 参数服务器2.4 节点分组与重命名标签一、ROS常用概念 1.1 ROS 的结构 ROS 中有一些很重要的基础概念:节点&…

四、ref与DOM-findDomNode-unmountComponentAtNode

目标 理解react的框架使用中,真实dom存在的意义。 使用真实dom和使用虚拟dom的场景。 灵活掌握并能够合理使用操作真实dom的方法。 知识点 react中提供了ref这个属性来获取原生的dom节点,使用方式:在虚拟dom中添加ref属性,即可…

笔试强训(三十七)

目录一、选择题二、编程题2.1 mkdir2.1.1 题目2.1.2 题解2.2 数据库连接池2.2.1 题目2.2.2 题解一、选择题 (1)下面关于源端口地址和目的端口地址的描述中,正确的是(A) A.在TCP/UDP传输段中,源端口地址和目…