八股文学习日常第一期(20240121)

零、前言

1、目的

帮助掌握面试题,就八股文相关内容展开进行学习和整理,也方便之后的复习和巩固。

2、八股文内容来源

https://blog.csdn.net/w20001118/article/details/125724647

一、具体内容分析

1、类的完整书写方式
1.1、类
[Access Modifier] [Modifiers] [Class Name] [Inheritance] [Implemented Interfaces] [Class Body]

具体实例:

public class MyClass extends ParentClass implements Interface1, Interface2 {// 成员变量private int myField;// 构造函数public MyClass() {// 构造函数的实现}// 方法public void myMethod() {// 方法的实现}// 实现接口中的方法@Overridepublic void interfaceMethod() {// 方法的实现}
}

详解:

①访问修饰符(Access Modifier):用于控制类、成员变量和方法的访问级别,决定了它们可以被哪些其他代码访问

public:被声明为 public 的类、成员变量和方法可以被任何其他类的代码访问

protected:被声明为 protected 的成员变量和方法只能被同一个包中的其他类或其子类访问

private:被声明为 private 的成员变量和方法只能被同一个类中的其他方法访问,不能被其他类的代码访问

默认(缺省):被声明为默认访问级别的类、成员变量和方法只能被同一个包中的其他类访问。

②修饰符(Modifiers):可以控制这些元素的访问级别、继承性、抽象性、静态性等,用于修饰类、字段、方法和内部类等元素的特性。

abstract:指定该类是抽象的,不能被实例化,只能作为父类被继承,可以修饰类、方法

final:指定该类是最终的,不能被继承,可以修饰类、方法、变量

static:指定该类是静态的,可以在没有实例对象的情况下访问其中的静态成员,可以修饰类、方法、变量

③类名(Class Name):类的标识符,首字母通常大写,应该遵循驼峰命名规则

④继承(Inheritance):可选项,使用关键字 extends 指定父类。一个类最多只能继承一个父类,但可以实现多个接口

⑤实现的接口(Implemented Interfaces):可选项,使用关键字 implements 指定实现的接口。多个接口之间用逗号分隔

⑥类体(Class Body):使用一对大括号 {} 包裹起来,包含类的成员变量、构造函数、方法等

1.2、成员变量
[Access Modifier] [Modifiers] [Data Type] [Variable Name] [Initial Value]

具体实例:

public class MyClass {private static final int MAX_COUNT = 100;protected String name;public int age = 18;
}

详解:

①访问修饰符(Access Modifier):用于控制成员变量的访问级别,同理类

②修饰符(Modifiers):用于修饰成员变量的特性,同理类

③数据类型(Data Type):指定成员变量的数据类型,可以是任何合法的Java类型,包括基本数据类型和引用类型等

④变量名(Variable Name):成员变量的标识符,应该遵循驼峰命名规则

⑤初始值(Initial Value):如果需要,在声明成员变量时可以直接指定初始值

1.3、成员方法
[Access Modifier] [Modifiers] [Return Type] [Method Name]([Parameter List]) throws [Exception List] [Method Body]

具体实例:

public static int add(int a, int b) throws Exception {// 方法的实现
}

详解:

①访问修饰符(Access Modifier):用于控制方法的访问级别

②修饰符(Modifiers):用于修饰方法的特性

③返回类型(Return Type):指定方法返回值的类型,可以是任何合法的Java类型,如果方法没有返回值,则使用 void 关键字表示

④方法名(Method Name):方法的标识符,应该遵循驼峰命名规则

⑤参数列表(Parameter List):用于传递方法所需的参数,每个参数由类型和名称组成,多个参数之间用逗号分隔

⑥异常列表(Exception List):用于指定方法可能抛出的异常,多个异常之间用逗号分隔

⑦方法体(Method Body):使用一对大括号 {} 包裹起来,包含方法的实际实现

