掌握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…

新手如何练习SQL?|掌握

对于新手想要练习SQL语句,可以从以下几个方面入手: 1. 建立理论基础 首先深入理解数据库的核心组件,包括数据库本身、其内部的各个表、表中的字段及其对应的数据类型(如字符串、整型、日期等),以及数据库…

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

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

python基础7_数据类型

在生活中举例 人是不是分为黑人,白人,黄种人(人的类型) 穿的衣服,休闲服装,修身的服装,运动服, 工装服,(衣服的类型) 同理,变量也有数据类型 那么怎么查看变量的数据类型呢? name "莫扎特" print(type(name)) 看看变量的几个常用的数据类型 int , float, boo…

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…

C++从零开始的打怪升级之路(day45)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉树的题目 1.根据二叉树创建字符串 606. 根…

简单认识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开发者来说非常重要。 我们还可以为函数编写说明文档一只要把一段字符串放在函数声明之后、函数体之前,这段字符串将被作…

Avue实现选择下拉框的多种方式

目录 前言1. 实战Demo2. 基本内容 前言 对应的拓展知识推荐阅读:【vue】avue-crud表单属性配置(表格以及列) 本文主要补充实战遇到的问题以及优化的方式 1. 实战Demo 了解基础知识先从Demo入手! 获取数据库的内容&#xff0c…

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; // 检查设备参数是否有效,无效则返回…

如何做好【沟通】管理

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

leetcode:反转链表II 和k个一组反转链表的C++实现

反转链表II 问题描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *…

PySide6实现证件照制作程序

目录 一:实现思路 二:代码实现 三:完整代码和界面 一:实现思路 要实现证件照制作,需要一个应用窗口,窗口里需要一个选择图片的按钮,选择图片需要展示图片在预览区。同时可能选择的图片,尺寸不符合规范,需要美化图片设置为设置我们处理的图片尺寸。需要添加一个美化…

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

本文将对Neo4j中的CQL语句和CQL函数进行详细介绍。 作者&#xff1a;后端小肥肠 目录 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…

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

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

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

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