面向对象2:继承

目录

2.1继承

2.2 继承的好处

2.3 权限修饰符

2.4 单继承、Object

2.5 方法重写

2.6 子类中访问成员的特点

2.7 子类中访问构造器的特点



面向对象1:静态

2.1继承

向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是因为它有三大特征,继承、封装和多态

接下来,使用继承来编写代码,注意观察继承的特点。

public class A{//公开的成员public int i;public void print1(){System.out.println("===print1===");}//私有的成员private int j;private void print2(){System.out.println("===print2===");}
}

然后,写一个B类,让B类继承A类。在继承A类的同时,B类中新增一个方法print3

public class B extends A{public void print3(){//由于i和print1是属于父类A的公有成员,在子类中可以直接被使用System.out.println(i); //正确print1(); //正确//由于j和print2是属于父类A的私有成员,在子类中不可以被使用System.out.println(j); //错误print2();}
}

接下来,我们再演示一下,创建B类对象,能否调用父类A的成员。再写一个测试类

public class Test{public static void main(String[] args){B b = new B();//父类公有成员,子类对象是可以调用的System.out.println(i); //正确b.print1();//父类私有成员,子类对象时不可以调用的System.out.println(j); //错误b.print2(); //错误}
}

来看看继承的内存原理。

子类对象实际上是由子、父类两张设计图共同创建出来的。

所以,在子类对象的空间中,既有本类的成员,也有父类的成员。但是子类只能调用父类公有的成员。

2.2 继承的好处

  • 先写一个父类 People,用来设计Teacher和Consultant公有的成员。

public class People{private String name;public String getName(){return name;}public void setName(String name){this.name=name;}
}
  • 再写两个子类Teacher继承People类,同时在子类中加上自己特有的成员。

public class Teacher extends People{private String skill; //技能public String getSkill(){return skill;}public void setSkill(String skill){this.skill=skill;}public void printInfo(){System.out.println(getName()+"具备的技能:"+skill);}
}
  • 最后再写一个测试类,再测试类中创建Teacher、Consultant对象,并调用方法。

public class Test {public static void main(String[] args) {// 目标:搞清楚继承的好处。Teacher t = new Teacher();t.setName("播仔");t.setSkill("Java、Spring");System.out.println(t.getName());System.out.println(t.getSkill());t.printInfo();}
}

执行代码,打印结果如下:

只需要记住 :继承可以提高代码的复用性  

2.3 权限修饰符

在刚才使用继承编写的代码中我们有用到两个权限修饰符,一个是public(公有的)、一个是private(私有的),实际上还有两个权限修饰符,一个是protected(受保护的)、一个是缺省的(不写任何修饰符)。

什么是权限修饰符呢?

权限修饰符是用来限制类的成员(成员变量、成员方法、构造器...)能够被访问的范围。

每一种权限修饰符能够被访问的范围如下  

2.4 单继承、Object

Java语言只支持单继承,不支持多继承,但是可以多层继承

2.5 方法重写

什么是方法重写

当子类觉得父类方法不好用,或者无法满足父类需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。