2、接口和抽象类的区别
2.1、抽象类:

**2.1.1、引出:**随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。(即将父类抽象,将子类具体,我们创建对象,通过子类去创建) 一般,我们通过abstract关键词来修饰抽象类。

2.1.2、修饰对象: 类、方法

2.1.3、抽象类: 通过abstract修饰类

示例:

//抽象类
abstract class AA{//……
}

特点:

①此类不能实例化

②抽象类中仍然可以提供构造器,初始化抽象类中的成员变量(虽然自己不能去实例化对象,但抽象类的子类是要进行实例化的,便于子类实例化时候调用父类构造器,涉及子类对象实例化的全过程)

补充:如果一个类没有显式地定义任何构造器,那么编译器会为该类提供一个默认的无参构造器。子类调用父类构造器的方式是使用 super() 关键字,括号中是对应的参数列表。这样就可以显式地调用父类的构造器。如果没有显式地调用父类构造器,那么编译器会自动在子类构造器的第一行插入 super(),默认调用父类的无参构造器。需要注意的是,子类调用父类构造器的语句必须作为子类构造器的第一条语句。这是因为在创建子类对象之前,必须先调用父类构造器进行父类的初始化工作。

③抽象类存在的意义是为了被继承,抽象类都会有对应的子类,让子类对象实例化。抽象类可以包含具体方法的实现,这些方法可以被子类直接调用,子类也可以覆盖(重写)或扩展父类的具体方法。但是抽象类中的抽象方法没有具体的实现,必须要在子类中进行实现。抽象类的存在主要是为了提供一种抽象的模板,让子类根据自身的需要进行具体的实现。

2.1.4、抽象方法:

示例:

abstract class AA {public abstract double MethodA();
}

特点:

①抽象方法只有方法的声明,没有方法体。

②包含抽象方法的类一定是一个抽象类(如果不是抽象类,那么类可以实例化,那么可以去调这个抽象方法,但抽象方法不应该被调用)。反之,抽象类中可以没有抽象方法的。

③若子类重写了父类中的所有的抽象方法后,此子类方可实例化;若子类没有重写父类中的所有抽象方法,则意味着次子类也是一个抽象类,需要使用abstract去修饰一下。

2.1.5 abstract使用的注意点和扩展:

abstract不能用来修饰属性、构造器等结构。

abstract不能用来修饰私有方法(私有方法不能被重写,子类无法访问父类的私有方法)、静态方法(static修饰的方法不需要重写,不依赖于实例化对象,不存在被子类所覆盖的情况)、final的方法(不能被重写)、final的类(不能继承,那么该抽象类不能被子类创建实例)。

③创建抽象类的匿名子类对象

匿名对象:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。

匿名类:也叫匿名内部类,是内部类的一种匿名类在类中只能使用一次,它通常用来简化代码的编写,但使用匿名类还有一个前提条件:它必须继承一个父类或者一个接口,因此这个匿名类会被默认为这个父类或者接口的子类或实现。不用再去特意新建一个类,然后再通过该类去进行实例化。

