1.方法重写与重载?
答:方法重写遵循以下几个原则:三同,一小,一大:
三同:重写方法的函数名,参数类型,返回值类型相同;
一小:即子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等;
一大:即子类方法的访问修饰符比父类方法更大或相等。
重载即在一个类中有多个函数名相同的函数,重载的条件是:函数名相同,参数类型不同,参数个数不同,参数次序不同,但注意,对参数的返回值没有要求,可以相同,也可以不相同,
2.包装类?
答:即对基本类型进行修饰的类,各个基本类型对应的包装类有:
byte->Byte,short->Short,int->Integer,long->Long,float->Float,double->Double,char->Character,boolean->Boolean。
3.移位运算符?
答:"<<"表示左移位,”>>"表示带符号右移位,“>>"表示无符号右移位。
4.类实例的初始化过程:
答:对于实例化一个类来说,类的加载过程就可以帮助我们理解初始化过程,在带有继承的关系的类中,初始化一个类的过程如下:⑴先初始化父类中的静态变量和静态代码块⑵然后再初始化子类中的静态变量和静态代码块⑶初始化父类的普通成员变量和代码块,在执行父类的构造方法,注意:和构造器和普通成员变量的执行顺序和其位置的前后顺序无关⑷初始化子类的普通成员变量和代码块,然后再执行子类的构造方法。在一个类的实例化过程中,先执行的是静态域,in而静态域中包含静态变量、静态块和静态方法,其中需要初始化的是静态变量和静态块.而他们两个的初始化顺序是靠他们俩的位置决定的!
5.Integer的赋值问题?
答:Integer是int类型的包装类,当我们在为Integer赋值的时候,其实是调用其ValueOf()方法,eg:
Integer number = 100 ==> Integer number = Integer.valueOf(100);
valueOf的源码为:
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从源代码中的IntegerCache类中可以看到IntegerCache.high的值指定为127,IntegerCache.low的值为-128,即当值在这个范围时,Java会对其缓存,而当值超出这个范围,则会重新在堆中创建一个对象。
6.抽象类和接口?
答:抽象类更多的为了降低代码的冗余,实现代码的重用,而结构更多的是为了定义模块之间的通信。抽象类和接口的区别:
⑴抽象类只能被继承,接口只能被实例化,一个类一次只能继承一个抽象对象,而一个类一次可以实现多个接口;
⑵抽象类中可以有普通成员变量,普通方法,静态属性,静态方法,抽象方法,抽象类不一定有抽象方法;
⑶抽象类中的抽象方法不能用private,static,synchronized,native访问修饰符;
⑷接口中只有常量,在定义变量的时候,在编译的时候会默认加上public static final;
⑸接口中的方法,永远都被public来修饰;
7.访问权限的大小顺序?
答:由大到小的顺序为: public -> protected ->默认 ->private。public修饰可以被任何地方,同一个包,类内部,子类访问,protected修饰可以在同一个包,类内部,子类访问,default修饰的类被类内部和同一个包,private修饰的只能被类内部访问。
8.finally,finalize?
答:finally是在try{}catch(){}finally{}结构中使用,它表示总会执行finally的语句。只有在特殊情况下才不执行finally中的语句:⑴在进入try语句之前出现了异常,finally语句不执行⑵在try中调用System.exit(0),强制退出了程序。finalize在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
9.内部类和外部类?
答:内部类可以用static,public,protected,default,private 修饰,外部类的修饰符只能是public ,abstract,final.
10.标识符?
答:标识符必须是数字,字母,下划线,$符号,并且,数字不能放在标识符的开头,同时,也不能是关键字。
11.Collection接口,Map接口?
答:Collection接口下的接口有:List,Set,Queue,SortedSet,List接口的实现类有:ArrayList,ListList,Vector。Map接口的实现有:HashMap,HashTable,TreeMap,IdentityHashMap,WeakHashMap。注意:不要讲Map接口理解到Collection接口中。
11.字符串toLowerCase()方法?
答:字符串的实例比较复杂,我们一一解释:
String name = " liuD"; 在方法区中创建一个liuD的字符串;
String name2 = new String("liuD") , 首先是在堆中创建一个对象,这个对象指向方法区中的“liuD"字符串,如果方法区中没有,则会在方法区中创建这个对象,并指向它,注意这里的name1和name2,因为两者在不同的区域;
String name3 = new String("liuD"),这里创建创建方法和name2相同,但name3==name2的结果为false,因为他们在堆中的地址不相同的,name2,3保存的是其在堆中的地址,但是它们都指向方法区中的"liuD";如果想让name2,3相等,则可以重写equal方法。
再来说说String的toLowerCase方法,我们一步一步追踪代码:
name2.toLowerCase();
public String toLowerCase() {
return toLowerCase(Locale.getDefault());
}
public String toLowerCase(Locale locale) {
return isLatin1() ? StringLatin1.toLowerCase(this, value, locale)
: StringUTF16.toLowerCase(this, value, locale);
}
public static String toLowerCase(String str, byte[] value, Locale locale) {
if (locale == null) {
throw new NullPointerException();
}
if (first == len)
.......
return new String(result, LATIN1);
}
可以看到,最后其实返回的是一个新的字符串对象, 即 new String();
12.有关ArrayList扩容问题?
答:ArrayList的构造函数共有三个:
⑴ArrayList()构造一个初始容量为 10 的空列表。
⑵ArrayList(Collection<? extends E> c)构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。
⑶ArrayList(int initialCapacity)构造一个具有指定初始容量的空列表。
提示:map的初始容量是16,负载因子为:0.75。
13.引用类型传递参数?
答:对于传递参数,Java的传递是值传递,即对于基本类型而言,传递的其值的副本,修改其副本对原始值没有任何影响,而对于引用类型,传递的其地址,对其地址的值的修改,会与原本的值同步。eg:(题来自牛客网题库)
public class Tester{
public static void main(String[] args){
Integer var1=new Integer(1);
Integer var2=var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
integer=new Integer(2);
}
}
解析:
14.实现了GBK编码字节流到UTF-8编码字节流的转换
答:使用String的构造函数,String(src,"GBK").getBytes("UTF-8");
15.try-catch-finally?
答:正常情况下,是执行完try后,在执行finally中的语句,当try中有return关键字时,finally中的语句是在return之前执行的。
16.类型转换?
答:Java中,类型的转换分为自动转化和强制转化,自动转换即从占用字节小的类型向占用字节大的类型进行转化,自动转换不需要任何设置,强制类型转换则是从占用字节大的类型向占用字节小的类型的转化,强制转化需要使用(强制转换类型)的方式,可能造成精度丢失。
不同类型之间的优先关系为:byte-short-char-int-long-float-double;
类型 | 欲转换类型 | 转换后的类型 |
byte 、 short 、 char | int | int |
byte 、 short 、 char 、 int | long | long |
byte 、 short 、 char 、 int 、 long | float | float |
byte 、 short 、 char 、 int 、 long 、 float | double | double |
注意:float类型到long类型,不需要类型转换,因为float类型虽然占据4字节,long类型占据8字节,但是float底层的存储于long不同,float所存储的书的范围比long还要大。
17.异常
答:异常分为编译型异常和运行时异常,编译时异常必须显示处理,运行时异常必须交给虚拟机。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,整个程序也就退出了。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
18.floor,cell,round
答:Math.floor() 表示向下取整,返回double类型 ;Math.ceil() 表示向上取整,返回double类型 ;Math.round() 四舍五入,返回int类型。
19.存在继承关系的类,实例化子类
答:有关执行顺序,序号4有介绍,这里介绍super应该注意的问题,但调用子类的构造器时,会首先去调用父类的构造器,如果父类构造器中没有有参数的构造器,则执行默认的无参构造器,如果父类中是带参数的构造器,而没有无参构造器,则在执行子类构造器时,需要在子类构造器中使用super关键字,并加上参数,否则会报错。
20.指定数组长度
答:Java中,数组的大小不需要在声明的时候指定,只需要在创建实例化对象的时候,才可以给定数组的长度。
21.finalize方法
答:finalize()是用来实现回收前的资源清理工作。Java虚拟机一旦判断出该对象为不可达对象,则该对象就处于可回收状态,会判断对象是否重写了Object类的finalize方法,如果没有,则直接回收,如果重写了finalize方法,而且未执行该方法,则把该对象放入F-Queue队列,另一个线程会定时遍历F-Queue队列, 并执行该队列中各个对象的finalize方法,finalize方法执行完毕后,GC则判断该对象是否可被回收,如果可以,则进行回收,此时,如果该对象上有强引用,则改对象复活。
如有异议,敬请指出,谢谢。