-
一个完整的URL地址由协议,主机名,端口,文件四个部分组成。
-
在main方法中建立整形数组,如果将其写到一个文件中:DataOutputStream dout = new DataOutputStream(new FileOutputStream(this.filename))
注意:这里的output和input是相对于程序而言的。output是程序把内容输出到文件中。input是把文件的内容输入到程序中。 -
String s[] = new String[10];
那么String s[0]=null。
在Java中是进行默认初始化的,如果是基本类型就初始化为0,布尔类型初始化为false,引用类型初始化为null。 -
Java中的异常
Java中的Throwable分为两类Error和Exception
Error类是严重错误,比如系统奔溃,虚拟机错误,动态链接失败等,这些错误无法恢复或者不可能捕捉。
Java中的异常分为两类,一类是受检查的异常(checked Exception)和运行异常(runtime Exception)- 运行时的异常是程序可以选择捕获处理也可以不处理,这些异常一般是由程序逻辑异常引起的,程序应该从逻辑角度尽量避免运行异常的发生。运行异常的特点是Java编译器不会去检查,也就是说当程序中出现这类异常,try-catch语句处理,没有throws子句声明,它也会编译通过。
- 受检查异常(编译异常)是必须进行处理的,如果不处理,程序就不能编译通过。
红色字体是编译异常,蓝色字体是运行异常。红色字体的编译异常必须在try-catch中处理。
-
Java中的堆和栈
Java把内存分为两种,一种是堆内存,一种是栈内存。- 在函数中一些基本类型变量和对象的引用变量都是在函数的栈内存中分配的。当在一段代码中定义基本变量,java就在栈中为这个变量分配内存空间。当超过这个变量的作用域之后,Java就会释放这个栈内存空间,这个内存空间可以立刻另作他用。
- 堆内存用于存放new创建的对象和数组,在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个变量指向堆中的对象。也就是说,在堆中存储对象的实际内容,在栈中的变量的取值是堆中对象的首地址。
-
Java中的线程
- start()方法是启动一个线程,当是使用thread.start()的时候,就会开启一个线程,并且调用thread.run()。start()不能被重复调用。
- run()方法和普通成员方法一样,可以被重复调用,并且单独调用run()的时候,会在当前线程中执行run(),而不会启动新的线程。
举例子:
public class Main{ public static void main(String[] args){ Thread one = new Mythread("nameone"); Thread two = new Yourthread("nametwo"); one.start(); two.start(); } } class Mythread extends Thread{ public Mythread(String name){ super(name); } public void run(){ for(int i=0;i<3;i++){ System.out.println("myThread : " + Thread.currentThread().getName()+" is running"); } } } class Yourthread extends Thread{ public Yourthread(String name){ super(name); } public void run(){ for(int i=0;i<3;i++){ System.out.println("Yourthread :" + Thread.currentThread().getName()+" is running"); } } }
以上是正确启动两个线程的方法,这个时候的运行结果是不确定的。
如果稍作修改,直接调用run()方法,那么运行结果就是确定的。public class Main{ public static void main(String[] args){ Thread one = new Mythread("nameone"); Thread two = new Yourthread("nametwo"); one.run(); two.run(); } } class Mythread extends Thread{ public Mythread(String name){ super(name); } public void run(){ for(int i=0;i<3;i++){ System.out.println("myThread : " + Thread.currentThread().getName()+" is running"); } } } class Yourthread extends Thread{ public Yourthread(String name){ super(name); } public void run(){ for(int i=0;i<3;i++){ System.out.println("Yourthread :" + Thread.currentThread().getName()+" is running"); } } }
运行结果
-
try-finally语句
public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally{ return 3; } }
这段程序的返回值是3。
注意finally语句是一定会执行的。那么finally语句在执行的时候分为两种情况。
-
finally语句中有return语句:如果try中也有return语句,那么会执行finally里面的代码,并且执行finally中的return语句。也就是说finally中的return会覆盖try中的return。
-
finally语句中没有return语句:如果在try中有return语句并且finally中没有return语句,那么先把return语句中的值保存下来,等待finally语句执行完毕之后返回,并且无论finally语句中如何改变这个变量,返回的值都是不变的
public class Main{ public static void main(String[] args){ System.out.println(fun()); } public static int fun(){ int i = 3; try{ return i; }catch(Exception e){ i = 66; return i; }finally{ i = 88; System.out.println("finally i: " + i); } } }
finally中的语句虽然改变了i的值,但是并没有改变try中的返回值。
-
-
关于代码块的执行顺序
父类的静态代码块和静态变量->子类的静态代码块和静态变量->父类的代码块和变量->父类构造方法->子类代码块和变量->子类的构造方法这里注意静态代码块和静态变量的优先级是一样的,哪个出现在前面就谁先执行。
class A { public A() { System.out.println("class A"); } { System.out.println("I'm A class"); } static { System.out.println("class A static"); } } public class B extends A { public B() { System.out.println("class B"); } { System.out.println("I'm B class"); } static { System.out.println("class B static"); } public static void main(String[] args) { new B(); } }
结果
-
方法重载和方法重写
区别 重载 重写 范围 发生在同一个类 发生在继承类中,子类对于父类的方法进行重写 定义 方法名称相同,参数类型或个数不同,对返回值没有要求,但是返回值不同,不能用来区分重载方法 方法名称,参数类型,返回值类型全部相同,被重写的方法不能拥有更严格的权限 -
File类
Java中的File类是对文件整体或者文件属性操作的类,例如创建文件,删除文件,查看文件是否存在等功能,不能操作文件内容。文件内容使用IO流操作的。
当对文件进行输入的过程中意外到达文件或流的末尾时,抛出EOFException异常。正常情况下读取到文件末尾时,返回一个特殊值表示文件读取完成,例如read()返回-1表示文件读取完成。
笔试错题记录7
最新推荐文章于 2022-03-13 11:59:54 发布