package Anonymous_class;public class Test {public static void main(String[] args) {//1、创建一个非匿名子类//那么就要先创建一个该抽象类Person的子类,并重写Person中的抽象方法//然后通过该子类去实例化,即是创建一个非匿名子类//2、创建一个匿名子类的对象:p//利用多态,并在new的同时为子类对象进行重写抽象父类的抽象方法//优点:不用再去通过建立一个子类,然后将该子类进行实例化。Person p = new Person(){@Overridepublic void breath() {// TODO Auto-generated method stubSystem.out.println("呼吸!");}@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("吃东西!");}};Test.show(p);//或是省略当前类名,直接调用:show(p);//3、创建匿名子类的匿名对象:Test.show(new Person(){@Overridepublic void breath() {// TODO Auto-generated method stubSystem.out.println("呼吸!");}@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("吃东西!");}});}public static void show(Person person){person.eat();person.breath();}
}abstract class Person{private String name;private int age;public abstract void breath();public abstract void eat();
}
2.2、接口类

2.2.1、引出:

  1. 有时必须从几个类中派生出一个子类,继承他们所有的属性和方法,但Java不支持多重继承。
  2. 有时必须从几个类中抽取一些共同的行为特征,而他们之间又没有继承的关系,仅仅是具有相同的行为特征而已。比如说手机、Mp3都是通过USB接口。
  3. 接口就是规范,定义的是一组规则,体现了显示世界中“如果你是/要……则必须能……”的思想。继承是一个是不是的关系,而接口实现则是能不能的关系。
  4. 接口的本质是契约,标准,规范,就像我们的法律一样,制定好以后大家都要遵循。

2.2.2、修饰对象:

2.2.3、接口的使用:

示例:接口用interface修饰

//接口
interface BB {//……
}

① 接口使用interface来定义(语法格式 interface 名称{})

② Java中,接口和类是并列的结构

③定义接口中的成员时,JDK7:以前,只能定义全局常量(public static final的,书写可以省略)和抽象方法(public abstract的,书写可以省略)。

JDK8:除了定义全局常量和抽象方法以外,还可以定义静态方法、默认方法(略)

public interface CompareA {//静态方法public static void method1(){System.out.println("comparaA:北京");}//默认方法public default void method2(){System.out.println("comparaA:上海");	}default void method3(){System.out.println("comparaA:上海");	}
}public interface CompareB {default void method3(){System.out.println("comparaB:上海");	}
}public class SubClassTest {public static void main(String[] args) {SubClass s = new SubClass();//知识点1:接口中定义的静态方法,只能通过接口来调用CompareA.method1();//知识点2:通过实现类的对象,可以调用接口中的默认方法//如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写的方法s.method2();//知识点3:如果实现类[对接口](或子类[对父类])继承的父类和实现的接口中声明了同名同参数的方法//那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数方法——类优先原则(接口稍后原则)//对于属性,则没有先后,会出现编译错误//知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法method3//那么在实现类没有重写此方法的情况下,会报错。-- 接口冲突//这就需要我们必须在实现类中重写此方法!s.method3();s.mymethod();}
}class SubClass extends SuperClass implements CompareA,CompareB{//重写接口默认方法public void method2(){System.out.println("SubClass:上海 ");}//知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法public void mymethod(){this.method2();	//调用自己定义的重写方法super.method3();//调用父类中声明的//调用接口中的默认方法CompareA.super.method3();CompareB.super.method3();}
}public class SuperClass {public void method3(){System.out.println("superclass:北京");}
}

④ 接口中不能定义构造器,即接口无法实例化,它只定义了一组方法的规范,而没有实现,子类实例化的过程与普通的类不同,子类需要通过实现接口并覆盖(实现)接口中的所有方法来完成实例化。

⑤ Java开发中,接口通过让类去实现的方式(implements)来使用。如果实现类覆盖了接口中的所有抽象方法,则次实现类就可以实例化;如果实现类没有覆盖接口中的所有的抽象方法,则此实现类仍为一个抽象类。

⑥Java中的类可以实现多个接口,弥补了Java单继承性的局限性

⑦对于一个类,先继承父类,后写需要实现的接口。格式:class A extends BB implements CC,DD,EE{};

⑧接口与接口之间可以继承,而且可以多继承。interface CC extends AA,BB{};

2.2.4、接口的特点:

①接口的具体使用能够体现多态性,通过其子类去进行实例化。

②接口,实际上可以看做是一种规范。对于项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的不变就是规范,因此我们开发项目往往都是面向接口编程(接口的主要用途就是被实现类实现)

③开发中,体会面向接口编程。

2.2.5、接口使用的注意点和扩展

① 接口匿名实现类对象

package Anonymous_Interface;public class USBTest {public static void main(String[] args) {Computer com = new Computer();//1.创建了接口的非匿名实现类的非匿名对象flashFlash flash = new Flash();		com.transferData(flash);System.out.println("****************************");//2.创建了接口的非匿名实现类的匿名对象com.transferData(new Printer());System.out.println("****************************");//3.创建了接口的匿名实现类的非匿名对象//匿名实现类即不适用其可以实例化的子类进行实例化//直接通过子类进行实例化USB phone = new USB(){@Overridepublic void start() {// TODO Auto-generated method stubSystem.out.println("U盘开始工作!");}@Overridepublic void end() {// TODO Auto-generated method stubSystem.out.println("U盘结束工作!");}};com.transferData(phone);System.out.println("****************************");//4.创建了接口的匿名实现类的匿名对象com.transferData(new USB(){@Overridepublic void start() {// TODO Auto-generated method stubSystem.out.println("U盘开始工作!");}@Overridepublic void end() {// TODO Auto-generated method stubSystem.out.println("U盘结束工作!");}});}}class Computer{public void transferData(USB usb){usb.start();System.out.println("具体传输数据的细节");usb.end();}
}class Flash implements USB{@Overridepublic void start() {// TODO Auto-generated method stubSystem.out.println("U盘开始工作!");}@Overridepublic void end() {// TODO Auto-generated method stubSystem.out.println("U盘结束工作!");}}class Printer implements USB{@Overridepublic void start() {// TODO Auto-generated method stubSystem.out.println("打印机开始工作!");}@Overridepublic void end() {// TODO Auto-generated method stubSystem.out.println("打印机结束工作!");}}//定义接口
interface USB{public abstract void start();public abstract void end();
}
1.4 抽象类和接口类的相同点

①接口和抽象类都无法直接实例化

②实现接口或者继承抽象类的普通子类都必须实现其中的抽象方法

1.5 抽象类和接口类的不同点

①抽象类是一种特殊的类,它不能被实例化,只能被继承;接口是一种规范或约定,它只包含方法的声明和常量的定义,而没有任何方法的实现

②抽象类可以包含普通方法和代码块,接口中只能包含抽象方法、静态方法和默认方法

③抽象类可以有构造方法,而接口没有

④抽象类中的成员变量可以是各种类型的,接口的成员变量只能是 public static final 类型的,并且必须赋值

⑤使用extends继承抽象类,使用implements关键字实现接口

⑥一个抽象类可以实现若干个接口,接口不能继承抽象类,接口可以使用extends继承多个父类接口

⑦一个子类只能继承一个抽象类,一个子类可以实现多个接口

2、重载和重写的区别

重载:

①对象:重载的对象是同一个类中的方法

②概念:在同一类中,允许存在一个以上的同名方法,只要他们的参数个数或者参数类型 不同即可。

③构成重载的特点:与方法的权限修饰符、返回值类型、形参名无关,只看参数列表,且参数列表必须不同。调用的时候,根据方法的参数列表的不同来进行区分。可以概括为:“两同一不同”:同一个类、相同方法名,参数列表不同(参数个数不同,参数类型不同,参数排列顺序不同)。

④确定重载方法:先看方法名,再看参数列表

重写:

①对象:重写的对象是子类中的方法。

②概念:在子类中可以根据需要对从父类中继承来的同名同参数的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。重写以后,当创建子类对象以后,通过子类对象调用父类中的同名同参数的方法时,实际执行的是子类重写的父类的方法。

③重写的规定:

方法的声明: 权限修饰符 返回值类型 方法名(形参列表)throws 异常类型{方法体……}

约定:子类中的叫重写的方法,父类中的叫被重写的方法。

(1)子类重写的方法的方法名和形参列表与父类被重写的方法的方法名形参列表相同。(方法名和形参列表唯一确定某一个方法)

(2)子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。(特殊情况:子类不能重写父类中声明为private权限的方法,只能说在子类中新写了一个方法,因为其看不到父类中的private方法)

(3)返回值类型:

父类被重写的方法的返回值是void,则子类重写的方法的返回值类型只能是void。

父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类。

父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的基本数据类型。

(4)子类重写的方法抛出的异常类型不大于父类被重写的异常类型。

3、==和equals的区别

==:

①对于基本类型比较的是其值

②对于引用类型比较的是其内存地址

equals:

equals是Object的方法,因此对于所有的类都有equals方法(所有类都是Object的子类)

本质上与==一样,但是有些类重写了equals方法,比如String的equals被重写后,比较的是字符值,另外重写了equlas后,也必须重写hashcode()方法,因为在Java中,equals和hashCode方法是配对使用的。

equals方法用于判断两个对象是否相等,而hashCode方法则用于计算对象的哈希码值。哈希码值在集合类(如HashMap、HashSet等)中广泛使用,用于确定对象在集合中的存储位置。根据Java规范,如果两个对象使用equals方法判断为相等,那么它们的hashCode值也必须相等。反之,如果两个对象的hashCode值相等,不一定代表它们相等,只是有可能相等。

补充:
在这里插入图片描述

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

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

相关文章

7.【CPP】String类

一.汉字的编码 我们知道计算机存储英文字母,标点,数字用的是ascall码,128种用一个字节表示绰绰有余。而汉字远远不止128种,因此汉字需要两个字节表示。 1.gbk编码中汉字占两个字节。 2.utf-8中,一个汉字占三个字节。…

【博士每天一篇论文-技术综述】Machine Learning With Echo State Networks 一篇系统讲解ESN知识的五星文章

阅读时间:2023-11-21 1 介绍 年份:2020 作者:徐元超,曼尼托巴大学 期刊: 无 引用量:无 这篇文章是一篇技术报告,从递归神经网络(RNNs)引入到回声状态网络(…

Unity中实现捏脸系统

前言 目前市面上常见的捏脸一般是基于BlendShapes和控制骨骼点坐标两种方案实现的。后者能够控制的精细程度更高,同时使用BlendShapes来控制表情。 控制骨骼点坐标 比如找到控制鼻子的骨骼节点修改localScale缩放,调节鼻子大小。 BlendShapes控制表…

【数学笔记】集合及简要逻辑

集合 基础简要逻辑集合间的关系与运算 基础 集合定义:把一些能够确定的不同对象组成的整体叫做一个集合,每个对象叫做元素。集合记法:一般用大写字母 A , B , C . . . . . . A,B,C...... A,B,C......表示集合,小写字母 a , b ,…

分布式锁实现(mysql,以及redis)以及分布式的概念

道生一,一生二,二生三,三生万物 我旁边的一位老哥跟我说,你知道分布式是是用来干什么的嘛?一句话给我干懵了,我能隐含知道,大概是用来做分压处理的,并增加系统稳定性的。但是具体如…

特征融合篇 | YOLOv8 引入长颈特征融合网络 Giraffe FPN

在本报告中,我们介绍了一种名为DAMO-YOLO的快速而准确的目标检测方法,其性能优于现有的YOLO系列。DAMO-YOLO是在YOLO的基础上通过引入一些新技术而扩展的,这些技术包括神经架构搜索(NAS)、高效的重参数化广义FPN(RepGFPN)、带有AlignedOTA标签分配的轻量级头部以及蒸馏增…

android usb2.0 协议基础(1)

1-USB 基本知识 USB的重要关键概念: 1、 端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点) 2…

ORB-SLAM 论文阅读

论文链接 ORB-SLAM 0. Abstract 本文提出了 ORB-SLAM,一种基于特征的单目同步定位和建图 (SLAM) 系统该系统对严重的运动杂波具有鲁棒性,允许宽基线环路闭合和重新定位,并包括全自动初始化选择重建的点和关键帧的适者生存策略具有出色的鲁棒…

Android 基础技术——View 的宽高

笔者希望做一个系列,整理 Android 基础技术,本章是关于 View 的宽高 Activity Resume 的时候设置或者获取view的宽高是否有效? 回答:不确定。 首次 onResume 无效,二次 onResume 就有效了。 回顾「Android 基础技术——addView 流…

Eclipses安装教程

一、下载开发工具包 1、开发工具包JDK 下载地址链接:https://www.oracle.com/cn/java/technologies/downloads/ 下载教程: 1)点击链接,可以跳转到页面 2)下滑页面,找到开发工具包 3) 记住下载之…

初识C语言·自定义类型(1)

目录 1 联合体类型的声明 2 联合体的特点 3 联合体的大小计算 4 枚举类型类型的声明 5 枚举的优点 1 联合体类型的声明 联合体,顾名思义,是多个对象连在一起的,即联合体的成员都是共用空间的,所以联合体也叫做共用体&#xf…

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具,JProfiler的直观UI可帮助您解决性能瓶颈,确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单,第三方集成使得入门变得轻而易举,并且以自然的方式呈现数据分析。 解…

万物简单AIoT 端云一体实战案例学习 之 快速开始

学物联网,来万物简单IoT物联网!! 下图是本案的3步导学,每个步骤中实现的功能请参考图中的说明。 1、简介 物联网具有场景多且复杂、链路长且开发门槛高等特点,让很多想学习或正在学习物联网的学生或开发者有点不知所措,甚至直接就放弃了。    万物简单AIoT物联网教育…

72.批量执行Redis命令的4种方式!

文章目录 前言一、Redis命令执行过程二、原生批量命令三、pipeline(管道)四、Lua脚本五、Redis事务六、Redis Cluster模式下该如何正确使用批量命令操作? 前言 在我们的印象中Redis命令好像都是一个个单条进行执行的,但实际上我们是可以批量执行Redis命…

二层交换机和三层交换机

二层交换机:将源mac和端口进行转发,是同一个网段进行通信的,不能实现路由转发,若想跨网段则需要接入一个路由器 如:pc1 192.168.1.1 与 pc2 192.168.1.2通信需要经过二层交换机,二层交换机不能配置ip的&am…

【前端设计】输入框

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset"…

RHCE上课笔记(前半部分)

第一部分 网络服务 第一章 例行性工作 1.单一执行的例行性工作 单一执行的例行性工作&#xff08;就像某一个时间点 的闹钟&#xff09;&#xff1a;仅处理执行一次 1.1 at命令&#xff1a;定时任务信息 [rhellocalhost ~]$ rpm -qa |grep -w at at-spi2-core-2.40.3-1.el9.x…

Nacos 在云原生架构下的演进

作者&#xff1a;之卫 背景 Nacos 提供的最核心能力是动态服务发现与动态配置管理能力&#xff0c;在云原生环境下&#xff0c;借助云产品&#xff0c;如 EDAS&#xff08;企业级分布式应用服务&#xff09;平台中&#xff0c;我们可以很轻松地使用 K8s 来托管 Nacos 体系的微…

《WebKit 技术内幕》之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六&#xff08;1&#xff09;&#xff1a;CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后&#xff0c;RenderObject树之前&#xff0c;CSS解释器解释后的结果会保存起来&#xff0c;然后RenderObject树基于该结果来进行规范匹配和布局计算。当…

基于 GPT 和 Qdrant DB 向量数据库, 我构建了一个电影推荐系统

电影推荐系统自从机器学习时代开始以来就不断发展&#xff0c;逐步演进到当前的 transformers 和向量数据库的时代。 在本文中&#xff0c;我们将探讨如何在向量数据库中高效存储数千个视频文件&#xff0c;以构建最佳的推荐引擎。 在众多可用的向量数据库中&#xff0c;我们将…