java基础面试:继承、final关键字、抽象类、接口

news2024/11/16 13:50:41

继承

  • 子类能继承父类的非私有成员变量和成员方法。

  • 继承后子类的对象由子类与父类共同组成,每次new出来的对象都是由父类与子类中的所有成员共同组成,所谓的父类中的private无法被继承是指无法访问private修饰的成员,并不是private修饰的成员不存在,就如同单独的一个类中同样无法通过对象去访问它的私有成员

虽然private修饰的父类的私有成员无法直接通过.来访问,但是父类的私有变量同样会在子类对象所存的地址对应的堆内存中开辟空间,可以通过父类方法中的set和get方法来访问

调用父类的public方法时,通过地址找到堆内存中类的地址,再通过类的地址找到子类,然后通过子类找到父类

访问修饰符

在这里插入图片描述project类型:是可以在任意包下继承父类的子类里访问,不是子类对象可以访问

单继承

  • java是单继承的:一个子类只能继承一个父类,但是一个父类可以被多个子类继承
  • A继承了父类B,就不能再继承其他的父类,但是父类B还可以被C继承
  • java不支持多继承,但是支持多层继承,如:A继承B,B继承C

Object

  • Object类是所有类的祖宗,所有类都是Object类的子类或子孙类

方法重写

概念

    当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称,参数列表均与父类一样的方法来覆盖父类的方法

注意事项

  •     重写后,方法的访问遵循就近原则
  •     使用Override注解表示重写
  •     子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限(public>protected>缺省)。
  •     重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
  •     私有方法、静态方法不能被重写

子类中访问其它成员的特点

  •     在子类方法中访问成员变量和成员方法时,按照就近原则
  •         子类方法中访问成员变量优先级:局部变量 > 子类成员变量 > 父类成员变量
  •         子类方法中调用重写的方法,会自动调用子类中重写后的
  •         如果想访问父类成员,需要用super关键字
  •         如果想访问子类成员,需要用this关键字
     
子类构造器的特点
  • 子类的全部构造器,会先默认调用父类的无参构造器,在执行自己的构造器

  • 如果父类没有无参构造器,则必须在子类构造器中显式调用父类的有参构造器

子类构造器调用父类构造器的常用应用场景
  • 需要对父类和子类的成员变量同时进行初始化时

final

final关键字可以修饰类、方法和变量
  • 修饰类:该类被称为最终类,特点是不能被继承了。

    • 一般在工具类中使用
  • 修饰方法:该方法被称为最终方法,特点是不能被重写了。

  • 修饰变量:该变量只能被赋值一次。(必须在初始化时赋值)

  • final可以用来修饰局部变量和成员变量(实例成员变量和静态成员变量)

  • final修饰基本类型变量时,变量存储的数据不能被改变

  • final修饰引用类型的变量时,变量存储的地址不能变,但是地址指向的对象的内容可以改变

常量
  • 概念
    • 使用static final修饰的已经初始化的成员变量
  • 作用
    • 通常用于记录系统的配置信息
  • 命名规范
    • 使用大写英文单词,多个单词使用下划线连接起来
  • 使用常量记录系统配置信息的优势
    • 代码可读性更好
    • 可维护性更好
  • 执行原理
    • 程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接用字面量的性能是一样的。也就是说不会影响性能,这些常量不会在运行时才找值,而是在编译后就将所有常量直接替换成需要的字面量

抽象类abstract

抽象类常见应用场景
  • 模板方法设计模式
    • 解决方法中存在部分重复代码的问题
  • 写法
    • 定义一个抽象类
    • 在类中写两个方法
      • 一个为模板方法:将相同代码放入
        • 最好使用final来修饰模板方法
      • 一个为抽象方法:将具体实现交给子类

接口

  • 使用interface定义接口
  • 接口不能创建对象
  • 接口中只能由属性和抽象方法
    •     属性默认为常量,默认使用public static final修饰
    •     方法默认是抽象方法,默认使用public abstract修饰
  • 接口需要被类使用implements实现,实现接口的类叫实现类
  • 一个实现类可以实现多个接口,但是必须要重写所有接口的抽象方法,否则要将实现类定义为抽象类
接口的好处
  • 弥补了类单继承的不足,一个类同时可以实现多个接口。

  • 让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现。

JDK8之后接口中新增的三种方法
  • 默认方法,使用default修饰,可以被重写,但没必要
  • 私有方法,使用private修饰,只能在接口内部调用
  • 静态方法:使用static修饰

新增的三种方法的好处

  •     增加了接口的能力,更便于项目的扩展和使用
  •     在实际开发中,如果有100个类实现了某一个接口,那么当该接口需要新增一个功能时,对应的100个实现类都需要重写该新增的方法,那么工作量会很大,而现在只要使用新增的三种方法则只需要操作接口即可,实现类会自动继承新增的默认方法,也可通过接口直接调用新增的静态方法
