目录
一,求下面代码输出什么?
static的代码块为静态代码块:类加载时,马上执行并且只执行一次(比主方法快)
{} 对象代码块:比静态代码块慢,但是比构造器快
Test() :构造器但是构造器当中out改为err时,结果就会一直改变(不确定的,下图只是二种情况)
原因:out修饰的对象有缓冲,err修饰的对象无缓存,在控制台上的输出是二个对象的输出,是没有顺序的。
二,求下面程序的运行结果
?
Integer是int的自动装箱为一个对象,需要查看源码来进行解答(IntegerCache)
?就是当int值(-128~127)初始化取值时,就从缓存当中选择。所以num1 == num2是同一个对象(地址相同),当值大于127时,自动装箱为一个新对象(new关键字创建一个对象),开辟一个新内存空间,所以? nmu3 != num4。?
三,下面程序运行的输出结果是多少?
?原因解析(大家可以和小编一样打上断点调试,方便思考):当程序从main函数进入后,先执行代码3(上图第三行代码),要创建一个类对象就要进入类当中去,执行9, 因为要new一个Singleton对象,先进入构造器当中创建属性(int默认就是0),然后属性++,counter1与counter2都是1,然后属性进行赋值语句10,11,counter2赋值为o,所以出现了答案0,1
四,下面代码输出的是什么?
原因:此题考的是优先级的问题,当优先级相同时候,计算规则先乘除后加减,当全部为+时,从第一个开始,当是字符串是就是字符串的拼接问题,当是数子时就是简单计算问题
?五,下面代码输出什么(笔试常见)
原因(查看一下StringBuffere下equals的方法):继承的是Object的方法,比较的是对象的引用是否相等,而StringBuffere是创建一个新对象,所以二个对象是不相等的。(String下的equals是经过重写的)
六,五的扩展题
?原因(源码):sb3的添加"de",但是对象地址并没有改变,所以返回ture
七:下面代码输出什么
原因:99.9与9进行运算时,小的范围与大的范围进行计算时,向大的进行转换。
八,下面代码输出什么?
?原因:n = 0 当 执行 n = n++时,先将n=n,右别的n在++,但是不会赋值给左别的n
九,下面代码输出什么?
?原因:String与Obiect形参在方法重载时,都是不精准的,在Java底层中找二者中更精准的。(所有的string都可以是obiect,但不是所有的object是String)
一,求下面代码输出什么?
public class Test {
static {
//静态代码块,类加载一次,执行并且只执行一次
System.out.println("1");
}
{
//对象代码块,创建对象的时候执行,比构造器先执行
System.out.println("2");
}
public Test(){
//构造器
System.err.println("3");
}
public static void main(String[] args) {
new Test();
}
}
static的代码块为静态代码块:类加载时,马上执行并且只执行一次(比主方法快)
{} 对象代码块:比静态代码块慢,但是比构造器快
Test() :构造器但是构造器当中out改为err时,结果就会一直改变(不确定的,下图只是二种情况)
原因:out修饰的对象有缓冲,err修饰的对象无缓存,在控制台上的输出是二个对象的输出,是没有顺序的。
二,求下面程序的运行结果
public class Test {
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2);
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4);
}
}
Integer是int的自动装箱为一个对象,需要查看源码来进行解答(IntegerCache)
?就是当int值(-128~127)初始化取值时,就从缓存当中选择。所以num1 == num2是同一个对象(地址相同),当值大于127时,自动装箱为一个新对象(new关键字创建一个对象),开辟一个新内存空间,所以? nmu3 != num4。?
三,下面程序运行的输出结果是多少?
public class Test {
public static void main(String[] args) {
Singleton s = Singleton.getSingleton();
System.out.println("counter1 = "+s.counter1);
System.out.println("counter2 = "+s.counter2);
}
}
class Singleton{
private static Singleton singleton = new Singleton();
public static int counter1;
public static int counter2 = 0 ;
private Singleton(){
counter1++;
counter2++;
}
public static Singleton getSingleton(){
return singleton;
}
}
?原因解析(大家可以和小编一样打上断点调试,方便思考):当程序从main函数进入后,先执行代码3(上图第三行代码),要创建一个类对象就要进入类当中去,执行9, 因为要new一个Singleton对象,先进入构造器当中创建属性(int默认就是0),然后属性++,counter1与counter2都是1,然后属性进行赋值语句10,11,counter2赋值为o,所以出现了答案0,1
四,下面代码输出的是什么?
public class Test {
public static void main(String[] args) {
int num1 = 10, num2 =10;
System.err.println("num1 + num2 =" + num1 + num2);
System.err.println("num1 - num2 =" + (num1 - num2));
System.err.println("num1 * num2 =" + num1 * num2);
System.err.println("num1 / num2 =" + num1 / num2);
}
}
原因:此题考的是优先级的问题,当优先级相同时候,计算规则先乘除后加减,当全部为+时,从第一个开始,当是字符串是就是字符串的拼接问题,当是数子时就是简单计算问题
?五,下面代码输出什么(笔试常见)
public class Test {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));
// StringBuffer是可变字符串
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1.equals(sb2));
}
}
原因(查看一下StringBuffere下equals的方法):继承的是Object的方法,比较的是对象的引用是否相等,而StringBuffere是创建一个新对象,所以二个对象是不相等的。(String下的equals是经过重写的)
StringBuffere下equals的方法:
?string下的equals的方法:
六,五的扩展题
public class Test {
public static void main(String[] args) {
// StringBuffer是可变字符串
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1.equals(sb2));
StringBuffer sb3 = new StringBuffer("abc");
StringBuffer sb4 = sb3.append("de");
System.out.println(sb3.equals(sb4));
}
}
?原因(源码):sb3的添加"de",但是对象地址并没有改变,所以返回ture
?StringBuffere下equals的方法:
七:下面代码输出什么
public class Test {
public static void main(String[] args) {
int n =4;
System.out.println("value is "+ ((n>4) ? 99.9:9));
}
}
原因:99.9与9进行运算时,小的范围与大的范围进行计算时,向大的进行转换。
八,下面代码输出什么?
public class Test {
public static void main(String[] args) {
int n = 0 ;
for (int i = 0;i<100;i++){
n = n++;
}
System.out.println("n = "+ n);
}
}
?原因:n = 0 当 执行 n = n++时,先将n=n,右别的n在++,但是不会赋值给左别的n
九,下面代码输出什么?
public class Test {
public static void main(String[] args) {
Test test = new Test() ;
test.myMethod(null);
}
public void myMethod(String str){
System.out.println("string");
}
public void myMethod(Object obj){
System.out.println("object");
}
}
?原因:String与Obiect形参在方法重载时,都是不精准的,在Java底层中找二者中更精准的。(所有的string都可以是obiect,但不是所有的object是String)
|