1.Java的“一次编写,处处运行”如何实现?
答:JAVA之所以能实现一次编译,到处运行,是因为JAVA在每个系统平台上都有JAVA虚拟机(JVM),JAVA编译的中间文件class是由JAVA虚拟机在运行时动态转换为对应平台的机器代码
2.描述JVM运行原理
Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道。用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如图所示:
运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码文件(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择地转换成机器码执行
3.为什么Java没有全局变量?
1.全局变量破坏了引用的透明性。
2.全局变量破环了命名空间冲突。
可以使用properties类将想要的全局有效的变量值写在properties文件中,那么在何处用时都从此properties文件中读取这个变量的值就可以了,此值在任何时候都可以修改的。
说明:我们平时在类中声明的只是相对类而言是全局变量,不是真正意义的全局变量。
4.说明一下
public static void main(String args[])
这段声明里每个关键字的作用。
public 是一个访问权限修饰符(访问修饰符)公共。
static 修饰的成员称为类成员或者静态成员
void 当方法定义时用void来修饰,表示没有返回值
String 类来创建和操作字符串
5.Java是否存在内存泄露?
java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收期回收的,这就是java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
6.==和equals的区别
“==”除了比较基本数据之外都是比较的内存地址
“equals”除了没有重写equals方法的类之外都是比较的内容
7.Java中有几种类型的流?
Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream、OutputStream、Reader、Writer。
8.如何用Java代码列出一个目录下所有的文件(夹)。
public class TestListFile {
public static void main(String[] args) {
System.out.println("=========指定目录下的所有文件夹==========");
File fileDirectory = new File("E:\\");
for (File temp : fileDirectory.listFiles()) {
if (temp.isDirectory()) {
System.out.println(temp.toString());
}
}
System.out.println("=========指定目录下的所有文件==========");
File file = new File("E:\\TestListFile\\a");
File[] aa = file.listFiles();
for (int i = 0; i < aa.length; i++) {
if (aa[i].isFile()) {
System.out.println(aa[i]);
}
}
}
}
9.&和&&的区别。
①、&和&&都可以用作逻辑的运算符,当两边的结果都为true时,运算结果才为true,否则只要有一方运算结果是false,运算结果就为false。
②、&&在开发过程中用到的概率比&&大,因为&&具有短路的功能,只要第一个表达式为false,就不会再进行判断。例如if(str!=null&&!str.equals("")){}
当str==null时,后面的表达式就不会继续执行,但是
if(str!=null&!str.equals("")){} 当str==null时,程序会报空指针异常,因为&不具有短路的功能。
③、&同时也是运算符,就是我们通常所说的按位与运算,当&的左右两边都是Boolean型表达式时或Boolean值时,就执行按位与运算。
补充:&的两边(将平时用的十进制数转化为二进制数字才能比较)同时为1,结果才为1,否则只要两把有一个为0结果就为0。
10.构造器(constructor)是否可被重写(override),其规范是什么?
构造器(构造方法)Constructor不能被继承,因此不能重写Override,但可以被重载(Overrload)(不同参数即可)
每一个类必须有自己的构造函数,在创建对象时自己调用,如果添加有参构造函数后,默认无参的构造函数则被覆盖。子类不会覆盖父类的构造函数,但是在创建子类对象的时候,会自动调用父类构造函数。