1. JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些
JDK = JRE + Java的开发工具(javac.exe,java.exe,javadoc.exe)
JRD = JVM + Java核心类库
2. 常用的几个命令行操作都有哪些?(至少4个)
cd:打开目录,改变盘符
md:创建目录
rd:删除目录
del:删除文件
cd…:返回上级目录
dir:显示目录
3. switch后面使用的表达式可以是哪些数据类型的。
byte 、 short 、char 、int 、枚举类型变量、String类型。
4. 面向对象思想编程内容的三条主线分别是什么
- 类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的三大特征:封装、继承、多态
- 其它关键字:this,super,abstract,interface,static,final,package,import
5. 说明Java方法中的参数传递机制的具体体现?
基本数据类型:数据值
引用数据类型:地址值 (含变量的数据类型)
6. 什么是多态性?什么是虚拟方法调用?
对象的多态性:父类的引用指向子类的对象。
Person p = new Man(); // 左父右子
p.eat();
调用方法时,编译时看左边,运行时看右边。
虚拟方法调用与普通调用:
正常的方法调用:
V1 e = new V1();
e.setz();
Test3 e = new Test3();
e.setz();
虚拟方法调用(多态情况下):
V1 e = new Test3();
e.setz(); //调用Test3类的getInfo()方法
7. 方法的重写(override/overwrite)的具体规则有哪些?
- 方法名、形参列表相同
- 权限修饰符
- 返回值
- 抛出的异常
8. 如何实现向下转型?需要注意什么问题?如何解决此问题?
Person p = new Man();
//使用强转符:()
Man m = (Man)p;
//可能ClassCastException异常。
//使用instanceof在进行向下转型前判断。
if(p instanceof Man){
Man m = (Man)p;
}
9. ==和equals的区别,equals和hashCode的区别?
- ==用于基本数据类型用比较,比较的是值是否相等
- ==用于引用类型对象,比较的是在内存中的地址是否相等
- Equals表示引用所指内容是否相等。
10. 代码实现单例模式
单例模式:确保一个类只有一个实例,并为整个系统提供一个全局访问点 (向整个系统提供这个实例)。
饿汉式:
// 饿汉式单例
public class Singleton1 {
// 指向自己实例的私有静态引用,主动创建
private static Singleton1 singleton1 = new Singleton1();
// 私有的构造方法
private Singleton1(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
public static Singleton1 getSingleton1(){
return singleton1;
}
}
懒汉式:
// 懒汉式单例
public class Singleton2 {
// 指向自己实例的私有静态引用
private static Singleton2 singleton2;
// 私有的构造方法
private Singleton2(){}
// 以自己实例为返回值的静态的公有方法,静态工厂方法
public static Singleton2 getSingleton2(){
// 被动创建,在真正需要使用时才去创建
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
- 从速度和反应时间角度来讲,饿汉式(又称立即加载)要好一些;
- 从资源利用效率上说,懒汉式(又称延迟加载)要好一些。
11. 抽象类和接口有哪些共同点和区别?
-
相同点:不能实例化,都可以被继承
-
不同点:抽象类:有构造器。 接口:不能声明构造器
抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。
12. Java内存区域划分:
1. 栈:
在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配。栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
2. 堆:
**通过new生成的对象**都存放在堆中,对于堆中的对象**生命周期的管理由Java虚拟机的垃圾回收机制GC进行回收和统一管理**。优点是可以**动态分配内存大小**,缺点是由于动态分配内存导致**存取速度慢**。
3. 方法区:
是各个线程共享的内存区域,它用于存储class二进制文件,包含了虚拟机加载的类信息、常量(常量池)、静态变量(静态域)、即时编译后的代码等数据。
1. 常量池:
常量池在编译期间就将一部分数据存放于该区域,包含以final修饰的基本数据类型的常量值、String字符串。
2. 静态域:
存放类中以static声明的静态成员变量。
3. 程序计数器
当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。
13. 内存分配综合情况分析:
public class Dog {
Collar c;
String name;
//1. main()方法位于栈上
public static void main(String[] args) {
//2. 在栈上创建引用变量d,但Dog对象尚未存在
Dog d;
//3. 创建新的Dog对象,并将其赋予d引用变量
d = new Dog();
//4. 将引用变量的一个副本传递给go()方法
d.go(d);
}
//5. 将go()方法置于栈上,并将dog参数作为局部变量
void go(Dog dog){
//6. 在堆上创建新的Collar对象,并将其赋予Dog的实例变量
c =new Collar();
}
//7.将setName()添加到栈上,并将dogName参数作为其局部变量
void setName(String dogName){
//8. name的实例对象也引用String对象
name=dogName;
}
//9. 程序执行完成后,setName()将会完成并从栈中清除,此时,局部变量dogName也会消失,尽管它所引用的String仍在堆上
}
14. Java中是如何支持正则表达式操作的?
Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。
此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作,如:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class RegExpTest {
public static void main(String[] args) {
String str = "成都市(成华区)(武侯区)(高新区)";
Pattern p = Pattern.compile(".*?(?=\\()");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(m.group());
}
}
}
15. 数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?
Array和ArrayList的不同点:
- Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- Array大小是固定的,ArrayList的大小是动态变化的。
- ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
- 对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
16. 什么是值传递和引用传递?
- 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
- 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 所以对引用对象进行操作会同时改变原对象. 一般认为,java内的传递都是值传递.
17. JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。
在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。
当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。
Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。
一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throw)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有”异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的”异常”的类型。
throw语句用来明确地抛出一个”异常”。(写在方法体内)
throws用来标明一个成员函数可能抛出的各种”异常”。(写在函数声明处)
Finally为确保一段代码不管发生什么”异常”都被执行一段代码。
可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,”异常“的框架就放到堆栈上面,直到所有的try语句都完成。
如果下一级的try语句没有对某种”异常”进行处理,堆栈就会展开,直到遇到有处理这种”异常”的try语句。
18. 说明一下final, finally, finalize的区别
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。