一、构造方法能不能被继承
当然不能,1.构造方法是类的唯一入口
2.构造方法与类名相同
3.子类构造方法中隐式的调用了父类的构造方法
二、值传递和引用传递、不变类和可变类、直接赋值和浅拷贝和深拷贝
1.直接赋值:在java中,对象的传递、方法参数的传递(将实参赋值给行参)多数是通过=来直接赋值的
值传递是值的copy
引用传递是引用的copy,即内存地址的copy
引用传递又分两种 1.如果是不变类 对引用的操作不会改变原引用地址,但会改变现引用地址的值,他们指向不同的对象(new对象除外)
2.如果是可变类 对引用的操作不会改变原引用地址,但会改变对象的值,他们指向的是同一个对象(new对象除外)
3.不管是可变不可变,只要使用new来重新赋值,则是一个新的引用与对象,不会修改原来的引用与对象
2.浅拷贝:对象实现cloneable接口,重写clone类,可以拷贝对象内的基本数据类型以及不变类型,引用类型不会被拷贝
3.深拷贝:对象中的引用类型也实现cloneable接口。。。
修改引用时new新的对象,如get、set时
序列化(腌酸菜、冷藏)
可变类:提供修改自身的方法,不可变类:要修改对象时必须new一个对象,如String、基本类型的包装类、BigInteger、BigDecimal等。(不可变类是线程安全的)
三、String、StringBuffer与StringBuilder之间区别
String:字符串常量,不可变类
StringBuilder:字符串变量,线程非安全类
StringBuffer:字符串变量,线程安全
延伸:String str = “This is only a” + “ simple” + “ test”;jvm只生成了一个String对象
String str2 = “This is only a”; String str3 = “ simple”; String str4 = “ test”; String str1 = str2 +str3 + str4; jvm生成了好多String对象
四、i=i++问题
1 int i = 0; 2 for(j=0;j<5;j++){ 3 i=i++; 4 }
最后输出的是0,在jvm内,i=i++实际执行可以理解成这样
int temp = i; i++; i = temp;
步骤1 JVM把count值(其值是0)拷贝到临时变量区。 步骤2 count值加1,这时候count的值是1。 步骤3 返回临时变量区的值,注意这个值是0,没修改过。 步骤4 返回值赋值给count,此时count值被重置成0。
五、equals,hashcode和==的区别
java中有两种数据类型:
1.基本数据类型,也称原始数据类型
byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。
2.引用类型(类、接口、数组)
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
==:比较基本数据类型的值,比较引用类型内存地址
equals:比较内存地址中的对象是否为相同对象,equals比较八大包装对象(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址
hashcode:hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
注:java规定,equals后两个对象一致,hashcode必须一致;equals不一致时,hashcode可能一致;
但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。减少hash碰撞
六、java常量池及包装类型常量池