Java 底层思考系列:从 JVM 栈帧开始,我真正理解了Java 为什么设计抽象类

最新Java面试题及答案(Java基础、设计模式、Java虚拟机(jvm)) 毕业季意味着即将找工作面试,以下是我整理的部分Java面试题目,以供面试者参考。 阅读详情

从 JVM 栈帧开始,我真正理解了Java 为什么设计抽象类

关键词: JVM、Stack Frame、动态链接、抽象类、多态、方法调用、Java底层原理

最近背 Java 八股时,看到了 JVM 的 栈帧(Stack Frame)。

起初觉得这只是 JVM 的一个知识点:

  • 局部变量表
  • 操作数栈
  • 动态链接
  • 返回地址

后来越想越觉得:

这些东西竟然和 Java 的面向对象设计全部串起来了。

尤其是:

为什么 Java 要设计抽象类?

以前我的回答一直都是:

“为了规范子类。”

今天终于理解:

真正的原因,要从 JVM 如何调用一个方法开始。


一、一个方法调用,到底发生了什么?

例如:

public static void main(String[] args) {
    Animal animal = new Dog();
    animal.eat();
}

以前:

我脑子里的理解只有:

调用 eat()

↓

输出结果

现在:

真正发生的是:

Java代码

↓

编译成 .class

↓

JVM加载类

↓

调用方法

↓

创建栈帧(Stack Frame)

↓

执行字节码

↓

方法结束

↓

栈帧销毁

也就是说:

每调用一个方法,JVM 都会创建一个新的栈帧。

方法结束以后:

栈帧立即弹出。


二、栈帧里面到底有什么?

一个栈帧主要包含四部分。

Stack Frame

├── 局部变量表(Local Variable Table)

├── 操作数栈(Operand Stack)

├── 动态链接(Dynamic Linking)

└── 返回地址(Return Address)

① 局部变量表

负责保存局部变量。

例如:

public static int add(int a,int b){
    int c = a+b;
    return c;
}

那么:

局部变量表

a

b

c

全部保存在这里。


② 操作数栈

负责计算。

例如:

int c = a+b;

JVM 实际会执行:

push a

push b

↓

+

↓

结果压回栈

所以:

所有:

+

-

*

/

%

都依赖操作数栈。


③ 动态链接(Dynamic Linking)

这里看着唬人,其实就一句话秒了:

帮助 JVM 找到真正要执行的方法。

什么意思?

例如:

Animal animal = new Dog();

animal.eat();

变量类型:

Animal

对象类型:

Dog

JVM 怎么知道:

应该执行:

Animal.eat()

还是:

Dog.eat()

答案就是:

动态链接。

运行期间:

JVM 根据对象真正的类型:

找到:

Dog.eat()

然后执行。

这一瞬间,

我突然意识到:

这就是多态工作的底层基础。


④ 返回地址

方法执行结束以后,

CPU 怎么知道回哪里?

例如:

main(){

    add();

    System.out.println("结束");
}

add()

执行完成以后:

并不是程序结束。

而是:

继续执行:

System.out.println("结束");

所以:

栈帧里面还保存着:

返回地址。


三、动态链接,让我重新理解了多态

以前:

觉得多态只是:

Animal animal = new Dog();

今天终于知道:

真正发生的是:

animal.eat()

↓

JVM

↓

动态链接

↓

Dog.eat()

这也是:

为什么:

Java 可以:

父类引用

↓

子类对象

↓

调用子类方法

四、然后我突然想到一个问题

既然:

JVM 会找到真正的方法。

那:

为什么 Java 还需要抽象类?

例如:

class Shape{

    public double area(){
        return 0;
    }

}

这个:

真的合理吗?

圆形:

怎么算面积?

矩形:

怎么算面积?

三角形:

怎么算面积?

父类其实根本不知道。

如果:

写一个:

return 0;

只是:

为了让代码能够编译。

那这个方法:

其实毫无意义。


五、这就是抽象类存在的意义

于是:

Java 提供了:

abstract class Shape{

    public abstract double area();

}

这里:

父类直接告诉所有子类:

我不知道怎么实现。

但是:

你必须实现。

于是:

class Circle extends Shape{

    @Override
    public double area(){

        return Math.PI*r*r;

    }

}

如果:

子类没有实现:

编译直接失败。

这就是:

抽象类真正解决的问题。

它不是:

帮助 JVM。

而是:

帮助程序员。


