【Java八股文总结】之面向对象

news2025/1/13 10:06:53

文章目录

    • Java面向对象基础
      • 一、面向对象基础
        • 1、什么是封装?
        • 2、什么是继承?
          • 1、子类访问父类
          • 2、子类的访问修饰符
          • 3、方法重写
        • 3、什么是多态?
          • 1、Java语言如何实现多态
          • 2、什么时候使用多态?
        • 4、什么是接口?
        • 5、怎么使用接口?
        • 6、Java中创建对象的方式?
        • 7、对象实体和对象引用的区别?
        • 8、对象相等和引用相等
        • 9、类的构造方法的作用?
        • 10、构造方法的特点?是否可以被override?
        • 11、重载和重写的区别
        • 12、面向对象三大特征
        • 13、接口和抽象类的区别?
          • 补充:
          • 1、接口(关键字:==interface==)
          • 2、抽象类(关键字:==abstract==)
          • 3、抽象方法、抽象类
          • 4、为什么使用抽象类?
          • 5、abstract和final是什么关系?
          • 6、abstract和static是什么关系?
        • 13、深拷贝和浅拷贝有什么区别?什么是引用拷贝?
          • Q:浅拷贝如何实现呢?
          • Q:深拷贝如何实现呢?

Java面向对象基础

一、面向对象基础

在这里插入图片描述

1、什么是封装?

封装 是指 将类的属性隐藏在内部,外部不能直接访问和修改 ,如何实现?
通过修改成员变量的可见性,从公有改为私有。
封装的核心思想就是 尽可能把属性都隐藏在内部,对外提供方法来访问,我们可以在这些方法中添加逻辑处理来实现过滤,以屏蔽错误数据的赋值。

2、什么是继承?

继承 是用来描述类之间的关系的,即一个类继承(拥有)另外一个类中的属性和方法,被继承的类叫做父类,继承父类的类叫做子类。
继承的基本语法: extends 关键字

public class 类名 extends 父类名 {

}

Java中的继承是单继承,也就是说一个子类只能有一个直接父类。

1、子类访问父类

创建一个子类对象的时候,会默认先创建一个父类对象,无论是通过有参构造或是无参构造来创建子类对象,都是通过无参构造来创建父类对象的。
可以通过 super 关键字让子类创建对象时调用父类的有参构造。

public Student(){
	super(1);
	System.out.println("通过无参构造创建了Student对象");
}

子类可以访问父类的构造方法、普通方法、成员变量,都是通过 super 关键字来完成,具体语法:
构造方法: super(参数列表)
普通方法: super.方法名(参数列表)
成员变量: super.成员变量名
注意: 在子类的构造方法中,可以通过super访问父类的构造方法和普通方法。在子类的普通方法中,只能通过super访问父类的普通方法。

2、子类的访问修饰符

Java访问权限修饰符:public、protected、默认修饰符、private。
在这里插入图片描述

3、方法重写

子类在继承父类方法的基础上,对父类方法重新定义并覆盖的操作叫做 方法重写构造方法不能被重新,方法重写的规则:

  1. 父子类的方法名相同
  2. 父子类的方法参数列表相同
  3. 子类方法的返回值与父类方法返回值类型相同或者是其子类
  4. 子类方法声明抛出的异常类型与父类方法相同或是其子类
  5. 子类方法的访问权限不能小于父类

3、什么是多态?

一个事物具有多种表现形态,在Java程序中,定义一个方法,在具体的生成环境中根据不同的需求呈现不同的业务逻辑,多态的前提是继承
多态的具体使用有两种形式:

  1. 定义方法时形参类型为父类,实际调用方法时传入子类类型的参数。
  2. 定义方法时返回值类型为父类,实际调用方法时返回子类对象。
    以上两种形式的基本原理都是**父类引用可以指向子类对象**。
1、Java语言如何实现多态

本质上多态分两种:
①编译时多态(又称静态多态)
重载(overload) 就属于编译时多态,编译时多态在编译时就已经确定,运行时调用的是确定的方法。
②运行时多态(又称动态多态)
通常所说的多态指的都是运行时多态,也就是编译时不确定究竟调用哪个具体方法,一直等到运行时才能确定(如子类继承父类后实现的方法)。

2、什么时候使用多态?

①方法参数列表: 代码量大了之后,一些逻辑可以提取出来成为公共的部分,剩余的部分就自然而然地成为多态了。
如:定义方法参数列表时定义为父类类型,这样就可以传递任意子类类型的对象,从而根据传入不同的子类对象来实现不同子类的方法。
②向上转型: 在多态中需要将父类的引用指向子类的对象,只有这样该引用才既可以调用父类的方法,又能调用子类的方法。

Person per = new Student();

4、什么是接口?

