掌握java中继承

目录

1.概念:

2.使用:

3.super关键字

4.子类构造方法

5.super和this关键字

6.初始化时代码块的执行顺序

7.继承的方式

8.final关键字


1.概念:

是面向对象程序设计代码可以重复使用的重要手段,允许程序员在保持原有类特性的基础上进行扩展,增加新功能,产生新类成为派生类/子类;被继承的类叫父类/基类

那么为什么会有继承呢?

假如我们要定义好多的类,都是描述动物的类,这些类有共同的特点,成员变量都含有动物的名字,年龄;如果每写一个类都要这样定义的话未免有点过于麻烦了;我们可以定义一个父类,包含年龄,名字;以后定义的子类只要继承它就好了;

继承解决的问题是:共性抽取,实现代码复用,然后实现多态。


2.使用:

继承要使用关键字:extends

public class Animal{String name;int age;
public void eat(){    System.out.println(name + "正在吃饭");
}
public void sleep(){System.out.println(name + "正在睡觉");}
} 
// Dog.java
//Dog继承Animal
public class Dog extends Animal{//此时Dog中也有 name;age成员变量,但未显示;void bark(){System.out.println(name + "汪汪汪~~~");}
}

注意:继承后的子类必须要有自己的成员变量或者方法,不然与父类一模一样就没必要继承了


3.super关键字

父类和子类中可能出相同的成员变量或方法,如果想在子类中访问父类成员变量是很难的,java中提供了static关键字;

作用:在子类方法中访问父类成员变量或方法

注意:只能在静态方法中使用,在子类方法中访问父类变量和方法

class testA{public int a = 100;public int b = 200;
}
class testB extends testA{public int a = 10;public int b = 20;
}public class Test {public static void main(String[] args) {testB testB = new testB();System.out.println(testB.a);System.out.println(testB.b);}
}

输出结果 10 20;

子类继承父类之后,在实例化子类对象的时候要想帮助父类进行构造,初始化父类成员

规则:如果子类与父类有同名的成员变量,优先访问子类成员变量,若子类没有再访问父类,如果父类再没有就报错。

那么如何访问父类中的成员变量呢?

可以在子类中再定义一个方法,用关键字super,因为super只能在子类定义的方法中访问父类变量

class testA{public int a = 100;public int b = 200;
}
class testB extends testA{public int a=10;public int b=20;public void method(){System.out.println(super.a+" "+super.b);}
}public class Test {public static void main(String[] args) {testB testB = new testB();System.out.print(testB.a +" ");System.out.println(testB.b);testB.method();}
}
结果:10 20100 200

访问成员方法也是一个道理,但是如果方法的重载,根据参数列表的不同可以不同访问,但是如果构成方法的重写,就要通过super关键字来访问了

class testA{public void methodA(){System.out.println("testA:methodA()");}public void methodB(){System.out.println("testA:methodB()");}
}
class testB extends testA{int a = 10;public void methodA(int a){System.out.println(this.a);}public void methodB(){System.out.println("testB:methodB()");}public void methodC(){super.methodB();}
}public class Test {public static void main(String[] args) {testB test = new testB();test.methodA();test.methodA(10);test.methodB();test.methodC();}
}
结果:
testA:methodA()
10
testB:methodB()
testA:methodB()
4.子类构造方法

子类对象构造时,先执行基类方法在调用子类构造方法

class Base{public Base(){System.out.println("父类构造方法");}
}
class Drev extends Base{public Drev(){System.out.println("子类构造方法");}
}
public class Tets {public static void main(String[] args) {Drev drev = new Drev();}
}结果:
父类构造方法
子类构造方法

说明:在子类方法中,并没有写构造父类方法的代码,为什么会构造子类对象的时候会先调用父类构造代码呢?

因为子类中有两部分代码,一种是继承父类的,还有一种是自己的构造代码,在构造对象时会先调用父类构造方法,将子类中从父类那继承的成员构造完整,再调用子类自己的构造方法将子类的成员初始化完整;

注意:

1.若父类显式定义无参时或者默认构造方法时,子类构造方法中第一行会默认有super(),随后调用子类构造方法;

2.若父类构造方法有参数,此时用户需要为子类显示构造方法,并在子类构造方法中选择合适的父类构造方法调用

3.在子类构造方法中,super()调用父类构造方法时,super()必须是子类构造方法的第一条语句。

4.super()在子类构造方法中只能出现一次,而且不能和this同时出现


5.super和this关键字

super和this都可在成员方法中访问成员变量或成员方法,但有什么区别呢?