//接口
public interface A {
    /*
    * 接口中的默认方法(实例方法)
    * 1. 必须使用default关键字修饰,默认被public修饰
    * 2. 接口中的默认方法,可以通过接口的实现类对象,直接调用
    * 3. 接口中的默认方法,也可以被接口的实现类进行覆盖重写
    */
    default void method1(){
        System.out.println("A接口的默认方法");
        method2();
    }

    /*
    * 接口中的私有方法(实例方法)
    * 1. 必须使用private关键字修饰
    * 2. 只能在接口中被调用
    * 3. JDK9之后才有私有方法,可以被接口中的默认方法或者静态方法调用
    */
    private void method2() {
        System.out.println("A接口的私有方法");
    }

    /*
    * 接口中的静态方法(类方法)
    * 1. 必须使用static关键字修饰,默认被public修饰
    * 2. 接口中的静态方法,可以通过接口名直接调用
    */
    static void method3(){
        System.out.println("A接口的静态方法");
    }
}
//实现类
public class B implements A{
}
//测试类
public class Test {
    public static void main(String[] args) {
        A a = new B();
        a.method1();
        A.method3();
    }
}
/*
result:
        A接口的默认方法
        A接口的私有方法
        A接口的静态方法
*/

接口的多继承

一个接口可以继承多个接口

好处

  • 便于实现类去实现接口

    • 比如A接口继承了B和C接口,那么实现类只需要实现A接口,就可以实现A,B,C三个接口,此时实现类必须重写A,B,C三个接口中的全部方法

接口其他注意事项
  • 一个接口继承多个接口,如果多个接口中存在方法签名不一致,则此时不支持多继承。

    • 此时当前接口不知道应该继承哪个方法
  • 一个接口继承多个接口,如果多个接口中存在方法签名一致,则此时只需要重写一次即可,支持多继承

//一个接口继承多个接口,如果多个接口中存在方法签名不一致,则此时不支持多继承。
interface D{
    void test();
}
interface E{
    String test();
}
//会报错,无法继承
interface F extends D,E{
}
//一个接口继承多个接口,如果多个接口中存在方法签名一致,则此时只需要重写一次即可,支持多继承
public class Test1 implements C{
    @Override
    public void test() {
        System.out.println("test");
    }
    
}
interface A{
    void test();
}
interface B{
    void test();
}
interface C extends A,B{

}

一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。

//一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
public class Test3 {
    public static void main(String[] args) {
        T3 t3 = new T3();
        t3.m1();//没有重写的情况下,优先使用父类的方法
    }
}

class T1 {
    public void m1() {
        System.out.println("T1.m1");
    }
}
interface T2 {
    default void m1() {
        System.out.println("T2.m1");
    }
}
class T3 extends T1 implements T2 {
}
/*
result:
		T1.m1	
*/

一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

//一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
public class Test4 {
    public static void main(String[] args) {
        C3 c3 = new C3();
        c3.hi();
    }
}
interface C1{
    void hi();
}
interface C2{
    void hi();
}
class C3 implements C1,C2{
    @Override
    public void hi() {
        System.out.println("hi");
    }
}

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

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

相关文章

走进API,了解数字化转型时代应用新宠

现今,国家正全面推进各行业数字化转型进程,“十四五”规划和2035年远景目标纲要明确提出“加快数字化发展”“建设数字中国”要求。近年来,随着数字化时代的来临,加之疫情的催生,已有越来越多的企业投入到数字化转型的…

写组件的过程中没写过的vue3写法

这是我写的组件, 父组件代码: 子组件代码: 首先遇到的问题是,我希望点击draw的确定按钮显示dialog弹框,发现不能在dialog弹框中去定义true和false,要在外部传进去,所以我注释了子组件中的const hideOrshowItem ref(false)代码, 然后子文件中用的所有的hideOrshowItem就都报错…

2023年四川省网络与信息安全技能大赛初赛 个人赛 Writeup

文章目录 WebPHPs Endingweb-game-1-1can_you_getshell Pwnbabyshell Reversepacked MiscedocneBaby_TCP Web PHP’s Ending 反序列化、eval截断、无参数RCE <?php// error_reporting(0);// highlight_file(__FILE__);class saday{public $reason"things dont work…

如何借助边缘智能网关打造智慧城市便民驿站

智慧城市驿站是一类提供多样化便利服务的新型智能公共设施&#xff0c;通过融合物联网技术、边缘智能技术、新能源技术等&#xff0c;为城市居民整合提供休闲、购物、卫生、广告、安全等公共服务&#xff0c;进一步提升日常生活体验。本篇就为大家介绍如何基于边缘智能网关&…

React 路由总结 react-router-dom6+react-router-dom5