接口是 由抽象类衍生出来的 一个概念,并由此产生了一种编程方式:面向接口编程。
面向接口编程就是将程序中的业务模块进行分离,以接口的形式去对接不同的业务模块。
面向接口编程的优点:当用户需求变更时,只需要切换不同的实现类,而不需要修改串联模块的接口,减少对系统的影响。

  1. 能够最大限度实现解耦合,降低程序的耦合性。
  2. 使程序易于扩展
  3. 有利于程序的后期维护。

5、怎么使用接口?

接口在Java中时独立存在的一种结构,和类相似,我们需要创建一个接口文件,Java 中用class关键字来标识类,用 interface 来标识接口,基本语法:

public interface 接口名{
	public 返回值 方法名 (参数列表);
}

接口其实就是一个抽象类,极度抽象的抽象类。
抽象类: 一个类中一旦存在没有具体实现的抽象方法时,那么该类就必须定义为抽象类,同时抽象类允许存在非抽象方法。
但是接口完全不同,接口中不能存在非抽象方法,接口中必须全部是抽象方法=。
因为接口中必须全部都是抽象方法,所以修饰抽象方法的关键字abstract可以省略。
接口中允许定义成员变量,但是有如下要求:

  1. 不能定义private和protected修饰的成员变量,只能定义public和默认访问权限修饰符修饰的成员变量。
  2. 接口中的成员变量在定义时就必须完成初始化。
  3. 接口中的成员变量都是静态常量,即可以直接通过接口访问,同时值不能被修改。
    注意: 使用接口时,不能直接实例化接口对象,而必须实例化其实现类对象,实现类本身就是一个普通的Java类,创建实现类的代码如下所示。
public class MyInterfaceImpl implements MyInterface {
	@Override
	public void test() {
		// TDDO Auto-generated method stub
	}
}

通过 implement 关键字来指定实现类具体要实现的接口,在实现类的内部需要对接口的所有抽象方法进行实现,同时要求访问权限修饰符、返回值类型、方法名和参数列表必须完全一致。
接口和继承,Java类只支持单继承,但是接口可以多实现(一个实现类可以同时实现多个接口)。

6、Java中创建对象的方式?

Java种创建对象共有5种方式:

  1. new关键字;
  2. 类的Class.newInstance();(反射机制)
  3. 构造器的Constructor.newInstance();
  4. Clone()方法;
  5. 反序列化;
    参考链接:Java中创建对象的5种方式

7、对象实体和对象引用的区别?

对象实体在堆内存中;对象引用指向对象实例,对象引用存放在栈内存中。
举例: 一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。

8、对象相等和引用相等

对象相等:比较的是内存中存放的 内容是否相等
引用相等:比较的是它们指向的 内存地址是否相等

9、类的构造方法的作用?

完成**对象的初始化**。

10、构造方法的特点?是否可以被override?

在这里插入图片描述

11、重载和重写的区别

  • 重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同(参数列表不同),方法返回值和访问修饰符可以不同(没有要求),发生在编译时。
public int add(int a,String b)
public String add(int a,String b)
// 编译错误

返回值不同不是方法重载。

  • 重写: 发生在子类继承父类时,方法名和参数列表必须相同,返回值范围小于等于父类,抛出异常的范围小于等于父类,访问修饰符的范围大于等于父类;如果父类方法的访问修饰符是private,则子类不能重写该方法。

12、面向对象三大特征

在这里插入图片描述
在这里插入图片描述

13、接口和抽象类的区别?

