当前位置: 首页 > news >正文

面向对象的三大特征

脱掉衣服的第六天

封装

1.什么是封装

从广义的角度来说,将经常使用的代码片段,定义到方法,是封装,将多个方法定义到类中也是封装。

从狭义角度来说,将类中的属性私有化,再通过共有方法进行修改访问。

2.为什么封装

数据保护,只暴露必要的接口,保护对象的内部状态不被外部直接修改

实现细节隔离。将变化隔离在类内部,外部代码不受影响。

3.如何封装

为了不让外界直接访问某些属性,用关键字private修饰这些属性。

提供公有的getter/setter的方法,用来操作这个被私有化的属性

继承

1.什么是继承

继承是从有的类,派生出新的类,新的类中吸收已有的数据和行为,并能扩展新能力。

2.继承特点

只支持单继承,但支持多重继承,一个类只能有一个父类,但可以有多个子类,子类不会继承父类的构造方法和访问不了私有方法,并且至少有一个子类构造器调用父类的构造器。

3.继承中的构造器

在子类的构造方法中,使用super(有参传参)调用父类中存在的构造方法,而且super(有参传参)必须放在首行首句的位置上。因此可知,super(有参传参)和this(有参传参)不能在一个构造器中共存。

4.继承中的方法重写

  1. 什么是重写

    对父类继承到的方法,进行重新实现,子类方法会覆盖调继承父类中的方法。

  2. 重写的特点

    重写时,子类访问权限大于父类,返回值,方法名,参数要相同

  3. @Override

    用于判断是否是重写方法。

5.为什么单继承?

多继承会产生菱形问题,当一个类有两个父类,那么两个父类若有同名方法,那么子类就不知道继承哪个。

一个类继承了多个父类,可能会继承大量的属性和方法,导致类的接口变得庞大、难以理解和维护。此外,在修改一个父类时,可能会影响到多个子类,增加了代码的耦合度。

多态

1,什么是多态

多态的就是是指同一个行为具有多个不同表现形式或形态的能力。具体来说,一个父类引用变量可以指向一个子类对象,而这个引用变量可以调用在子类中重写的方法。

  1. 向上转型

    父类引用变量指向子类对象

    向上转型后的对象,将只能够访问父类中的成员(编译期间,看变量)如果调用的是重写过的方法,那么调用的一定是重写方法(运行期间,看对象)

  2. 向下转型(强转)

子类引用变量指向父类对象

可能会失败,失败的话,会报类造型异常ClassCastException可用instanceof做判断。

2.instanceof

可以用来测试一个对象是否为一个类的实例。

Object类型

Object是根类,所有的类都直接或间接继承Object类。

