掌握java中继承

news2025/1/15 16:28:54

目录

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 20
     100 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.coloradmin.cn/o/1502210.html

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

相关文章

java注释的详尽解析

一、什么是注解 (1).注解的作用 ①:注解一般用于对程序的说明,就像注释一样,但是区别是注释是给人看的,但是注解是给程序看的。 ②:让编译器进行编译检查的作用,比如下边这个Override注解是重写的意思&am…

漏洞复现-蓝凌LandrayOA系列

蓝凌OA系列 🔪 是否利用过 优先级从高到低 发现日期从近到远 公司团队名_产品名_大版本号_特定小版本号_接口文件名_漏洞类型发现日期.载荷格式LandrayOA_Custom_SSRF_JNDI漏洞 LandrayOA_sysSearchMain_Rce漏洞 LandrayOA_Custom_FileRead漏洞

成功解决TypeError: ‘str‘ object does not support item assignment

成功解决TypeError: ‘str’ object does not support item assignment 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 …

Linux系统安装及简单操作

目录 一、Linux系统安装 二、Linux系统启动 三、Linux系统本地登录 四、Linux系统操作方式 五、Linux的七种运行级别(runlevel) 六、shell 七、命令 一、Linux系统安装 场景1:直接通过光盘安装到硬件上(方法和Windows安装…

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。

一篇论文回顾 Sora 文生视频技术的背景、技术和应用。 追赶 Sora,成为了很多科技公司当下阶段的新目标。研究者们好奇的是:Sora 是如何被 OpenAI 发掘出来的?未来又有哪些演进和应用方向? Sora 的技术报告披露了一些技术细节&…

反编译修改halcondonet.dll的名字

安装ILSpy 打开halcondonet.dll 用VS打开 点击生成Dll会提示很多错误 然后点击错误,所有点一遍,错误基本会自己消失, 还需要把.net改为4.5.2 然后生成成功 把名称改为mysql5dotnet 找到HalconAPI类,将里面的所有字符串“hal…

linux下改变主机名,永久生效的方法

hostnamectl set-hostname test 例子 #支持大写必须就要这样写 hostnamectl set-hostname 名称 --static

LCR 164. 破解闯关密码

解题思路&#xff1a; 贪心 class Solution {public String crackPassword(int[] password) {String[] strs new String[password.length];for(int i 0; i < password.length; i)strs[i] String.valueOf(password[i]);Arrays.sort(strs, (x, y) -> (x y).compareTo(…

全球参考系统(WRS)概述及常用工具汇总

1986年&#xff0c;美国航空航天局&#xff08;NASA&#xff09;定义了一系列数据处理"级别"&#xff0c;用以区分源于其地球观测系统&#xff08;EOS&#xff09;卫星获取的影像生成的标准数据产品。给定任何数据产品&#xff0c;我们可以根据其级别来判断其在生产过…

Docker下Jenkins打包java项目并部署

docker 构建Jenkins sudo docker run --namezen_haslett --userjenkins --privilegedtrue --volume/home/cyf/server/jenkins/jenkins_home:/var/jenkins_home -v /usr/lib/jvm/java-17-openjdk-amd64:/usr/lib/jvm/java-17-openjdk-amd64 -v /usr/lib/maven/apache-mav…

Qt初识 - 编辑框 | 按钮 | 命名规范

目录 一、编辑框 (一) Designer中的编辑框 (二) Code中的编辑框 二、按钮 (一) Designer中的按钮 (二) Code中的按钮 三、Qt中的命名规范 一、编辑框 (一) Designer中的编辑框 进入到Designer界面中 找到Input Widgets目录 找到该目录下的 将这个控件拉出去 双击就可…

AntV L7的符号地图

本案例使用L7库和Mapbox GL JS添加符号地图。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 添加符号6. 创建点数据7. 创建点图层8. 演示效果9. 代码实现 1. 引入 CDN 链接 <script src"https://unpkg.com/antv/l7"></script> <scr…

数据中台:数字中国战略关键技术设施

文章目录 每日一句正能量前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书购买链接赠书活动 每日一句正能量 人生之…

算法学习07:KMP算法

算法学习07&#xff1a;KMP算法 文章目录 算法学习07&#xff1a;KMP算法前言一、KMP算法1.kmp匹配过程&#xff1a;2.求解next数组&#xff08;kmp算法重点&#xff09;3.代码总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff1a; 一、KMP算法 1.kmp匹配过程&…

集合框架(一)List系列集合

特点 有序&#xff0c;可重复&#xff0c;有索引。 LIst集合的特有方法 /** 目标&#xff1a;掌握List系列集合的特点&#xff0c;以及其提供的特有方法* */import java.util.ArrayList; import java.util.List;public class ListTest1 {public static void main(String[] arg…

第十篇 - 如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市​​​​​​​。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先…

CorelDRAW2024最新版本号25.0.0.230安装包下载

CorelDRAW2024是一款专业的平面设计软件&#xff0c;以矢量图形编辑与排版为核心功能。它凭借对高级操作系统的支持、多监视器查看和4K显示屏的兼容性&#xff0c;使得无论是初始用户还是图形专家&#xff0c;都能自信快速地交付专业级结果。 CorelDRAW 2024的主要特点包括其直…

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

小程序学习

一、第一天 1、小程序体验 2、注册账号 小程序 (qq.com) 3、开发工具下载 下载 / 稳定版更新日志 (qq.com) 4、目录结构 "navigationBarBackgroundColor": "#00b26a" 配置头部背景色 4、wxml模板介绍 5、wxss 6、js文件 7、宿主环境 1、通信主体 2…

开发知识点-Apache Struts2框架

Apache Struts2 介绍S2-001S2CVE-2023-22530 介绍 Apache Struts2是一个基于MVC&#xff08;模型-视图-控制器&#xff09;设计模式的Web应用程序框架&#xff0c;它是Apache旗下的一个开源项目&#xff0c;并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础…