在这里插入图片描述
在这里插入图片描述
抽象类 可以存在普通成员函数,而 接口 中只能存在public abstract抽象方法
抽象类 中的成员变量可以是各种类型的,而 接口 中的成员变量只能是public static final常量类型的
抽象类 只能继承一个接口 可以实现多个
抽象类和接口都不允许实例化
注意: Java中是单继承,多实现。(即继承只能是单继承,一个子类仅有一个父类。接口可以多实现,即一个实现类可以同时实现多个接口)
接口的设计目的,是对类的行为进行约束 (更准确的说是一种 “有” 约束, 因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。
抽象类的设计目的,是代码复用 。当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给各个子类自己实现。正是因为A-B在这里没有实现,所以 抽象类不允许实例化 出来(否则当调用到A B时,无法执行)。
抽象类对类本质的抽象,表达的是is a的关系,比如:BMW is a Car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。而 接口对行为的抽象,表达的是like a的关系。
比如: Bird like a Aircraft (像飞行器一样可以飞),但其本质上 is a Bird。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。
使用场景: 当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。 在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口,在设计阶段会降低难度。

补充:
1、接口(关键字:interface

何谓接口? Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。接口中全是抽象方法。

  1. 接口不能实例化,因为接口中的方法都是抽象的,是没有方法体的。怎样产生具体的实例呢?使用接口类型的引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
  2. 一个类可以实现多个接口。
  3. 一个类如果要实现某个接口的话,那么它必须要实现这个接口中的所有方法!!!
  4. 接口中所有的方法都是抽象的和public的,所有的属性都是public、static、final的。
  5. 接口用来弥补类无法实现多继承的局限。
  6. 接口也可以用来实现解耦。
2、抽象类(关键字:abstract

抽象方法: 只声明未实现(即没有方法体的方法)。
抽象类: 包含抽象方法的类(抽象类中不只有抽象方法)。

  1. 抽象类中可以没有抽象方法,但是有抽象方法的必须是抽象类。即一个类包含了抽象方法,那么该类一定是抽象类。
  2. 继承抽象类的子类必须重写父类所有的抽象方法!!!
  3. 抽象类不能创建对象!!!(即不能实例化),如果创建,编译无法通过而报错,只能创建其非抽象子类的对象。
  4. 抽象类中,可以有构造方法,供子类创建对象时,初始化父类成员。
  5. 不能用abstract修饰变量,代码块,构造器。
    (最重要的特征:得到了抽象方法,失去了创建对象的能力!!!)
3、抽象方法、抽象类

①抽象方法: 只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。使用 abstract 修饰符来表示抽象方法和抽象类。
②抽象类: abstract修饰符表示所修饰的类没有完全实现,还不能实例化。
如果在类的方法声明中使用abstract修饰符,表明该方法是一个抽象方法,它需要在子类实现。如果一个类包含抽象方法,则这个类也是抽象类,必须使用abstract修饰符,并且不能实例化。
抽象类除了包含抽象方法外,还可以包含具体的变量和具体的方法。类即使不包含抽象方法,也可以被声明为抽象类,防止被实例化。

4、为什么使用抽象类?

由于父类方法的不确定性,所以用抽象类来把父类设计的抽象,以至于它都没有任何具体的事例,所以没有必要在父类里写,可以精简代码。(比如我们在实现多态的时候,就是会定义许多实现类去继承父类,父类中没有必要去实现方法,只需要定义即可,使用抽象类定义父类,可以精简代码)

5、abstract和final是什么关系?

互斥关系。
abstract定义的抽象类作为模板让子类继承;final定义的类不能被继承。
抽象方法定义通用功能让子类重写;final定义的方法子类不能重写。

6、abstract和static是什么关系?

abstract修饰的方法是抽象方法,只有定义没有实现。
static修饰的静态方法属于类,可以直接使用”类名.方法名“调用,使用类名调用抽象方法是没有意义的。

13、深拷贝和浅拷贝有什么区别?什么是引用拷贝?

深拷贝: 拷贝整个对象。
浅拷贝: 如果是引用对象,则直接复制对象引用地址,不拷贝对象里面的内容。
引用拷贝: 两个不同的引用指向同一个对象。
在这里插入图片描述
因此深拷贝是安全的,浅拷贝的话如果有引用类型,那么拷贝后对象,引用类型变量修改,会影响原对象。

Q:浅拷贝如何实现呢?

Object类提供的 clone() 方法可以非常简单地实现对象的浅拷贝。

Q:深拷贝如何实现呢?
  • 重写克隆方法: 重写克隆方法,引用类型变量单独克隆,这里可能会涉及多层递归。
  • 序列化: 可以先将原对象序列化,再反序列化成拷贝对象。
    在这里插入图片描述

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

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

相关文章

Stream

目录 一 函数式接口 1 特点 2 核心函数式接口 1) Consumer 2) Supplier 3) Function 4) Predicate 5) 扩展:BiFunction 二 Stream 1 stream操作过程 1) 中间操作 2)终端…

[附源码]java毕业设计汽车票售票系统lunwen

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

太湖“生态度假式”年会,为您的健康守护,为您的相聚喝彩

最近几年经常听到, 有人说今年最大的目标就是活着, 历经风雨,方知岁月静好的可贵, 这特殊的一年又一年里让大家深觉“健康”的重要, 也让我们更热爱彼此、热爱生活。 倏忽间,2022已至尾声, 又到…

【ASM】字节码操作 工具类与常用类 GeneratorAdapter 介绍

文章目录 1.概述2. GeneratorAdapter2.1 class info2.2 fields2.3 构造方法2.4 方法2.5 特殊方法2.5.1 loadThis2.5.2 getArgIndex2.5.2 box &3. 案例4.总结1.概述 在上一篇文章中:【ASM】字节码操作 工具类与常用类 AdviceAdapter 介绍 打印方法进入 和 方法退出 的参数…

[附源码]SSM计算机毕业设计远程在线教育平台JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART

关键词:USART UART 串口通信 理论基础 USART/UART USART(Universal Synchronous/Asynchronous Receiver/Transmitter) 通用 同步/异步 串行 接收/发送器是一种串行通信接口。USART最多有5个信号,分别是TX,RX,nCTS.nRTS,SCLK TX串行输出信号RX串行输…