六、我曾经有一个错误理解

刚开始学习的时候,

我甚至认为:

抽象类是不是为了节省 JVM 内存?

后来查阅 JVM 规范以后,

发现这是错误的。

原因很简单。

抽象方法:

依然存在。

例如:

abstract void eat();

JVM 依然知道:

方法名

参数

返回值

访问权限

只是:

没有方法体(Code Attribute)。

所以:

抽象类几乎不是为了节省内存。

真正的价值是:

表达设计意图。

它告诉所有开发者:

这个行为一定存在。

但是:

父类不知道如何实现。

必须交给子类。

这是:

面向对象设计。

而不是:

JVM 内存优化。


七、整个知识终于串起来了

以前:

这些知识:

在我脑子里都是独立的。

JVM

抽象类

继承

多态

Override

今天终于变成了一张图。

Java代码

↓

编译成字节码

↓

JVM加载类

↓

方法调用

↓

创建栈帧

↓

动态链接

↓

找到真正的方法

↓

为什么需要真正的方法?

↓

因为存在 Override

↓

为什么允许 Override?

↓

因为存在继承

↓

为什么父类没有实现?

↓

因为父类无法提供通用实现

↓

于是:

抽象类诞生

这一刻:

JVM 和 Java 面向对象设计,

终于连接到了一起。


八、总结

以前学习 Java:

总是在背:

  • 什么是继承
  • 什么是多态
  • 什么是抽象类

今天第一次站在 JVM 的角度去理解:

发现这些设计,

并不是孤立存在的。

动态链接让 JVM 能够在运行时找到真正的方法。

方法重写让不同子类拥有不同实现。

抽象类则告诉编译器:

父类不知道怎么做,

所以必须由子类完成。

原来,

Java 面向对象的设计,

并不是为了炫技。

而是为了让程序的结构更加合理,让错误尽可能提前暴露,让扩展变得更加自然。


真正的学习,不是记住一个知识点,而是把一个知识点和整个知识体系连接起来。

如果一门语言的每一个设计都能回答 “为什么”,那你离真正理解它就更近了一步。

Java抽象类与接口的本质区别:从字节码到设计决策 抽象类和接口是Java面向对象设计的两大核心抽象机制,分别承载‘结构继承’与‘行为契约’的不同语义。其本质差异源于JVM字节码层面的类型标识、方法分派机制与类加载策略:抽象类作为可实例化的类型骨架,支持状态共享与模板方法;接口则是编译期契约协议,强调能力可插拔与多实现解耦。这种底层原理决定了它们在微服务演进、版本兼容、性能敏感等工程场景中的技术价值——抽象类适合建模is-a关系与领域不变量,接口适用于横切关注点与能力组合。理解abstract与interface的分工边界,是构建高内聚、低耦合Java系统的 阅读详情

相关推荐

关于深度可分离卷积

关于深度学习中的深度可分离卷积

qq_45670407的博客 1796

Java抽象类与接口设计哲学

抽象类:通过继承层级控制同类事物的变化(如不同图形的计算逻辑)。接口:通过多实现控制跨类行为的变化(如不同设备的连接方式)。Java 的单继承与多实现机制,本质是通过抽象类稳定结构,通过接口扩展灵活性。设计时需聚焦“需要控制哪种变化”,而非机械选择语法形式。

2401_83675559的博客 1499

基础矩阵、本质矩阵、单应矩阵

基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

Gloamirror的博客 1330

【Java GUI系列:实战一款编辑器之底层接口实现篇】

本文设计了一套通用Java UI接口框架,采用纯Java SE实现跨平台UI开发。框架包含基础绘制接口(FDrawable)、形状接口(FShape)和样式类(FStyle)等核心组件,通过分层设计(接口层+抽象层)实现UI控件的统一管理。文章详细阐述了技术原理,包括跨平台实现思路、接口与抽象类的设计差异,并提供了具体源码示例和使用案例。该框架分三个阶段开发:接口层封装、Java AWT实现和Android平台适配,强调向后兼容性和模块化迭代升级。最终实现了一个轻量级、可扩展的UI基础架构。

队牛在线的博客 1120

【QT】基于QSerialPort的跨平台串口通信实战指南

本文是一份基于Qt QSerialPort模块的跨平台串口通信实战指南。详细介绍了从硬件基础、QSerialPort核心类使用、参数配置、设备自动发现到数据异步读写和错误处理的完整流程,并通过构建一个功能齐全的串口调试助手实例,帮助开发者快速掌握在Windows、Linux和macOS系统下进行高效、稳定的串口应用开发。