1.Object类中有什么方法?

  1. toString方法

    作用是将对象的信息变成字符串。 Object里返回的是 “类名@16进制” 。

  2. equals方法

    一般用来比较值是否相等,但是默认比的是地址,一般使用时要重写,

  3. hashcode方法

    调用hashcode方法会返回一个随机整型一般用于,哈希查找。

  4. getClass方法

    final修饰,获取一个指定的对象的类型。 这个方法,不能被重写。

  5. finalize 方法

    finalize() 允许对象在被垃圾回收前执行清理操作,执行时机不确定,不保证完成(异常回收也会继续),发现对象不可达时,首先会检查是否实现该方法,实现了和该方法就会加入Finalizer一个 队列,jvm会异步调用该方法,执行后才能被回收。

  6. wait 方法

    配合 synchronized 使用,wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥 有者,也就是具有该对象的锁。wait() 方法一直等待,直到获得锁或者被中断。wait(long timeout) 设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。

    其他线程调用了该对象的 notify 方法;

    1. 其他线程调用了该对象的 notifyAll 方法;

    2. 其他线程调用了 interrupt 中断该线程;

    3. 时间间隔到了。

    4. 此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。

  7. notify 方法

    配合 synchronized 使用,该方法唤醒在该对象上等待队列中的某个线程(同步队列中的线程是给 抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。

  8. notifyAll 方法

    配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程

final修饰词

final可以用来修饰类,属性,方法,局部变量。

修饰类:不能被继承

修饰方法:不能被重写

修饰属性:不能二次赋值,即要么直接初始化,要么在构造器初始化

修饰成员变量:不能二次赋值

static修饰词

static修饰的内容,都是属于公有资源,不属于对象,而是属于类的,因此都是类名调用

  1. 修饰属性

    使用时用类名点调用,常与final一使用用来定义常量。

  2. 修饰代码快

    在类加载期间执行,只执行一次,适用于加载一些静态资源,比如图片,音频,视频等

  3. 修饰方法

    类名调用,不能被重写

    静态方法中,只能直接访问本类中的静态成员。不能访问非静态成员 非静态方法中,可以访问本类中的非静态成员和静态成员

  4. static修饰类

    static可以修饰类,但必须是内部类,(类体中可以再定义类结构)

  5. 所有静态的执行顺序

                    

代码块

1.代码块

只要构造器调用一次,构造代码块就执行一次,利用每次创建对象的时候都会提前调用一次构造代码块特性,可以利用其做统计创建对象的次数,也可以为成员变量初始化。

2.静态代码块

用于在类加载时执行静态初始化操作。类首次被使用时;例如new对象。

练习题

5.1 面向对象有哪些特征,请展开说一说(面试题)

封装,继承,多态封装广义上说是将重复代码封装成方法,将方法封装成类,狭义角度上说,将属性封装成私有用公共方法进行数据操作。继承是子类可以继承父类的方法和属性,子类可以重写,也可以扩展新功能,一个子类只有一个父类,不能有多个父类因为会菱形问题,一个父类可以有多个子类,也可以多重继承。多态是指同一行为,会有多种不同行态或形势。

5.2 this()与super()的区别(面试题)

this()代表子类的构造方法
super()代表父类的构造方法

5.3 Overload与Override的区别(面试题)

Overload(重载)方法名相同,但参数列表不同 发生在同一个类中或父子类之间。 与返回值类型无关Override(重写)子类重新定义父类的方法,方法名、参数列表、返回值类型必须完全相同发生在继承关系中(子类覆盖父类方法)。

5.4 构造器是否可以被override? (面试题)

不可以

5.5 是否可以继承String类型(面试题)

不可以,String被final修饰是不可变的。

http://www.dtcms.com/a/291906.html

相关文章:

  • Go 语言中,创建结构体实例对象有几种常用方式
  • 大数学习笔记整理
  • Leetcode—692. 前K个高频单词【中等】(桶排序)
  • 从感知到决策:虚拟仿真系统与视觉算法融合下的多路RTSP视频接入技术探究
  • freertos关键函数理解 uxListRemove
  • 基于 Spring Batch 和 XXL-Job 的批处理任务实现
  • linux c语言进阶 - 进程,通信方式
  • PHICOMM(斐讯)N1盒子 - Armbian25.05(Debian 12)刷入U盘/EMMC
  • Unity之C# 脚本与Unity Visual Scripting 交互
  • Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信
  • 【数据可视化-70】奶茶店销量数据可视化:打造炫酷黑金风格的可视化大屏
  • Vue + WebSocket 实时数据可视化实战:多源融合与模拟数据双模式设计
  • AI创作系列第22篇:前端缓存与更新机制重构 - 表情包系统的全面升级
  • 贪心算法Day4学习心得
  • 当直播间告别“真人时代”:AI数字人重构商业新秩序
  • haproxy七层代理新手入门详解
  • 零事故网站重构:11步标准化流程与风险管理指南
  • 第13天 | openGauss逻辑结构:表管理1
  • zabbix“专家坐诊”第295期问答
  • SPI的收发(W25Q64外部flash 和 内部flsah)
  • 小米视觉算法面试30问全景精解
  • Android常用的adb和logcat命令
  • 【bug】ubuntu20.04 orin nx Temporary failure resolving ‘ports.ubuntu.com‘
  • 【测试开发】---Bug篇
  • kafka主题管理详解 - kafka-topics.sh
  • Claude Code Kimi K2 环境配置指南 (Windows/macOS/Ubuntu)
  • 热点leetCode题
  • AI助力临床医学科研创新与效率双提升丨临床医学日常工作、论文高效撰写与项目申报、数据分析与可视化、机器学习建模等
  • Vercel AI SDK 3.0 学习入门指南
  • Java设计模式揭秘:深入理解模板方法模式