浅笑博客
浅笑博客
今天不学习明天变垃圾-学习笔记1127
今天不学习明天变垃圾-学习笔记1127

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

没有标签
首页      未分类      今天不学习明天变垃圾-学习笔记1127

发表评论

textsms
account_circle
email

浅笑博客

今天不学习明天变垃圾-学习笔记1127
1.Java为什么是跨平台语言? Java源代码文件经过编译后生成的不是机器码,而是字节码(“中间码”),字节码文件可在不同平台的JVM上解释成具体平台的机器码并运行。对于Java编程者来说,…
扫描二维码继续阅读
2020-11-27