a1b2c3d的博客 982

【亲测可用!】阿里达摩院开源实时数字人对话VideoChat本地部署教程(8G显存可跑)

本文主要记录在部署阿里达摩院开源实时数字人对话VideoChat时遇到的问题,希望对各位技术开发或爱好者有所帮助!

波点兔的博客 3897

【Java核心知识盲区突破】:从JVM层面理解接口和抽象类的真正差异

直击Java面试高频痛点,深入JVM字节码层面解析接口与抽象类的本质差异。涵盖默认方法、多继承支持、构造器限制、运行时绑定机制等关键点,明确适用场景与性能影响。助你透彻掌握java接口和抽象类的区别面试题,值得收藏。

PixelShoal的博客 367

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

为什么大厂面试总考接口和抽象类?:揭开Java多态设计的底层逻辑

掌握java 接口和抽象类的区别面试题,深入解析多态设计原理。涵盖应用场景、实现方式与关键优势,帮助开发者理解何时用接口或抽象类,提升架构思维。大厂高频考点精讲,值得收藏。

ByteGlow的博客 334

短信验证码逻辑漏洞学习——各种绕过姿势技巧

短信验证码逻辑漏洞学习——各种绕过姿势技巧

记录并分享学习安全的知识点.. 2557

银行统一监管报送系统

依据《银行业金融机构数据治理指引》,银行业金融机构应当建立适应监管数据报送工作需要的信息系统,实现流程控制的程序化,提高监管数据加工的自动化程度。银行业金融机构应当将监管数据纳入数据治理,建立工作机制和流程,确保监管数据报送工作有效组织开展,监管数据质量持续提升。银行通常要对接报送EAST5.0、1104、CRSS等近40个监管应用,涉及近1000张报表。表13-01是主要的监管报送应用、报送依据、报送规范、监管机构名称。

银行信息系统应用架构详解 4350

Java 面向对象详解和JVM底层内存分析

都是解决问题的思维方式,都是代码组织的方式。

m0_68880377的博客 2158

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java每日一课:理解抽象类和接口的区别与联系

抽象类与接口这两者有太多相似的地方,又有太多不同的地方。往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文章各位都能从容地明了二者。 另外本人整理了20年面试题大全,包含spring、并发、数据库、Redis、分布式、dubbo、JVM、微服务等方面总结,下图是部分截图,需要的话点这里点这里,暗号优快云。 抽象类 抽象类是用来描述抽象行为的,比如Animal,我们不知道Animal具体有会有什么样的行为,只有具体的动物类,如D.

banzhuanhu的博客 3683

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【JAVA】多态机制的底层原理,抽象类与接口

1.多态的条件: 继承,重写,向上转换 2.多态的分类: 编译时多态–编译期就知道要调用哪个方法即重载(静多态) 运行时多态–只有在运行时才能知道要调用哪个方法(动多态) 3.多态的实现 JVM执行字节码文件---->读取字节码文件,将字节码文件中的二进制字节流转换为运行时数据结构----> 先从操作栈中找到对象的实际类型 class; 找到 class 中与被调用方法签名相同的方法...

qq_45018670的博客 571

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JVM 内存区域总结:方法区+堆内存+本地方法栈+元空间——JVM系列

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!程序员代码面试指南 IT名企算法与数据结构题目最优解这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!

2401_86964192的博客 1381

抽象类为什么不能被实例化

调用类,要先new对象,JVM为这个对象分配内存空间,包括这个类的所有的属性+方法,如果是抽象方法,JVM不知道怎么为这个抽象方法分配空间,如果要分配必须重写,JVM要确定所分配的内存空间。类是对对象的具体描述,而抽象类不具体,没有方法体,(提供的成员不足以生成一个具体对象),那么就无法生成一个不具体的对象。写抽象方法(有抽象方法的类必须定义为一个抽象类)就相当于一个介质,一个规范,自己写的规范,其他的子类要调用这个抽象类,就必须重写的规范,不能乱改。如果要实例化,要new,要通过构造方法,去实例化,

慕函 1134

Java中抽象类的运用理解

