0225学习笔记

news/2025/2/26 7:11:10/文章来源:https://www.cnblogs.com/kynoyinu/p/18737644

0225学习笔记

栈区和堆区

栈区:变量生命周期局限在函数内部,这种变量叫局部变量,局部变量占据的内存区域就是栈区。

堆区:变量生命周期受程序员控制,超越了函数内部,它们占据的内存区域叫堆区。

栈区性能更高,因为栈区内存的分配和释放非常简单,就是一个指针(寄存器)的移动而已,

而堆区不一样,堆区的内存受程序员自己控制,生命周期各不相同,因此必须精心标记,哪些可用,哪些不可用。此外,由于进程中的所有线程共享一个堆区,因此堆区内存分配器,必须处理好线程安全问题。因此堆区内存管理要比栈区复杂很多,整体上讲,堆区性能要比栈区差。

栈区堆区大小一样吗:栈区(Stack)大小固定,具体大小受操作系统或编译器的设置影响,典型值在 几 MB(比如 1MB ~ 8MB) 之间。因此不能创建占据内存空间很大的局部变量,否则会导致栈溢出(Stack Overflow)。堆区(Heap) 的大小不是固定的,可以动态增长,但仍然受 系统的虚拟内存管理 以及 物理内存大小 限制。堆区中的内存是 动态分配 的(如 mallocnew),需要程序员 手动释放(如 freedelete)。如果程序 未释放已分配的堆内存,或者失去了对该内存的引用,就会造成 内存泄露。(虽然堆区的大小可以动态增长,但它仍然受 系统的虚拟地址空间和物理内存 限制。如果物理内存不足,或者进程的地址空间已耗尽(例如 32 位系统的 4GB 限制),就无法再分配更多的堆空间。)

封装(Encapsulation)

Encapsulation(封装) 是面向对象编程(OOP)的重要特性之一,它指的是将 对象的状态(属性)和行为(方法)封装在类内部,并通过 访问控制修饰符(private、protected、public) 限制外部访问,从而提高数据的安全性和代码的可维护性。

JAVA封装:属性私有,get/set
封装的意义:
1 提高程序安全性,保护数据
2 隐藏代码的实现细节
3 统一接口
4 提高系统的可维护性

get/set生成快捷键:alt + insert

继承

快捷键:ctrl + H显示树结构

在JAVA中所有的类都默认直接/间接继承Object类

JAVA中类只有单继承,没有多继承。(子类只能一个父类,父类可以有多个子类)

super()
  1. super() 是 Java 中用于调用 父类的构造方法 的关键字。只能在子类的方法或者构造方法中出现!它必须是 构造方法的第一行,用于确保父类的初始化逻辑在子类执行之前完成。super()和this()不能同时调用构造方法。
class Child extends Parent {Child() {super(); // 调用父类的无参构造方法(可以省略)System.out.println("Child 构造方法被调用");}
}

即使不写 super();,Java 也会默认调用父类的 无参构造方法

  1. 除了用于构造方法,super 还可以在子类中调用父类的 方法属性
class Child extends Parent {void show() {super.show(); // 调用父类的 show 方法System.out.println("Child 的 show 方法");}
}class Child extends Parent {int num = 20;void show() {System.out.println("子类 num:" + num);System.out.println("父类 num:" + super.num);}
}
重写

需要有继承关系,子类重写父类的方法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大但不能缩小: public -> protected -> default -> private
  4. 抛出的异常:有范围,可以被缩小,但不能扩大

为什么要重写:

父类的功能,子类不一定需要,或不一定满足。

快捷键:alt + insert: override

多态

Child c1 = new Child();  
Parent c2 = new Child();   // Person 是 Student 的父类,这里用 父类引用 s2 指向子类 Student 的对象。这就是多态!
  • 为什么可以让父类引用指向子类?

在 Java 里,子类对象可以赋值给父类引用,因为子类“是”父类的一种(符合里氏替换原则 LSP)。

  • 多态的使用?

当你使用 父类引用指向子类对象,调用方法时:

