一: 代码执行顺序
-------father--------
package practice;
public class Father {
static {
System.out.println("父类静态代码块");
}
public Father() {
System.out.println("父类构造方法");
}
{
System.out.println("父类初始化代码块");
}
}
-------son--------
package practice;
public class Son extends Father {
static {
System.out.println("子类静态代码块");
}
public Son() {
System.out.println("子类构造方法");
}
{
System.out.println("子类初始化");
}
public static void main(String[] args) {
new Son();
}
}
解析:父类静态代码块->子类静态代码块->父类初始化代码块->父类构造方法->子类初始化代码块->子类构造
(1)首先初始化父类中的静态成员和静态代码块,按照程序出现的顺序初始化
(2)然后初始化子类中的静态成员和静态代码块,按照程序出现的顺序初始化
(3)其次初始化父类的普通成员和代码块,在执行父类的构造方法
(4)最后初始化子类的普通成员和代码块,在执行子类的构造方法
对象初始时,先给对象的属性赋默认值,然后调用构造方法
二:包装类的缓存设计
-------[-128,127]之间缓存----------
Integer i1=new Integer(123);
Integer i2=new Integer(123);
System.out.println(i1==i2);//false
Integer i3=Integer.valueOf(123);
Integer i4=Integer.valueOf(123);
System.out.println(i3==i4);//true
Integer i5=Integer.valueOf(256);
Integer i6=Integer.valueOf(256);
System.out.println(i5==i6);//false
三:重载和重写的区别,重载的方法能否根据返回类型进行区分
不能,因为方法签名不包括返回值列表
方法头指定修饰符(例如static)、返回值类型、方法名、和形式参数。 方法头中定义的变量称为形参 (形式参数,formal
parameter 或 parameter),形参如同占位符。当方法被调用时,传递一个值给形参,此值称为实参(实际参数, actual
parameter 或 argument),形参列表指的是形参的类型、顺序和形参的数目。 方法名和形参列表共同组成方法签名。
四:char 型变量中能不能存贮一个中文汉字,为什么?
char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。
char c='李';
System.out.println(c);//李
五:什么时候用断言(assert)?
断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关闭的。断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式的值为false,那么系统会报告一个AssertionError。断言的使用如下面的代码所示:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。
要在运行时启用断言,可以在启动JVM时使用-enableassertions或者-ea标记。要在运行时选择禁用断言,可以在启动JVM时使用-da或者-disableassertions标记。要在系统类中启用或禁用断言,可使用-esa或-dsa标记。还可以在包的基础上启用或者禁用断言。
注意:断言不应该以任何方式改变程序的状态。简单的说,如果希望在不满足某些条件时阻止代码的执行,就可以考虑用断言来阻止它。
六:==和equals的区别?
equals 和== 最大的区别是equals是方法,而另一个是运算符。
==:如果比较的是基本数据类型,比较的是数值是否相等
int test=1;
double test1=1;
System.out.println(test==test1);//true
如果比较的是引用数据类型,比较的是对象的地址值是否相等
equals:在 Object 类中,这个方法将判断两个对象是否具有相同的引用。
equals不能用于基本数据类型的变量,如果没有对equals方法进行重写,则判断两个对象是否具有相同的引用。
public boolean equals(Object obj) {
return (this == obj);
}
六:java虚拟机在运行java代码时,首先进行的操作是:加载代码
1)编译器把java文件编译成class文件
2)java虚拟机对class文件进行加载,校验和执行。