SpringBoot整合freemarker模板导出word文件

文章目录1、前言2、需求说明3、编码3.1、导入依赖3.2、接口编写3.3、工具类3.4、ftl文件3.5、测试4、word转pdf5、总结1、前言 在项目中我们有时间需要根据一个word模板文档,批量生成其他的word文档,里面的有些值改变一下而已,那怎么做呢&am…

【Logback+Spring-Aop】实现全面生态化的全链路日志追踪系统服务插件「SpringAOP 整合篇」

承接前文 针对于上一篇【LogbackSpring-Aop】实现全面生态化的全链路日志追踪系统服务插件「Logback-MDC篇」的功能开发指南之后,相信你对于Sl4fj以及Log4j整个生态体系的功能已经有了一定的大致的了解了,接下来我们需要进行介绍关于实现如何将MDC的编程…

家庭实验室系列文章-如何迁移树莓派系统到更大的 SD 卡?

前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔。 因为没有资格,也没有钱在一线城市买房 (😂😂😂); 但是在要结婚之前,婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城…

【面试题】详解Cookie、localStorage、sessionStorage区别

【面试题】详解Cookie、localStorage、sessionStorage区别 三者基本概念 Cookie localStorage sessionStorage 安全性的考虑 Cookie、localStorage、sessionStorage、indexedDB对比 应用场景 Token一般放在哪里??? 放在Cookie 放…

【openGauss】在WPS表格里制作连接到openGauss的实时刷新报表

前言 其实我的数据库启蒙,是在一家甲方公司。 当时一进这家公司,就见到了通过连接数据库自动刷新的excel表。当时学会了这招就一发不可收拾,制作出各种自动刷新的报表。 想象一下,有些高管不喜欢打开各种复杂的业务系统或者报表系…

【JS基础】在js中如何简单的使用正则表达式

文章目录前言创建正则字符类型的匹配方法searchreplacematch正则的匹配方法test转义特殊符号冲突正则创建问题记一些规则符号修饰符原子表[]和原子组()配合转义字符其他字符量词一些实用的正则前言 关于正则表达式的介绍,推荐看这篇文章正则表达式30分钟入门教程&a…

[附源码]java毕业设计商务酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

鲁棒无范围定位算法 (RRGA)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

LVS-NAT集群搭建

目录 一、环境准备 1、准备三台centos服务器 2、实验拓扑 3、NAT模式介绍 二、LVS-NAT模式部署 1、给lvs服务器安装LVS 2、新建LVS集群 3、添加Real Server服务器节点 4、开启路由转发 5、给后端web服务器配置网关 6、效果测试 一、环境准备 1、准备三台centos服务器…

【C++右值引用】左右值的交叉引用的具体情景,右值详讲

目录 1.右值和左值 2.左值引用和右值引用 3.左右值的交叉引用的具体情景 3.4当不接受返回值就没有办法优化 1.右值和左值 左值与右值是C语言中的概念,但C标准并没有给出严格的区分方式,一般认为:可以放在左边的,或者能 够取地…

基于stm32单片机的光照检测智能台灯

资料编号&#xff1a;101 下面是相关功能视频演示&#xff1a; 101-基于stm32单片机的光照检测智能台灯照明灯Proteus仿真&#xff08;仿真源码全套资料&#xff09;功能介绍&#xff1a; 1、设置为自动模式下&#xff1a;可以检测光照强度&#xff0c;当光照强度<100Lux的…

QT QThread 多线程操作

在QT中&#xff0c;QT应用程序所在的线程为主线程&#xff0c;也称为“GUI线程”&#xff0c;QT GUI必须运行在此线程上&#xff1b;而非主线程称为“工作者线程”&#xff0c;主要处理从主线程中卸下的一些工作&#xff0c;例如数据的同步访问等。需要明确的是&#xff0c;同一…

SSH框架过时了吗?那就最后分享一份阿里架构师整合的SSH框架实战心得吧!

记得当年 java 的企业级框架还是 ssh 的天下&#xff08;spring&#xff0c;struts和hibernate&#xff09;&#xff0c;但是现在感觉 spring 已经完全把那两个框架甩在后边了。用 spring 的人越来越多&#xff0c;用 struts 的人比原来少多了&#xff0c;用 hibernate 的就更少…

BI-SQL丨SNAPSHOT

快照&#xff08;SNAPSHOT&#xff09; 我们在做BI项目的过程&#xff0c;一旦数据涉及到数据库&#xff0c;那么需要考量到的点就比较多。 1.如果数仓是在项目过程中搭建的&#xff0c;那么需要考虑高可用、灾备机制以及安全性问题&#xff1b; 2.如果我们只是需要连接数据库…