Java面试基础01,java面试01
Java面试基础01,java面试01
1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件可以被编译成能被Java虚拟机执行的字节码文件。
Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者重新编译。
2、JDK和JRE的区别是什么?
jre是Java运行时环境,包括Java虚拟机、Java核心类库和支持文件。不包括开发工具JDK
jdk开发工具包是完整的Java软件开发包,包含了JRE、编译器和其他的工具,可以让开发者开发编译执行Java应用程序。
3、static关键字意思,Java是否可以覆盖一个private和static方法?
static关键字表示一个成员变量或者成员方法可以在没有实例的情况下访问。
Java的static方法不可以被覆盖,方法覆盖(重写)是基于运行时绑定的,static是基于编译时静态绑定的。static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
4、Java基本数据类型,什么是自动拆装箱?
整型:byte short int long 浮点:float double 字符型:char 布尔型:Boolean
Java支持的数据类型包括两种,一个是基本数据类型,一个是引用类型,引用类型包括类、接口、数组等。string类型,其实是对象的引用,jvm虚拟机栈存的是对象的引用变量,基本数据类型变量。堆中存放引用类型对象。
5、Java的方法覆盖和方法重载区别
方法覆盖是指子类覆盖父类的方法,要求方法名、返回值、参数列表相同。子类的方法修饰符要小于父类的权限,不能比父类抛出更多的异常。属于运行时多态
方法重载是指在一个类中,允许有多个方法名相同的方法,要求参数列表必须不同。属于编译时多态。
多态的三个条件:继承,、重写、向上转型
6、Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?
一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。一般函数不能调用构造函数,只有构造函数才能调用构造函数。
构造函数的特点
1、函数名与类名相同
2、不用定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;构造函数是连类型都没有)
3、不可以写return语句。(返回值类型都没有,也就不需要return语句了)
7、进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行子序列,一个进程可以有多个线程。进程内0的线程共享,其他进程不可见。
8、Java如何创建线程?
编写多线程是为了实现多任务的并发执行,从而能更好的与用户交互。一般有四种方法。Thread类、Runnable接口、Callable接口和Excutor框架来创建线程池。
Runnable和Callable的区别是
①前者规定是run()方法,后者是call()方法
②前者无返回值,后者可返回值
③run方法无法抛异常,call可以抛异常
④运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
1、Runnable接口创建Thread线程
class SomeRunnable implements Runnable {
public void run () {
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
}
2、通过继承Thread类来创建一个线程
class SomeThread extends Thread {
public void run(){
}
SomeThread oneThread = new SomeThread();
oneThread.start();
}
3、通过Callable接口 创建线程
public class Test {
public static void main(String[] args) {
Test test = new Test();
//Lambda表达式创建Callable对象。
FutureTask<Integer> task = new FutureTask<Integer>((Callable<Integer>)()->{
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+"循环变量i的值:"+i);
}
return i;
});
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"循环变量i的值:"+i);
if(i==20){
new Thread(task,"有返回值的线程").start();
}
try{
System.out.println("子线程的返回值:"+task.get());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
}
相关文章
- 暂无相关文章
用户点评