小题目(错题)

1、
public class StringDemo{
  private static final String MESSAGE="taobao";
  public static void main(String [] args) {
    String a ="tao"+"bao";
    String b="tao";
    String c="bao";
    System.out.println(a==MESSAGE);
    System.out.println((b+c)==MESSAGE);
  }
}
输出结果是:true  false
解析:
要注意两个问题:
1,字符串在java中存储在字符串常量区中
2,==判断的是对象引用是否是同一个引用,判断字符串相等要用equals方法
首先判断a==MESSAGE 同一份字符串常量在内存中只有一份,因此是同一地址,返回true
再次比较(b+c)==MESSAGE 这相当于 new String(b+c)==MESSAGE 这里new了一个String对象,所以返回false
 "ABC".toLowerCase()会返回一个新的字符串对象,所以==abc是false。
2、
下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader
A,Thread可以被继承,用于创建新的线程
B,Number类可以被继承,Integer,Float,Double等都继承自Number类
C,Double类的声明为
1
public final class Doubleextends Numberimplements Comparable<Double>
  final生明的类不能被继承
D,Math类的声明为
1
public final class Mathextends Object
   不能被继承
E,ClassLoader可以被继承,用户可以自定义类加载器
 
 
3.
以下代码的输出结果是?
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

  • 静态块 构造块 构造块 构造块
  • 构造块 静态块 构造块 构造块
  • 构造块 构造块 静态块 构造块
  • 构造块 构造块 构造块 静态块

正确答案是选C。。这是阿里巴巴的题,只能说优秀。。

首先要注意以下几点:

1、每调用一次构造方法(new ),则执行一次构造块(非静态的,这是必然执行的,而静态的只有在第一次执行),构造块在类加载阶段不执行,只有在调用构造函数时才执行。
2、静态块只在类加载(初始化阶段)的时候加载一次,类加载的准备阶段(在初始化阶段之前)初始化静态变量(块)。
3、有多个静态变量或块时,按声明顺序加载。需要初始化的就是静态变量或块,静态方法不用初始化,使用时直接调用即可,main方法除外,该方法不需要调用,它是程序的入口(main方法作为类加载中初始化的条件之一,会触发初始化,初始化阶段会初始化静态变量和块)。
静态代码块(静态变量)只有在类第一次加载时(触发初始化的五个条件)才会初始化,而且只能加载一次。
这一题的分析:首先会找到程序入口main方法,调用main方法,此时会触发类加载中的初始化,加载类B,会按顺序给静态变量或块进行初始化,所以首先执行t1=new B()。此时因为 已经加载过类B一次了(调用main方法时),所以这是第二次加载类B,所以不会再触发静态块的初始化,由于这里调用构造函数,所以执行非静态块(或非静态变量的初始化),所以会输出“构造块”,然后t1初始化结束,继续初始化t2(因为第一次的类加载还没有结束),也是一样,只执行非静态块,输出“构造块”,接下来继续初始化静态变量(块),输出“静态块”。到这里为止,由main方法触发的类加载结束了,然后执行方法中内容,t=new B()。这是也就是只执行非静态的,也就是输出“构造块”。
 
4.
以下代码执行后输出结果为( )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ClassTest{
     String str = new String("hello");
     char[] ch = {'a','b','c'};
     public void fun(String str, char ch[]){
     str="world";
     ch[0]='d';
 }
 public static void main(String[] args) {
     ClassTest test1 = new ClassTest();
     test1.fun(test1.str,test1.ch);
     System.out.print(test1.str + " and ");
     System.out.print(test1.ch);
     }
 }
输出结果为
hello and dbc  .

注意:在fun中函数变量str和成员变量str是不一样的,不是一个变量,这里函数中修改的只是函数变量指向的值,并没有对地址的内容进行改变。
而ch数组对ch[0]操作,是直接对地址内容操作了,所以ch的内容要变了
 
内部类
 1.成员内部类的实例:Outer out=new Outer(); Inner in=out.new Inner();          /Outer.Inner in=out.new Inner();
2.静态内部类:Outer.Inner in=new Outer.Inner();
 

正确答案: A B D E   你的答案: A B D (错误)

float f[][] = new float[6][6];
float []f[] = new float[6][6];
float f[][] = new float[][6];   x
float [][]f = new float[6][6];
float [][]f = new float[6][];

以下代码将打印出

 

 

1
2
3
4
 public static void main (String[] args) { 
    String classFile = "com.jd.". replaceAll(".""/") + "MyClass.class";
    System.out.println(classFile);
}

正确答案: C   你的答案: B (错误)

com. jd
com/jd/MyClass.class
///////MyClass.class
com.jd.MyClass

由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换

posted on 2018-01-18 21:53  夜的第八章  阅读(224)  评论(0编辑  收藏  举报

导航