 注意:重写后,方法的访问遵循就近原则。下面我们看一个代码演示

写一个A类作为父类,定义两个方法print1和print2

public class A {public void print1(){System.out.println("111");}
​public void print2(int a, int b){System.out.println("111111");}
}

再写一个B类作为A类的子类,重写print1和print2方法。

public class B extends A{// 方法重写@Override // 安全,可读性好public void print1(){System.out.println("666");}
​
​// 方法重写@Overridepublic void print2(int a, int b){System.out.println("666666");}
}

接下来,在测试类中创建B类对象,调用方法

public class Test {public static void main(String[] args) {// 目标:认识方法重写,掌握方法重写的常见应用场景。B b =  new B();b.print1();b.print2(2, 3);}
}

执行代码,我们发现真正执行的是B类中的print1和print2方法

 

知道什么是方法重写之后,还有一些注意事项,需要和大家分享一下。

- 1.重写的方法上面,可以加一个注解@Override,用于标注这个方法是复写的父类方法
- 2.子类复写父类方法时,访问权限必须大于或者等于父类方法的权限public > protected > 缺省
- 3. 重写的方法返回值类型,必须与被重写的方法返回值类型一样,或者范围更小
- 4. 私有方法、静态方法不能被重写,如果重写会报错。

关于这些注意事项( 总结起来就8个字:声明不变,重新实现

方法重写的应用场景

方法重写的应用场景之一就是:子类重写Object的toString()方法,以便返回对象的内容。

2.6 子类中访问成员的特点

原则:在子类中访问其他成员(成员变量、成员方法),是依据就近原则的  

2.7 子类中访问构造器的特点

子类中访问构造器的语法规则

  • 首先,子类全部构造器,都会先调用父类构造器,再执行自己。

    执行顺序,如下图按照① ② ③ 步骤执行:

子类访问构造器的应用场景

  • 如果不想使用默认的super()方式调用父类构造器,还可以手动使用super(参数)调用父类有参数构造器。

时候我们也需要访问自己类的构造器。语法如下

this(): 调用本类的空参数构造器
this(参数): 调用本类有参数的构造器

 this和super的用法在总结一下 访问本类成员:
    this.成员变量    //访问本类成员变量
    this.成员方法    //调用本类成员方法
    this()           //调用本类空参数构造器
    this(参数)      //调用本类有参数构造器
    
访问父类成员:
    super.成员变量    //访问父类成员变量
    super.成员方法    //调用父类成员方法
    super()           //调用父类空参数构造器
    super(参数)      //调用父类有参数构造器
    
注意:this和super访问构造方法,只能用到构造方法的第一句,否则会报错。

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

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

相关文章

Qt 软件封装与打包

1. Qt 软件封装 1、首先以 release 方式进行编译,将生成的 CloudOne.exe 文件复制到 D:\CloudApp 文件夹(自行创建) 2、打开 Qt 命令行工具(如下图所示),并按顺序输入如下指令 cd D:\CloudApp windeployq…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域,从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景,比如多个进程需要…

【JavaEE】----SpringBoot的创建和使用

目录 1.Spring与SpringBoot的区别(面试) 2. SpringBoot的创建 3.SpringBoot创建时的问题及解决 4.SpringBoot的目录学习 5.创建一个SpringBoot 项目并且启动 1.Spring与SpringBoot的区别(面试) Spring 的诞⽣是为了简化 Java 程…

2023年全国职业院校技能大赛软件测试赛题第5套

2023年全国职业院校技能大赛 软件测试赛题第5套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

如何生成狗血短剧

如何生成狗血短剧 狗血短剧剧本将上述剧本转成对话 狗血短剧剧本 标题:《爱的轮回》 类型:现代都市爱情短剧 角色: 1. 林晓雪 - 女,25岁,职场小白,善良单纯 2. 陆子轩 - 男,28岁,公…

内网穿透 | 推荐两个免费的内网穿透工具

目录 1、简介 2、Ngrok 2.1、下载安装 2.2、运行 2.3、固定域名 2.4、配置多服务 3、cpolar 3.1、下载安装 3.2、运行 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应…

【每日一题】尾随零

尾随零 目录 思路:代码实现: 思路: 最开始看到这题就只想到规规矩矩的做题,先算阶乘在算0,后来提交时总是提示溢出,不死心,改来改去最后没招了。 后来看题解才知道要看5的个数! …

【AI视野·今日CV 计算机视觉论文速览 291期】Wed, 17 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Wed, 17 Jan 2024 Totally 182 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers MultiPLY: A Multisensory Object-Centric Embodied Large Language Model in 3D World Authors Yining Hong, Zishuo Zhe…

【每日一题】牛客网——链表的回文结构

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果,视频制作者可能会采用动态水印的方式,让其他人难以盗取视频使用。动态水印的添加,需要应用到运动路径功能。接下来,本文会教大家动态水印怎么加,怎么去除动态水印的相关内容。感兴趣的小…

对进程与线程的理解

目录 1、进程/任务(Process/Task) 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理(Memory Manage) 4、线程(Thread)…

掌握C语言文件操作:从入门到精通的完整指南!

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&a…