访问修饰符public,private,protected,以及不写时的区别?
答:
Java面向对象四种基本特性
答:
Java面向对象四种基本特性:抽象、封装、继承、多态,可以这么理解,多态体现在抽象、封装以及继承上,而抽象、继承、封装体现在Java中的多态特性中. 也可以这么理解:多态是抽象、封装、继承的体现,抽象、封装、继承是多态的基础. Java中的多态就是对同一类消做出不同响应就叫做多态,Java中23中设计模式很大一部分就就是利用Java中多态来完成的. 其目的就是为了解耦
重载和重写的设计思想
答:
编译时期的多态既方法重载,这是静态分派(也就是对象的静态类型): 就是在编译时期对象找方法是根据静态类型来查找的. 如果不知道这一点的应该去仔细复习下深入理解Java虚拟机中相关章节.
运行时多态既方法的重写:这是一种动态分配,既会根据对象的实体类型进行分配.
众所周知Java中的多态分为两种,第一种:方法重载的多态,第二种:方法重写的多态。 或许我在表达上可能语言不是很准确, 但是对于我目前自己的理解上来看,Java中的多态目前就是这两种性质的多态. 或许我的理解在教科书上没有体现出来, 但是我觉的那也是多态的一种体现.
下面两个代码块能正常编译和执行吗?
// 代码块1
short s1 = 1; s1 = s1 + 1;
// 代码块2
short s1 = 1; s1 += 1;
答:
代码块1编译报错,错误原因是:不兼容的类型: 从int转换到short可能会有损失”。
代码块2正常编译和执行。
其实,s1 += 1 相当于 s1 = (short)(s1 + 1)
基础考察,指出下题的输出结果
public static void main(String[] args) {
Integer a = 128, b = 128, c = 127, d = 127;
System.out.println(a == b);
System.out.println(c == d);
}
答:
false,true。
原因:执行 Integer a = 128,相当于执行:Integer a = Integer.valueOf(128),基本类型自动转换为包装类的过程称为自动装箱(autoboxing)。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在 Integer 中引入了 IntegerCache 来缓存一定范围的值,IntegerCache 默认情况下范围为:-128~127。
本题中的 127 命中了 IntegerCache,所以 c 和 d 是相同对象,而 128 则没有命中,所以 a 和 b 是不同对象。
但是这个缓存范围时可以修改的,可能有些人不知道。可以通过JVM启动参数:-XX:AutoBoxCacheMax= 来修改上限值,如下图所示:
&和&&的区别?
答:
&&:逻辑与运算符。当运算符左右两边的表达式都为 true,才返回 true。同时具有短路性,如果第一个表达式为 false,则直接返回 false。
&:逻辑与运算符、按位与运算符。
按位与运算符:用于二进制的计算,只有对应的两个二进位均为1时,结果位才为1 ,否则为0。
逻辑与运算符:& 在用于逻辑与时,和 && 的区别是不具有短路性。所在通常使用逻辑与运算符都会使用 &&,而 & 更多的适用于位运算。
String 是 Java 基本数据类型吗?
答:
不是。Java 中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type)。
小结
1.基本数据类型:数据直接存储在栈上
2.引用数据类型区别:数据存储在堆上,栈上只存储引用地址
String 类可以继承吗?
答:
不行。String 类使用 final 修饰,无法被继承。
String和StringBuilder、StringBuffer的区别?
String
:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。
StringBuffer
:跟 String 类似,但是值可以被修改,使用 synchronized 来保证线程安全。
StringBuilder
:StringBuffer 的非线程安全版本,没有使用 synchronized,具有更高的性能,推荐优先使用。
String s = new String(“xyz”) 创建了几个字符串对象?
答:
一个或两个。如果字符串常量池已经有“xyz”,则是一个;否则,两个。
当字符创常量池没有 “xyz”,此时会创建如下两个对象:
一个是字符串字面量 “xyz” 所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。
另一个是通过 new String() 创建并初始化的,内容与"xyz"相同的实例,也是在堆中。
String s = “xyz” 和 String s = new String(“xyz”) 区别?
答:
两个语句都会先去字符串常量池中检查是否已经存在 “xyz”,如果有则直接使用,如果没有则会在常量池中创建 “xyz” 对象。
另外,String s = new String(“xyz”) 还会通过 new String() 在堆里创建一个内容与 “xyz” 相同的对象实例。
所以前者其实理解为被后者的所包含。
两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?
答:
不对。hashCode() 和 equals() 之间的关系如下:
当有 a.equals(b) == true 时,则 a.hashCode() == b.hashCode() 必然成立,
反过来,当 a.hashCode() == b.hashCode() 时,a.equals(b) 不一定为 true。
什么是反射
答:
反射是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为反射机制。
深拷贝和浅拷贝区别是什么?
答:
数据分为基本数据类型和引用数据类型。基本数据类型:数据直接存储在栈中;引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存里。
浅拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值随之改变。
深拷贝:对于基础数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。
深拷贝相比于浅拷贝速度较慢并且花销较大。