class Base1{public int a = 1;public int b = 2;
}
class Der extends Base1{public int c = 3;public int a = 10;public void test(){System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(super.a);System.out.println(this.a);}
}
public class Test2 {public static void main(String[] args) {Der der = new Der();der.test();}
}
结果:
10
2
3
1
10

这个例子可以清晰看到:当子类成员与父类成员有相同名字的时候,会优先访问子类成员变量,如果要可以访问父类成员,需要加上super,访问子类需要用this

相同点:

1.都是关键字

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

3.在构造方法调用时,只能是构造方法的第一条语句,不能同时存在

不同点:

1.this是对当前对象的引用,super是对从父类继承下来的成员的引用

2.非静态成员方法中,super是对父类成员方法的引用,this是对本类成员方法的引用

3.this和super不能同时在构造方法中出现

4.构造方法中一定存在super,不写也有。this不写则没有


6.初始化时代码块的执行顺序

1.实例化代码块和静态代码块,在没有继承时的顺序如下

class Person{public String  name;public int age;public Person(String name,int age){this.age=age;this.name=name;System.out.println("构造方法执行");}//实例化代码块{System.out.println("实例化代码块");}//静态代码块static {System.out.println("静态代码块");}
}
public class Test1 {public static void main(String[] args) {Person person = new Person("小明",12);}
}结果:
静态代码块
实例化代码块
构造方法执行

在没有继承关系时,静态代码块>实例化代码块>构造方法

1.静态代码块只执行一次,在类加载的时候进行。

2.只有对象创建的时候执行实例化代码,实例化代码完成后会调用构造函数

在继承时,静态代码与实例化代码的关系?

class Person{public String  name;public int age;public Person(String name,int age){this.age=age;this.name=name;System.out.println("构造方法执行");}//实例化代码块{System.out.println("实例化代码块");}//静态代码块static {System.out.println("静态代码块");}
}
class Student extends Person{public Student(String name,int age){super(name,age);System.out.println("Student的构造方法");}{System.out.println("Student的实例化代码");}static {System.out.println("Studentd的静态代码");}
}
public class Test1 {public static void main(String[] args) {Student student = new Student("小红",15);}
}
结果
静态代码块
Studentd的静态代码
实例化代码块
构造方法执行
Student的实例化代码
Student的构造方法

规则:

1.父类静态代码块先于子类静态代码块执行,且最早执行

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

3.然后是子类的实例化代码和它的构造方法

4.第二次实例化对象的时候,静态代码块不会再执行


7.继承的方式

继承有多层继承,单继承,不同类继承同一个类

8.final关键字

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进行继

平时用的String类型就是fianl修饰的,不能被修改

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

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

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

相关文章

git入门到精通

第3章 Git常用命令 3.1 设置用户签名 3.2 初始化本地库 3.3 查看本地 状态 3.3.1 首次查看(工作区没有任何文件) 3.3.2 新增文件(hello.txt) 3.3.3 再次查者(检測到末追踪的文件) 3.4添加暫存区 3…

java常用排序算法——冒泡排序,选择排序概述

前言: 开始接触算法了,记录下心得。打好基础,daydayup! 算法 算法是指解决某个实际问题的过程和方法 排序算法 排序算法指给混乱数组排序的算法。常见的有:冒泡排序,选择排序 冒泡排序: 冒泡排序指在数组…

python界面开发 - Label 提示框

文章目录 1. Label 提示框1.1. 显示文本1.2. 修改Label的文本1.2.1. 方式1:通过label.config()1.2.2. 方式2:通过 label["text"] 属性进行修改 1.3. 设置背景图片 2. Tkinter 开发3. python图形界面开发3.1. Python图形界面开发——Tkinter3.2…

简单认识Linux

今天带大家简单认识一下Linux,它和我们日常用的Windows有什么不同呢? Linux介绍 Linux内核&发行版 Linux内核版本 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与…

基于java+springboot+vue实现的宠物健康咨询系统(文末源码+Lw)23-206

摘 要 本宠物健康咨询系统分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理公告信息以及宠物健康知识信息,能够与用户进行相互交流等操作,用户可以查看宠物健康知识信息,可以查看公告以及查看…

说说flexbox(弹性盒布局模型)及适用场景?

文章目录 一、是什么二、属性flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-contentorderflex-growflex-basisflexalign-self 三、应用场景参考文献 一、是什么 Flexible Box 简称 flex,意为”弹性布局”,可以简便、完整、响应式地…

【Bugs】java: 错误: 不支持发行版本 xx

文章目录 报错场景:报错原因:解决方法: 报错场景: IDEA运行Java项目报错,点击运行之后,IDEA在编译代码的时候就出现报错: 报错类型一:java: 错误: 不支持发行版本 21报错类型二&am…