类到对象是实例化。对象到类是抽象 抽象类: 1、什么是抽象类? 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。 类本身是不存在的,所以抽象类无法创建对象《无法实例化》。 2、抽象类属于什么类型? 抽象类也属于引用数据类型。 3、抽象类怎么定义?《先把基础语法学会》 语法: ​ [修饰符列表] abstract class 类名{ ​ 类体; ​ } 4、抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的 5、final和abstract不能联合使用,这两个关键字是对立的

ofshitao的博客 384

【JVM底层揭秘】:构造函数异常如何影响对象初始化流程

深入解析JVM中构造函数的异常如何中断对象初始化流程,揭示类加载与实例化阶段的异常处理机制。涵盖常见触发场景、底层执行逻辑及规避策略,帮助开发者精准定位初始化失败问题。掌握这些核心知识点,提升程序稳定性,值得收藏。

ByteChat的博客 702

JVM初步理解

前言:在慕课网上学习剑指Java面试-Offer直通车时所做的笔记 目录 第一章 对Java的理解 第二章 Java平台无关性如何实现 第三章 JVM如何加载class文件 第四章 什么是反射 4.1 反射的概念 4.2 反射的简例 第五章 ClassLoader 5.1 ClassLoader的双亲委派机制 5.2 loadClass和forName的区别 第六章 Jav...

仰望星空 566

java编程思想——抽象类和接口(抽象类和接口不能实例化原因)

文章目录java的接口为什么不能实例化呢?总结: java的接口为什么不能实例化呢? 首先,我们需要明白实例化的含义。实例化实际意义是在jvm的堆中开辟出一块内存空间,比如Student s = new Student();此处声明Student对象s,并且实例化一个Student对象,实则是在堆中开辟出一块空间来存放Student对象,s则是指向这块空间,也就是内存中的一块地址。这块地址中所存放的值就是我们这个Student对象的一些属性。 具体类所占用的内存空间(也就是堆里的一块地址)所存放的值是类的成

weixin_38927257的博客 2935

面试官问:Java三大特性是什么?一张图+咖啡店故事+JVM底层,彻底拿下这道必考题(附图解+比喻+避坑指南)

摘要:封装、继承、多态的含义+咖啡店比喻+重载vs重写对比+多态底层虚方法表+JVM栈上分配+常见坑+可运行代码。一句话:封装藏细节,继承复代码,多态一接口多实现。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 6260

接口和抽象类有什么联系和区别?

抽象类: 一个类中有抽象方法,这个类就变成了抽象类。 抽象类中class的前面必须有abstract修饰符。 抽象类中可以有普通方法,也可以有抽象方法,而抽象方法的个数可以是0个,也可以是多个。 子类继承父类,必须重写全部的抽象方法,除非这个类也变成了抽象类。 接口: 表面上看,接口是一种特殊的抽象类,但是类是类,接口是接口,是并列的关系。 接口中所有方法都必须是抽象的。 接口中方法定义默认...

李人 1万+

java抽象类 与 接口

还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来。

weixin_42179304的博客 1014

【Java】抽象类与接口:从JVM内存布局到性能实测

本文深入探讨了Java中抽象类与接口的本质区别,从JVM内存布局、方法调用机制到性能表现进行全面解析。抽象类作为部分实现的蓝图,可以维护实例状态并通过虚方法表实现高效调用;接口作为纯粹的行为契约,通过接口方法表支持多重继承但性能略低。文章还分析了Java 8+接口的默认方法和私有方法特性,提供了混合设计模式的实践指导,并通过性能测试对比两者的调用效率。理解这些底层机制有助于开发者做出更合理的架构设计决策。

2301_81224092的博客 417

【JAVA】为什么抽象类不能被实例化

今天无意中看到一个问题:为什么抽象类不能实例化? 很多人的答案都是再说使用抽象类的好处,但是并没有回答为什么不能实例化?这个过程就像是在回答:为什么公鸡不能下蛋?然后回答是使用公鸡可以打鸣。 按照我的理解,如果不对,欢迎补充。 答案是规定。 为什么我这么理解,原因有以下几点。 第一点:回归问题最初,我们为什么要实例化? 我们先逆向思维来考虑,从面向对象的思想来看: 我们需要完成实现一个功能,而功能中的方法,是由对象来调用的,因此我们需要对象,因此我们需要实例化。 那么回归本问题,什么...

大王来巡山了的博客 1316
上一篇: 浏览器渲染原理-前端悟道系列
下一篇: 从 JS 的 `.call()` 到 Java 的“反射”:我是如何降维理解 Java 反射的
程序员梅雨
博客等级 码龄3年 19粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值