java题目整理

来源:互联网 发布:java swing 做登录界面 编辑:程序博客网 时间:2024/06/03 18:09

整理平时遇到的题目.

1.如下会输出什么?

public class Demo1 {public static void main(String[] args) {int c = -128;System.out.println(Integer.toBinaryString(c));  //11111111 11111111 11111111 10000000.short a = 128;byte b = (byte) a;System.out.println(a);  //128System.out.println(b);//-128}}

解:java用补码表示,原码反码补码直接的转换关系是:

1.原码:正数第一位用0,负数第一位用1表示,其他位就是其二进制表示,例如 3的原码00000011   -3的 原码 10000011

2.反码:负数原码按位取反(符号位不变)。正数原码本身。  3的反码00000011   -3的反码11111100

3.补码: 负数反码+1,正数原码本身。3的补码是00000011  -3的补码是11111101

所以程序中c为int的-128,-128的原码为10000000 00000000 00000000 10000000,反码为11111111 11111111 11111111 011111111,

补码为11111111 11111111 11111111 10000000.即补码为最终的输出.

下面的两个输出,a是short,2个字节,强转为byte,截取前8位,就变成了10000000,也就是说这是b的补码表示,所以可知其代表的是-128

(这里需要注意10000000的特殊性,按照规则来推的话是退不出-128的,具体的请百度)

2.如下会输出什么?

public class Demo2 {public static void main(String[] args) {System.out.println(~5);}}

解:~ 为取反操作,将-5表示成2进制,取反,得到~5的二进制表示,注意此时是补码,所以从补码推出原码再推出其代表的10进制数:-6

3.Which keyword can protect a class in a package from accessibility by the classes outside the package?

解:default.注意这题不是protected,protected表示子类可以访问,如果子类父类不在一个包也是可以访问的,与题目就矛盾。而default则为只有同一个类或者包里可以访问.

4.如下输出什么?

public class Demo1 {private static final String MESSAGE = "taobao";public static void main(String[] args) {String a = "tao" + "bao";String b = "tao";String c = "bao";final String d = "tao";final String f = "bao";String e = new String("tao"+"bao");System.out.println(a == MESSAGE);System.out.println(e ==MESSAGE);System.out.println((b + c) == MESSAGE);System.out.println((b + c).intern() == MESSAGE);System.out.println((d+f) ==MESSAGE);}}

解:true,false,false,true,true

此题考察的就是String的特殊性以及编译器优化,首先对于以下2种申请String的方式:String s = new String("XX"),String s = "XX"是不一样的,前者是java中标准的对象创建方式,其创建的对象将直接放置到堆中,每调用一次就会创建一个新的对象;后者则会在栈中创建一个对象引用变量str,然后 查看字符串池中是否存在"XXX",如果没有,则将"XXX"存放字符串池,并令引用变量str指向它;如果已经有"XXX",则直接令str指向它。这样充分利用 了栈的数据共享优点.

回到这题对于a,编译器会在编译时就将其合并变成taobao,而不是在运行时,所以a指向了常量池中已经存在的MESSAGE,而对于e,则是在堆上new出来的,所以判断地址相等自然返回false,而对于b+c,编译器是不会做出这种优化的,因为编译器不知道运行时b or c当中一个会不会有改变,所以运行时才合并,此时是在堆中合并的!但是d+f呢?因为我将其设成了final,所以编译器编译时就知道其不会改变,所以也做出了优化。intern方法则是会去找常量池中是否已经有存在的,若有,则指向这个,所以intern后返回true。

5.如下输出?

public class Demo2 {public static void main(String[] args) {System.out.println("a.a.a".replaceAll(".", "/"));}}

答案是///// 请注意replaceAll的第一个参数定义:正则表达式,而.在正则表达式中代表任何字符。

6.如下输出?

class HelloA {    public HelloA() {        System.out.println("HelloA");    }        { System.out.println("I'm A class"); }        static { System.out.println("static A"); }}public class HelloB extends HelloA {    public HelloB() {        System.out.println("HelloB");    }        { System.out.println("I'm B class"); }        static { System.out.println("static B"); }        public static void main(String[] args) {new HelloB();}}

解:

static A

static B

I'm A class

HelloA

I'm B class

HelloB

可以看出顺序是:1、执行父类的静态代码块 2、执行子类的静态代码块3、执行父类构造代码块4、执行父类构造函数5、子类构造代码块6、子类构造函数
7、如下输出:

public class Dervied extends Base {    private String name = "dervied";    public Dervied() {        tellName();    }    public void tellName() {        System.out.println("Dervied tell name: " + name);    }       public static void main(String[] args){        new Dervied();        }}class Base {    private String name = "base";    public Base() {        tellName();        System.out.println(this.getClass().getName());    }    public void tellName() {        System.out.println("Base tell name: " + name);    }   }
输出:

Dervied tell name: null

Dervied

Dervied tell name: dervied

可以看到调用父类构造方法时this的name是Dervied,所以既然Dervied覆盖了父类的tellName,所以此时调用的是Dervied的tellName,而此时还未初始化,所以输出null。(要是把Dervied的name申明为static,就会输出2句一样的语句了)

8:

public class Demo2 {public static void main(String[] args) {Foo22 foo22 = new Foo22();foo22.print();}}class Foo2 {private String a = "a";public void print() {System.out.println(this.getClass().getName());System.out.println(this.a);}}class Foo22 extends Foo2 {public String a = "b";}

输出什么? 我不理解

9:

public class Demo3 {public static void main(String[] args) {int a = 33;Integer a2 = 33;Integer a3 = Integer.valueOf(33);Integer a4 = new Integer(33);System.out.println(a==a2);System.out.println(a2==a4);System.out.println(a2==a3);}}

true false true

2个点:

包装类和基本类型比较 包装类会自动拆箱为基本类

IntegerCache(-128-127) valueOf内部也会去使用IntegerCache

10:java中提供了哪两种用于多态的机制:

Java通过方法重写和方法重载实现多态




1 0