类中引用类型没有赋初值的问题
情况1:类中引用类型默认为null。
public class test3 {
String s;
public static void main(String[] args)
{
test3 test=new test3();
System.out.println(test.s);//输出为null;
}
}
情况2:
public class test3 {
static String s;//若不为static不能在static的main方法中输出
public static void main(String[] args)
{
System.out.println(s);//输出为null;
}
}
情况3:前两种为类内实例域,默认为null;第三种情况为main方法中的局部变量,不初始化不能使用
public class test3 {
public static void main(String[] args)
{
String s;
System.out.println(s);//未初始化变量,不能输出
}
}
Try...catch...finally与直接throws的区别 :try catch是直接处理,处理完成之后程序继续往下执行,throws则是将异常抛给它的上一级处理,程序便不往下执行了(已验证)。本题的catch语句块里面,打印完1之后,又抛出了一个RuntimeException,程序并没有处理它,而是直接抛出,因此执行完finally语句块之后,程序终止了
public class ZeroTest {
public static void main(String[] args) {
try{
int i = 100 / 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}

运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
java标识符规定:标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字 不能当作Java标识符。
关于对象序列化:
能够对对象进行传输的貌似只有ObjectOutputStream和ObjectInputStream这些以Object开头的流对象。
3、实现了Seriallizable接口的类对象才能被序列化。
4、
transient 修饰的变量在对象串化的时侯并不会将所赋值的值保存到传中,串化的对象从磁盘读取出来仍然是null。
声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据。
5、这值得说下Volatile这个修饰符,它是针对多线程情况下出现的。当线程读取它修饰的变量时,都会强迫从主存中重新读取。
java多线程中的
volatile
:
Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.
volatile 变量对所有线程是立即可见的,对 volatile 变量所有的写操作都能立即反应到
其他线程之中,换句话说:volatile 变量在各个线程中是一致的,所以基于 volatile 变量的运算是线程安全的.