  1. 编译时看的是父类的类型(保证方法存在)。
  2. 运行时执行的是子类的重写方法(动态绑定)。
  • 多态的意义?
多态的意义 优势
提高扩展性 只需新增类,而不修改已有代码
提高复用性 让相同方法处理不同对象,减少代码重复
提高灵活性 适用于不同的对象,适应变化
提高可维护性 避免大量 if-else 语句,代码更清晰
  1. 多态是方法的多态
  2. 父类和子类,类型有联系,不然会报错:类型转换类型! ClassCastException!
  3. 存在条件:
    • 继承关系
    • 方法需要重写,子类重写父类
    • 父类引用指向子类对象(Parent p = new Child();)

哪些方法不能重写(不能重写一定不具备多态性):

  1. static 方法,因为 static 方法属于类本身,而不是实例。
  2. final 常量
  3. private 方法,因为 private 方法对子类不可见
instanceof

instanceof 是 Java 的一个关键字,用于判断一个对象是否是某个类的实例,或者是否是某个父类/接口的子类

对象 instanceof 类名 //如果 对象 是 类名 或其子类的实例,返回 true。

作用:在多态中,父类的引用可以指向子类的对象,但是不能直接调用子类的特有方法。如果想要调用子类特有的方法,需要先用 instanceof 进行类型检查,然后进行强制类型转换

class Animal {void makeSound() {System.out.println("Some animal sound");}
}class Dog extends Animal {void bark() {System.out.println("Bark! Bark!");}
}public class TestPolymorphism {public static void main(String[] args) {Animal a = new Dog(); // 父类引用指向子类对象a.makeSound(); // 输出:Some animal sound// a.bark(); // ❌ 编译错误,父类引用无法调用子类方法if (a instanceof Dog) { // 先检查再转换Dog d = (Dog) a; d.bark(); // 输出:Bark! Bark!}}
}
  • 如果 a 不是 Dog,直接强制转换 Dog d = (Dog) a; 会抛出 ClassCastException
  • instanceof 可以避免类型转换异常

此外,还适用于接口判断(未学到接口):

如果一个类实现了某个接口,那么用 instanceof 也可以判断对象是否实现了某个接口

总结

instanceof 主要用于 类型检查,常用于多态、强制转换和接口判断,可以避免 ClassCastException

static

public class Student {private  static int age; //静态变量private double score; //非静态变量public void run(){}public static void go(){}public static void main(String[] args) {Student s1 = new Student();System.out.println(Student.age); //静态变量推荐使用类名来.变量,因为很明显这个变量就是静态变量//System.out.println(Student.score); 报错,非静态变量不能用类名来使用,必须new出对象才可System.out.println(s1.age);System.out.println(s1.score);//Student.run(); 静态方法不能去调用非静态方法//run();Student.go();go();}
}
为什么静态方法不能直接调用非静态方法?

静态方法是在类加载时就存在的,它不依赖于任何实例对象
而非静态方法属于对象实例,需要通过实例化对象来访问。

如果在没有对象的情况下直接调用非静态方法,编译器无法确定要调用哪个对象的实例方法,因此会报错。

反过来:非静态方法可以调用静态方法

非静态方法可以直接调用静态方法,因为静态方法已经存在于类中,不依赖于实例。

abstract抽象类

abstract 用于定义抽象类,它是一种不能被直接实例化的类,通常作为父类,让子类继承并实现其方法。

public abstract class Action {//是个约束,有人帮我们实现//抽象方法,只有方法名字,没有具体实现//抽象类的子类,都必须要实现它的方法,除非它的子类也是abstractpublic void doSth(){}
}

特点:

  1. 不能new这个抽象类,只能靠子类去实现它:约束!
  2. 可以写普通方法。
  3. 抽象方法必须在抽象类中。
  4. 子类必须实现抽象方法,否则子类也必须声明为抽象类。
什么时候使用抽象类?
  • 当多个类有共同的特性(变量/方法)时,可以用抽象类作为父类,减少代码重复。
  • 如果某些方法在父类中没有具体实现(逻辑因子类不同),可以声明为抽象方法,让子类自行实现。
  • 如果你不希望某个类被直接实例化(只能作为父类使用),可以将其定义为抽象类。

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

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

相关文章

记录绘制立体平面网格分块图像

绘制如下图所示的图片方法: ​​ 首先在drawio中为图片画好网格,如下图所示 ​​ 然后将该图片导出,(推荐导出为svg格式,无损清晰),将导出的图片导入PPT中 在PPT中通过开始=》形状效果=》三维旋转=》离轴 2:上​来将图片转换成立体效果。 ​​ ​​ 最后右键单击PPT中已…

开源一款数据转换扩展板-FreakStudio多米诺系列

数据转换板通过I2C接口进行信号采集和输出,支持最多16通道输入和2通道输出。具备860Hz采样率和50KHz输出频率,采用16位ADC和12位DAC芯片,适用于精确信号采集。小尺寸设计,支持堆叠级联。原文链接: FreakStudio的博客 摘要 数据转换板通过I2C接口进行信号采集和输出,支持最…

【CodeForces训练记录】Codeforces Round 1006 (Div. 3)

训练情况赛后反思 结束前打表看出来了 F 有一点进制的规律,太极限了来不及写了 A题 显然不合法的情况就是所有元素绝对值的和都比和的绝对值小,这种情况无论怎么凑都到不了 \(k\),剩下的就是把和均摊到值域上,除以值域向上取整就是答案点击查看代码 #include <bits/stdc…

西湖论剑2025Misc—cscs

西湖论剑2025cscs详解 Cobalt Strike流量主要是找beacon,主要以两种形式呈现 一小段shellcode(几百个字节),通常叫做stager shellcode,这段代码下载整个的beacon。 一个完全的beacon:一个可以反射性加载的PE文件 先来了解下cs流量的特征 cs流量特征: 1,基础特征:心跳包…

轻松驾驭Docker!Windows Docker Desktop部署Portainer全攻略

轻松驾驭Docker!Windows Docker Desktop部署Portainer全攻略 一、引言 在当今的软件开发领域,Docker 已经成为构建、部署和运行应用的标准之一。它通过容器化技术使得开发者可以轻松地打包应用程序及其依赖,并确保它们可以在任何环境中一致地运行。 为了更好地管理和监控这些…

部署 VS2022 驱动开发环境-解决无法编译驱动的问题

使用 VS2022 安装驱动开发环境,创建默认的驱动项目是无法直接编译出驱动的文件的,需要使用 NuGet 给项目安装【Microsoft.Windows.WDK.x64】1、下载安装 VS2022(最低支持的 WDK 版本:10.0.26100) 下载地址:https://visualstudio.microsoft.com/zh-hans/downloads 1.1 组件选…

web开发 辅助学习管理系统开发日记 day2

Q1:遇到的api返回结果数据封装的问题,在老版本的springboot中当实现类的类名和数据库中的类名不一致的是不会自动封装返回,因此返回结果值会显示null,但是在新版貌似已经会自动识别,所以我没有遇到该问题,如果遇到用手动结果映射的方法解决。Q2:在进行前后端联桥时,前端服…

右值引用和移动语义

右值引用(Rvalue reference)和移动语义(Move semantics) 左值(lvalue)和右值(rvalue)左值(也称为 locator value)是一个可以被修改的存储位置,指向内存中的某个位置 例子:变量、数组元素、解引用指针等判断左值的方法是:能够获得这个表达式的引用 或者取地址右值 …

【vulhub】redis 4-unacc (redis未授权访问)

渗透环境 攻击机: IP: 192.168.66.130(Kali) 漏洞收录于:vulhub/redis/4-unacc 涉及知识点:redis未授权访问 影响版本:redis 版本 < 6.x 漏洞的产生条件有以下两点:Redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接…

再论支付账务

支付账务是金融领域中复杂且关键的一环,涉及资金流动、风险控制和业务效率等多个方面。本文从支付结算的专业视角出发,深入剖析了支付账务的核心逻辑,包括会计科目设置、对账结算流程以及账务核算的关键要点。学习账务的时候你是否经常有这些疑问“待结算和待清算是什么?为…

分享[清华大学DeepSeek教程全家桶]下载地址

干货分享,最新整理的清华大学DeepSeek教程全家桶,内容如下:内容展示下载地址🎁🎁 文末福利,后台回复[603]获取下载地址 📢📢 喜欢这篇文章?欢迎大家✨关注 ❤️点赞 ➡️转发 分享给那些需要的朋友!如果认为此文对您有帮助,别忘了支持一下哦!声明:本博客原创文…

求二叉搜索树的第 K 小的值

题目:一个二叉搜索树,求其中的第K小的节点值。如下图,第3小的节点是4什么是二叉树:是一棵树   每个节点最多能有 2 个字节点。数据结构如下:{value, left,right}interface ITreeNode {value: number // 或其它类型left?: ITreeNoderight?:ITreeNode }上图中的二叉树结…