#1-面向对象和面向过程的差异#面向对象#2-java-语言特征-关于-jvm-jdk-和-jre-最常见的解答#jvm#jdk-和-jre#4-oracle-jdk-和-openjdk-的差异#5-java和c - 关于-java-程序与主类-应用程序与小程序之间的主类差异#7-java-应用程序与小程序之间的差异#8-字符类型常量与字符串常量之间的差异#9-构造函数-构造函数-复盖# 10 -重载和复盖 11-java-面向对象编程的三个特征-封装-继承-多态性-封装-继承-多态性#12-string-stringbuffer-与-stringbuilder-之间有什么区别-string-为什么不变#13-自动包装和打开包装- 14-为什么在静态方法中调用非静态成员是错误的#15-java-定义了未工作但没有参数的结构方法的角色16-import-java和javax之间的差异#17-接口和抽象类之间的差异#18-成员变量和 19-用于创建对象的运算符对象实体与对象引用之间的差异#20-方法返回的值如何在类方法中工作#20 21-类构造函数的角色是什么? -如果类没有声明构造函数,程序是否正确运行? 为什么#22-构造函数的特性#23-静态和实例方法之间的差异#24-对象等效和引用等效差异#25-在调用子类构造函数之前,重要的是#26--和-equals调用父类中没有参数的构造函数 27-hashcode-and-equals-重要#hashcode ( )为什么-hashcode#hashcode ( )和equals ( )的相关规定#28-为什么仅向java传递值# 29 -线程过程的基本概念及其关系#30-线程 简要介绍-final-关键字的某些摘要#32-java-中的异常处理#java异常类层次图#throwable类公用方法#异常处理摘要#33-java序列化未序列化某些字段-方法#34-键盘输入公用的两种方法
面向过程
优势:性能高于面向对象。 在调用类时需要实例化、成本高、资源相对消耗、性能是最重要的考虑因素的情况下,例如单片机、嵌入式开发、Linux/Unix等一般采用面向过程的开发
缺点:易于面向对象的维护、易于重用和不易于扩展
面向对象
优点:易于维护、易于重复使用、易于扩展、具有面向目标的包、继承和多样性特征,可以设计低耦合系统,使系统更加灵活、易于维护
缺点:性能低于面向过程
2. Java语言有什么特点?
易于学习的面向对象(软件包、继承和多态性)平台独立性( Java虚拟机实现了平台独立性)可靠性安全性支持多线程( c : ̄+语言中没有内置多线程机制)。 Java语言支持多线程支持web编程(尽管必须调用操作系统的多线程功能来设计多线程程序),并且非常方便(由于Java语言的出现本身是为了简化web编程而设计的) 兼顾编译和解释关于JVM JDK和JRE最常见的答案
JVM
Java虚拟机( JVM )是运行Java字节码的虚拟机。 JVM具有不同系统( Windows、Linux和macOS )的独特实现,以便使用相同的字节码,从而产生相同的结果。
什么是字节码? 采用字节码的好处是什么?
在Java中,JVM能够理解的代码称为字节代码(扩展名为. class的文件),不适用于特定处理器,而仅适用于虚拟机。 Java语言采用字节码方式,在一定程度上解决了传统解释型语言执行效率较低的问题,同时还留下了解释型语言的可移植特点。 因此,Java程序在运行时运行效率高,字节码不在特定计算机上,因此Java程序可以在多个不同操作系统的计算机上运行,而无需重新编译。
从源代码到运行Java程序有三个步骤
我们需要特别注意的是. class->机器代码这一步骤。 在此步骤中,JVM类加载器首先加载字节代码文件,然后解释器逐行解释执行。 这种方法的执行速度相对较慢。 另外,由于在方法和代码块中有需要频繁调用的东西(所谓的热点代码),所以之后导入JIT编译器,JIT是运行时编译。 JIT编译器完成第一次编译后,将保存与字节码对应的计算机代码,下次可以直接使用。 我们知道机器代码的执行效率比Java解释器高。 这说明我们经常使用Java是编译和解释的共存语言。
HotSpot采用了惰性评价( Lazy Evaluation )的手法,根据二八法则,消耗大部分系统资源的只是其中一部分代码(热点代码),是JIT需要编译的部分。 每次运行代码时,JVM都会收集并相应地优化信息。 因此,执行次数越多,处理速度越快。 JDK 9引入了将字节码直接编译为机械码的新编译模式AOT(Ahead of Time Compilation ),避免了JIT预热等开销。 JDK支持分层编译和AOT协作。 但是,AOT编译器的编译质量远远不及JIT编译器。
摘要: Java虚拟机( JVM )是运行Java字节代码的虚拟机。 JVM具有不同系统( Windows、Linux和macOS )的独特实现,以便使用相同的字节码,从而产生相同的结果。 与字节码不同的系统的JVM实现是Java语言的“一次编译,在任何地方都可以执行”的关键。
JDK和JRE
JDK是一个Java开发工具包,它是一个完整的Java SDK。 JRE提供了编译器( javac )和工具,如javadoc和jdb。 可以编写和编译程序。
JRE是Java运行时环境。 这是运行编译的Java程序所需的所有内容的集合。 包括基本组件,如Java虚拟机( JVM )、Java类库和Java命令。 但是,它不能用于创建新程序。
只要运行Java程序,只需安装JRE即可。 如果需要Java编程工作,则必须安装JDK。 但是,这不是绝对的。 即使您不打算在计算机上进行Java开发,也可能需要安装JDK。 例如,如果使用JSP部署Web应用程序,从技术上讲,只需在应用服务器上运行Java程序。 为什么需要JDK? 因为应用程序服务器必须将JSP转换为Java servlet,并使用JDK来编译servlet。
4.jdk与OpenJDK的比较
在看到这个问题之前,很多人可能和我一样没有接触到OpenJDK。 Oracle和OpenJDK有很大区别吗? 以下,通过我收集的资料,我来回答你这个被很多人忽视的问题。
Java 7没有什么重要的地方。 OpenJDK项目主要基于Sun捐赠的HotSpot源代码。 此外,OpenJDK被选为Java 7的参考实现,由Oracle工程师维护。 关于JVM、JDK、JRE和OpenJDK之间的区别,Oracle博客文章在2012年得到了更详细的回答
Openjdk存储库中的源代码与生成JDK时使用的代码有何不同?
答:非常接近-jdk版本化过程基于OpenJDK 7,并且仅添加了一些部分,包括Oracle Java插件和Java WebStart实现。 还添加了封闭源代码的第三方组件(如图形聚类器)、开放源代码的第三方组件(如Rhino ),以及零碎的文档和第三方字体。 展望未来,我们的目标是开源jdk的所有部分,除了考虑业务功能的部分。
总结:
jdk版本每三年发布一次,OpenJDK版本每三个月发布一次。OpenJDK是参考模型,完全是开源的,Oracle JDK是OpenJDK的实现,完全不是开源的 OpenJDK和Oracle JDK的代码大致相同,但Oracle JDK有一些类和错误修复。 因此,在开发企业/业务软件时,我们建议您选择jdk,因为它经过完全测试并且稳定。 在某些情况下,有人说使用Openjdk可能会导致许多应用程序崩溃,但只需切换到Oracle JDK就可以解决问题。JDK在响应能力和JVM性能方面, 提供比Openjdk更好的性能。由于jdk长期不支持将来发布的版本,因此用户必须始终更新为最新版本以获得支持。JDK根据二进制代码许可协议获得许可证,并且OpenJDK 5. Java和c +有什么区别?
我知道很多人都没学过c:+,面试官却喜欢我们Java和c:- +,没办法! 什么? 什么? c : ̄2222222222222222652
在所有面向对象的语言中,封装、继承和多态Java都不提供直接访问内存的指针,程序内存中更安全的Java类是单继承类,而c精英+支持多继承的Java类不能继承很多 Java具有自动内存管理机制,程序员不需要手动释放不需要的内存6.Java程序的主类应用程序与小程序的主类有什么区别?
程序可以包含多个类,但只有一个主类。 在Java应用程序中,此主类是指包含main ( )方法的类。 在Java小程序中,此主类是从系统类j小程序或小程序继承的子类。 应用程序的主类不一定必须是公共类,但applet的主类必须是公共类。 主类是Java程序执行的入口点。
7. Java应用程序和小程序之间有什么区别?
简而言之,应用程序从主线程启动(即main ( )方法)。 小程序小程序没有主方法。 主要嵌入在浏览器页面中执行(通过调用init ( )线程或run ( )来启动)。 嵌入浏览器类似于flash的小游戏。
8 .字符类型常数和字符串常数之间有什么区别?
形式:字符常数是单引号包围的字符。字符串常数是双引号包围的几个字符的含义。字符常数相当于整形值( ASCII值)。可以参与表达式运算的字符串常数表示存储在存储器中的地址值。 内存大小字符常量只占据两个字节。字符串常量占据了一些字节(至少一个字符结束标志) (注: char在Java中是两个字节)。Java编程思想版本2.2.2节
00002000200009 .构造函数Constructor是否可以复盖?
在继承时,由于已知父类的私有属性和结构方法不会继承,因此构造器也不会复盖( override ),但会复盖( overload ),因此可以看到一个类中有多个构造函数。
10 .重载和改写的区别
重载:发生在同一类中,方法名称必须相同。 参数的类型、个数、顺序不同。 方法的返回值和访问修饰符可能不同。 在编译时发生。
重写:如果父类中出现的方法名称和参数列表必须相同,返回值的范围必须小于或等于父类,抛出的异常范围必须小于或等于父类,访问修饰符的范围必须大于或等于父类,则子类的方法访问修饰符为private
11. Java面向对象编程的三个特征:包继承多态性
包装
封装提供了一种在将对象属性私有化的同时提供可从外部访问的属性的方法,而不需要提供一种在不希望从外部访问属性时从外部访问的方法。 但是,如果一个类别没有提供访问外部的方法,这个类别就没什么意义了。
继承
继承是基于现有类的定义创建新类的技术,新类的定义可以添加新数据、新功能或使用父类的功能,但不能有选择地继承父类。 继承可以非常容易地复用以前的代码。
关于继承,请记住以下三点
子类别包含父类别不是私有类别的属性和方法。 子类可以有其自己的属性和方法,子类可以扩展父类。 子类可以用自己的方式实现父类的方法。 (稍后介绍)。 多态性
多态性是指在程序中定义的参照变量所指定的具体类型,以及通过该参照变量发出的方法调用不是在程序的执行中被确定,而是参照变量指向哪个类的实例对象,该参照变量发出的方法调用是哪个类
Java有两种形式实现多样性。 继承(多个子类重写相同的方法)和接口(实现接口并复盖接口中的相同方法)。
12 .字符串缓冲器和字符串缓冲器之间有什么区别? 为什么String不变?
参差不齐
简而言之,String类使用final关键字限定字符数组来存储字符串,并且private final char value线程在生命周期中切换为不同的状态,具体取决于代码的执行情况。 Java线程的状态变化如下图所示(图源“Java同时编程艺术”4.1.4节)
从以上的图可以看出
创建线程后将进入NEW (新)状态,调用start ( )方法后将开始执行,线程将进入READY (可执行)状态。 可执行状态的线程在获取cpu时间片时变为执行状态。
操作系统隐藏Java虚拟机( JVM )的运行状态和运行状态(图源: https://howtodoinjava.com/: https://howtodoinjava.com/Java/multi-threading ) 由于只能看到java-thread-life-cycle-and-thread-States/),因此在Java系统中通常将这些状态统称为RUNNABLE状态。
线程执行wait ( )方法时,线程将进入waiting(wait )状态。 处于待机状态的线程必须通过来自其他线程的通知返回到运行状态,但TIME_WAITING状态可以处于待机状态,例如通过sleep(long millis )或wait(long millis )方式使Java线程处于TIMED WAITING状态 超时时间过后,Java线程将恢复为RUNNABLE状态。 如果线程调用同步方法,但未检索到锁,则线程将进入封锁状态。 执行Runnable的run ( )方法时,执行绪会进入TERMINATED (结束)状态。
final关键字总结
final关键字主要用于三个位置:变量、方法和类。
对于final变量,对于基本数据类型的变量,初始化后不能更改值对于引用类型的变量,初始化后不能指向其他对象。 如果使用final限定类,则表示该类不会继承。 final类的所有成员方法都隐式指定为final方法。 使用final方法有两个原因。 第一个原因是锁定方法以防止继承类修改其含义。第二个原因是效率。 在以前的Java实现版本中,final方法已转换为内联调用。 但是,如果方法过大,则可能无法通过内联调用提高性能(当前Java版本不需要使用final方法进行这些优化)。 类中的所有私有方法都隐式指定为final。 32 Java中的异常处理
Java异常类层次结构图
在java中,所有异常都有一个通用的祖先java.lang包Throwable类。 throwable:java异常处理的两个重要子类: Exception (异常)和Error (错误),每个子类都包含许多子类。
错误( Error ) :表示程序无法处理的错误,在应用程序运行时出现严重问题。 大多数错误都指出了执行代码时JVM(Java虚拟机)遇到的问题,而与代码创建者执行的操作无关。 例如,“虚拟机错误”( Virtual MachineError )会在JVM没有继续操作所需的内存资源时出现OutOfMemoryError。 发生这些异常时,Java虚拟机( JVM )通常会选择线程结束。
这些错误表示虚拟机本身发生故障,或者在虚拟机尝试运行应用程序时发生。 例如,“运行Java虚拟机时出错”( Virtual MachineError )和“类定义错误”( NoClassDefFoundError )。 无法检测这些错误,因为这些错误不在应用程序控制和处理能力范围之内,而且大多数情况下程序运行时不允许这些错误。 为了设计合理的应用程序,即使发生错误,实质上也不应该试图处理由错误导致的异常情况。 在Java中,错误由Error子类编写。
Exception (例外):程序本身可以处理的例外。 Exception类具有重要的子类RuntimeException。 RuntimeException异常由Java虚拟机抛出。 NullPointerException (如果要访问的变量未引用对象,则抛出)、ArithmeticException (算术运算例外,如果整数除以0,则抛出)、ArrayIndexOutOfBoundsException (附件
注:异常与错误的区别:异常可以由程序本身处理,但错误不能处理。
Throwable类的常用方法
public string getMessage ( ) :发生异常时的详细信息public string toString ( ) :发生异常时的简要说明publicstringgetlocalizedmessage ( ) :返回异常对象的本地化信息。 您可以使用Throwable子类复盖此方法来声明本地化信息。 如果子类未复盖该方法,则该方法返回与getMessage ( )返回的结果相同的public void printStackTrace ( )。 在控制台上打印Throwable对象包异常消息异常处理摘要
try块:捕获异常。 然后可以有0个以上的catch块,如果没有catch块,则必须有finally块。 catch块处理try捕获的异常。 finally块:无论是捕获还是处理了异常,都会执行finally块中的语句。 如果在try或catch块中检测到return语句,则finally语句块在方法返回之前执行。 在以下四种特殊情况下不执行finally块
finally语句块的第一行发生异常。 因为finally块在其他行上使用System.exit(int )在上一代码中运行退出程序。 如果exit在异常语句后退出带参数函数的语句,则finally会导致执行该程序的线程死亡。 关闭处理器电源。 下一部分来自issue。
关于返回值:
如果try语句包含return,则返回try语句块中的变量值。 详细步骤如下:
如果有返回值,则将返回值存储在局部变量中。执行jsr命令以跳转到finally语句并执行finally语句,然后返回以前保存在局部变量表中的值。 如果try、finally语句包含return,并且有些字段忽略try的return,而finally的return.33 Java中没有序列化,该怎么办?
不想序列化的变量用transient关键字限定。
transient关键字的作用是避免使用该关键字限定的实例中的变量序列化。如果对象反序列化,则使用transient限定的变量的值永久化,并且不会恢复。 transient只限定变量,不能限定类或方法。
34获得键盘常用的两种方法
方法通过Scanner
scanner input = new scanner ( system.in ) string s = input.nextline ( ) input.close ( ); 方法基于缓冲读取器
bufferedreaderinput = newbufferedreader ( newinputstreamreader ( system.in ) ) String s = input.readLine ( ); 作为参考
https://stack overflow.com/questions/1906445/what-is-the-difference-between-JDK-and-JRE https://www.edu CBA.com/Oracle-vs-open JDK/https stack overflow.com/questions/22358071/differen cies-between-Oracle-JDK-and-open JDK? answertab=active#tab-top------
谢谢你看完。 如果你能帮助我,请称赞我一下
更多经验技术欢迎合作学习交流:一点教室-为梦想奋斗的在线学习平台http://www.yidiankt.com/
想深入学习的学生们关心我,可以一起学习讨论。 也可以分享所有资源,探讨经验,等待你哦