1.Java为什么是跨平台语言?
Java源代码文件经过编译后生成的不是机器码,而是字节码(“中间码”),字节码文件可在不同平台的JVM上解释成具体平台的机器码并运行。对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。
2.JVM执行的字节码还是机器码?
Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令(机器码)执行。
3.抽象类和接口的区别?
接口中只能有public abstract方法(默认也如此),抽象类中除了可以有抽象方法,也可以有具体方法且访问控制符可以是public或protected等。
接口中的变量只能是public static final的,抽象类无限制。
一个类可以实现implements多个接口,只能继承extends一个基类。
一个非抽象类实现implements了一个接口或继承一个抽象父类,则都必须实现其中的所有抽象方法。如果只需要实现其中的一部分抽象方法,则可以继续将该类定义为抽象的。
模板方法设计模式即抽象类的基本应用,父类方法中间的某段代码不确定,留给子类干。
对于该问题的本质理解,还要结合面向对象设计原则和具体问题的抽象和理解.可以结合Door的例子来理解.
https://www.cnblogs.com/azai/archive/2009/11/10/1599584.html
4.按值传递和按引用传递的区别?
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话,运行效率自然就变低了,所以java在传递数据量很小的数据是值传递,比如java中的各种基本类型:int,float,double,boolean等。
引用传递其实就弥补了上面说的不足,如果每次传参数的时候都复制一份的话,如果这个参数占用的内存空间太大的话,运行效率会很底下,所以引用传递就是直接把内存地址传过去,也就是说引用传递时,操作的其实都是源数据,这样的话修改有时候会冲突,记得用逻辑弥补下就好了,具体的数据类型就比较多了,比如Object,二维数组,List,Map等除了基本类型的参数都是引用传递。
5.sleep方法和wait方法的区别?
wait是Object类的实例方法,sleep是Thread类的静态方法
wait方法必须要在synchronized中(同步方法或同步代码块)调用,sleep不需要
wait调用后会释放锁对象,sleep不会。
6.try catch finally的理解?
try/catch/finally 语句用于处理代码中可能出现的错误信息。finally 语句在 try 和 catch 之后无论有无异常都会执行。
catch 和 finally 语句都是可选的,但你在使用 try 语句时必须至少使用一个。
如果所运行的代码throws了Throwable(Exception继承自Throwable)对象(非运行时异常,即受检测异常),则所调用处必须要使用try catch或该调用所处的方法同样需要throws申明。
finally通常配合try在无论有无异常都会执行,适用于如文件读写流打开后的一些操作如果发送错误,最终也要关闭打开的文件流。
补充:Throwable类是Error类和Exception的父类,Error是编译时错误和系统错误,系统错误在除特殊情况下,都不需要关心,基本不会出现。而编译时错误,如果你使用了编译器,那么编译器会提示。Exception是可被抛出的基本类型。Exception有子类RuntimeException(运行是异常),所有运行时异常不受检查,开发者可以不去管,也可以去管,其他Exception为受检查异常,必须由开发者捕获处理后才能编译通过。
7.2个线程交替打印0-100
public class A {
public static Object lock = new Object();
public static int i;
public static void printOdd() {
while (i <= 100) {
synchronized (lock) {
if (i % 2 != 0) {
System.out.println(i++);
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void printEven(){
while (i <= 100) {
synchronized (lock) {
if (i % 2 == 0) {
System.out.println(i++);
lock.notify();
} else {
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable(){
@Override
public void run() {
printOdd();
}
},"thread1");
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
printEven();
}
},"thread2");
thread1.start();
thread2.start();
}
}
8.如下代码运行结果
public static void main(String[] args) {
DataOutputStream out = null;
DataInputStream in = null;
try {
out = new DataOutputStream(new FileOutputStream("file1.file"));
out.writeChars("我爱你");//p1
in = new DataInputStream(new FileInputStream("file1.file"));
String a = in.readUTF();//p2
System.out.println(a);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
out.close();
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:p2处抛出EOFException
发表评论