开题 单页面应用和多页面应用 SPA&#xff1a;单页面应用程序&#xff0c;整个应用中只有一个页面(index.html) MPA&#xff1a;多页面应用程序&#xff0c;整个应用中有很多页面(*.html) react路由 现在的前端应用大多都是SPA单页面应用程序&#xff0c;也就是一个HTML页面的…

C++ 与 Lua 数据交互载体——栈

一、栈 Lua 和 C 之间的通讯主要组件是无处不在的虚拟栈&#xff0c;两者间的数据交换都是通过这个栈进行。 栈中可以保存 Lua 任意类型的值。 1、Lua 和 C 之间的数据交互存在的差异 Lua 是动态类型&#xff0c;C 是静态类型&#xff0c;两者不匹配Lua 是自动内存管理&…

【周末闲谈】VR新视界,“眼”见未来

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言虚拟现实(VR)技术虚拟现实技术的原理虚拟现实技术发…

v-model表单数据双向绑定-表单提交示例

示例如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>v-model表单数据双向绑定<…

【Note】CNN与现代卷积神经网络part3(附PyTorch代码)

文章目录 2 现代卷积神经网络2.1 批量规范化2.1.1 训练深层网络2.1.2 批量规范化层2.1.2.1 全连接层2.1.2.2 卷积层2.1.2.3 预测过程中的批量规范化 2.1.3 从零实现2.1.4 使用批量规范化层的 LeNet2.1.5 简明实现2.1.6 controversies&#xff08;争议&#xff09;2.1.7 Summary…

YOLOv7改进:新机制,扩展DCNv3,基于DCNv2优化 | CVPR2023 InternImage

💡💡💡本文属于原创独家改进:DCNv3优势:1) 共享投射权重;2) 引入多组机制;3)采样点调制标量归一化; DCNv3 | 亲测在多个数据集实现暴力涨点; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOL…

Flink学习之旅:(一)Flink部署安装

1.本地搭建 1.1.下载Flink 进入Flink官网&#xff0c;点击Downloads 往下滑动就可以看到 Flink 的所有版本了&#xff0c;看自己需要什么版本点击下载即可。 1.2.上传解压 上传至服务器&#xff0c;进行解压 tar -zxvf flink-1.17.1-bin-scala_2.12.tgz -C ../module/ 1.3.启…

随机专享记录第一话 -- RustDesk的自我搭建和使用

1.介绍 RustDesk是继TeamView、向日葵等远程桌面软件后的新起之秀,最主要的是开源的可自己搭建中继服务。相比于公共服务器,连接一次等待的时间要多久,用过TeamView的都知道,而且还是免费的,不像某些远程搞各种个人证书,各种登录设备限制! 先看看软件图,这是待连接界…

14.11 Socket 基于时间加密通信

在之前的代码中我们并没有对套接字进行加密&#xff0c;在未加密状态下我们所有的通信内容都是明文传输的&#xff0c;这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密&#xff0c;此处笔者将演示一种基于时间的加密方法&#xff0c;该加密方法的优势是数…

微信小程序获取手机号(2023年10月 python版)[无需订阅]

技术栈&#xff1a; 1. 微信开发者工具中的调试基础库版本&#xff1a;3.1.2。 2. 后台&#xff1a;django。 步骤&#xff1a; 1. 首先在后台django项目的定时任务中增加一个下载access_token函数&#xff0c;并把得到的access_token保存在数据库中&#xff08;其实随便哪里…

SpringCloud学习笔记-gateway网关自定义全局过滤器

需求&#xff1a;定义全局过滤器&#xff0c;拦截请求&#xff0c;判断请求的参数是否满足下面条件&#xff1a; 参数中是否有authorization&#xff0c; authorization参数值是否为admin 如果同时满足则放行&#xff0c;否则拦截 实现&#xff1a; 在gateway中定义一个过…

C语言实现通讯录(超详细)

1.实现怎样一个通讯录 实现一个通讯录联系人信息&#xff1a;1.可以保存100个人的信息名字2.添加联系人年龄3.删除指定联系人性别4.查找指定联系人电话5.修改指定联系人住址6.排序联系人7.显示所有联系人信息 2.通讯录的实现 2.1创建两个源文件和一个头文件 首先我们创建con…

C++DAY47

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

数据结构----算法--五大基本算法(这里没有写分支限界法)和银行家算法

数据结构----算法–五大基本算法&#xff08;这里没有写分支限界法&#xff09;和银行家算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况&#xff0c;只考虑眼前的这一步&#xff0c;在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

Vue跨域配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 配置详情 请在项目的vue.config.js中通过proxy的配置&#xff0c;解决Vue跨域&#xff1b;代码如下&#xff1a; const { defineConfig } require(vue/cli-service) modu…