JAVA 基础上
什么是字节码?采用字节码的好处是什么
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class
的文件),它不面向任何特定的处理器,只面向虚拟机。
Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有一定差距的),
而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
为什么说 Java 语言“编译与解释并存
这是因为 Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。
OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?
非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,
例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些闭源的第三方组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。
OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
Oracle JDK 比 OpenJDK 更稳定 OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复
在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;
字符型常量和字符串常量的区别?
形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符。
含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。
占内存大小 : 字符常量只占 2 个字节; 字符串常量占若干个字节
标识符和关键字的区别是什么
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了 标识符 。简单来说, 标识符就是一个名字
有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 关键字 。
什么是方法的返回值?方法有哪几种类型?
方法的返回值 是指我们获取到的某个方法体中的代码执行后产生的结果
按照方法的返回值和参数类型分为4种
静态方法为什么不能调用非静态成员?
- 静态方法是属于类的,在类加载的时候就会分配内存,可以通过类名直接访问。而非静态成员属于实例对象,只有在对象实例化之后才存在,需要通过类的实例对象去访问。
- 在类的非静态成员不存在的时候静态成员就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作
静态方法和实例方法有何不同?
调用方式 调用静态方法可以无需创建对象
访问类成员是否存在限制 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制
可变长参数
所谓可变长参数就是允许在调用方法时传入不定长度的参数
遇到方法重载的情况怎么办呢?会优先匹配固定参数还是可变参数的方法呢?
答案是会优先匹配固定参数的方法,因为固定参数的方法匹配度更高
拷贝
引用拷贝就是两个不同的引用指向同一个对象
- 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
- 深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象 。在拷贝引用类型成员变量时,为引用类型的数据成员另辟了一个独立的内存空间,实现真正内容上的拷贝。
- 深拷贝相比于浅拷贝速度较慢并且花销较大。深拷贝后,不管是基础数据类型还是引用类型的成员变量,修改其值都不会相互造成影响。而浅拷贝 时 引用类型的成员变量修改值会互相影响
int b[] = { 0, 0, 0 }; // int[] a = Arrays.copyOfRange(b, 0, 3); int a[] = b;// 浅拷贝 a[0] = 90; for (int x : a) { System.out.println(x); } for (int x : b) { //b也变了 System.out.println(x); }
90
0
0
90
0
0
int b[] = { 0, 0, 0 }; int[] a = Arrays.copyOfRange(b, 0, 3);// 深拷贝 // int a[] = b;// 浅拷贝 a[0] = 90; for (int x : a) { System.out.println(x); } for (int x : b) { // b没变 System.out.println(x); }
90
0
0
0
0
0