python72-Python的函数入门,为函数提供文档

之前介绍过可以使用Python内置的help()函数查看其他函数的帮助文档,我们也经常通过help()函数查看指定函数的帮助信息,这对于Python开发者来说非常重要。 我们还可以为函数编写说明文档一只要把一段字符串放在函数声明之后、函数体之前,这段字符串将被作…

SAP金江、阎韶华、雷凡将出席“第四届ISIG-RPA、低代码、流程挖掘三大峰会

3月16日,第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导,企智未来科技(RPA中国、AIGC开放社区、LowCode低码时代)主办。大会旨在聚合每一位产业成员的力量,深入探索R…

【C语言】InfiniBand驱动mlx4_init和mlx4_cleanup

一、中文注释 Linux内核模块的初始化和清理过程,针对一个称为mlx4的网络设备驱动。以下是代码的逐行中文注释: static int __init mlx4_init(void) {int ret;if (mlx4_verify_params())return -EINVAL; // 检查设备参数是否有效,无效则返回…

如何做好【沟通】管理

目录 管理的定义 管理的四大职能: 四共团队: 领导力: 沟通的四种类型听、说、读、写(计划、报告) 沟通四原则 思维框架:结构树报告 管理的定义 彼得.德鲁克:管理通过他人去完成任务的学…

【Neo4j系列】Neo4j之CQL语句和函数介绍

本文将对Neo4j中的CQL语句和CQL函数进行详细介绍。 作者:后端小肥肠 目录 1. 前言 2. CQL语句 2.1. CQL简介 2.2. CREATE命令 2.3. MATCH命令 2.4. RETURN命令 2.5. MATCH和RETURN 2.6. CREATEMATCHRETURN命令 2.7. 关系基础 2.8. CREATE创建标签 2.9. WH…

面试高频 牛群的位置排序---搜索插入位置

题目描述 农场里有一群牛,每头牛都有一个标签值,这些标签值组成一个升序排列的数组 labels。现在农场主想知道,给定一个目标标签值 target,如果在牛群中存在这个标签,返回它的位置,如果不存在,…

vscode 配置opengl (glut), lib链接可参考

这里假定你已经配置好基础的vscode c环境 json介绍 这里其实主要配置的3种json, vscode其实就是通过launch.json和tasks.json来自动生成指令的 launch.json 这个用于启动程序用的,但是由于其可以指定preLaunchTask-即在启动之前需要做什么事情,所以这…

白嫖阿里云DSW做AI绘画的几点技巧(老鸟参考,新手免入)

白嫖方法就不说了,选择A10显卡或者V100显卡,能画些图,还能用三个月。可以感受一下顶级显卡的速度,当生产力工具肯定是不行的,毕竟5000个使用量用起来很快的。 问题一: 镜像版本选择-官方提供二个镜像&…

Unity笔记:C#基础(1)

杂项 虚函数 CSDN - C虚函数详解 cnblog - C#中的虚函数virtual 常量池与new 在C#中,string是不可变的,这意味着对string对象的操作通常会返回一个新的string对象,而不会修改原始的string对象。因此,几乎所有涉及更改string内…

鞋服品牌怎样合理把控订货深度和宽度

在鞋服品牌的运营管理中,订货深度和宽度是两个至关重要的概念。订货深度指的是某一款式或规格的产品数量,而订货宽度则代表品牌所涵盖的产品种类和款式。合理把控订货深度和宽度对于品牌的库存管理、销售情况以及顾客满意度都有着深远的影响。本文将探讨…

【牛客】VL74 异步复位同步释放

描述 题目描述: 请使用异步复位同步释放来将输入数据a存储到寄存器中,并画图说明异步复位同步释放的机制原理 信号示意图: clk为时钟 rst_n为低电平复位 d信号输入 dout信号输出 波形示意图: 输入描述: clk为时…

许多人可能还不了解这个信息差:美赛的第一批 EI 已经录用,不用再犹豫啦

格局打开,美赛论文转学术论文发表 🚀🚀 各位同学,美赛已经结束了一段时间,你们是否还在焦急地等待最终成绩的公布?一些有远见的同学已经提前收到了一份喜讯:他们的美赛论文已被转化为学术论文并…

CPU设计实战-加载和存储指令(2)

目录 一 ll和sc指令说明 二 ll和sc指令的实现 1 llbit寄存器 2 译码阶段 3 访存阶段 4 Load相关问题 5 流水线在取指阶段暂停 本章介绍两个比较特殊的加载存储指令ll和sc,这两个指令的存在用于实现信号量机制。 信号量机制:在多线程中为了保证某个…