11-7Java刷题

1、下面有关final,finally,finalize的区别描述错误的是(B)
A 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承
B 如果一个方法被声明为final,可以被覆盖
C finally在异常处理时提供finally块来执行任何清除操作
D Java使用finalize()方法在垃圾收集器象从内存中清除出去之前做必要的清理工作
解析:final关键字可用于修饰类、变量和方法。final修饰的类不能被继承,final修饰的方法不能被重写,final修饰的变量不可被修改,一旦获得初始值,该变量就不能被重新赋值。
2、程序运行结果是(3,2)

public class Test{
   public static void main(String[] args){
      List list=new ArrayList();
      list.add("a");
      list.add("b");
      list.add("a");
      Set set=new HashSet();
      set.add("a");
      set.add("b");
      set.add("a");
      System.out.println(list.size()+","+set.size());
   }
}

解析:HashSet不能添加重复的元素,当调用add(Object)方法时候,
首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素;
如果已存在则调用Object对象的equals方法判断是否返回true, 如果为true则说明元素已经存在,如为false则插入元素
3、为AB类的一个无形参数无返回值的方法method书写方法头,可以用AB.method()方式调用,该方法头的形式为 static void method()
解析:
首先声明什么是静态方法:
  1.用static修饰的方法
  2.静态方法是使用公共内存空间,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。
其次说明静态方法的使用;
  1.在外部调用静态方法时,可以使用“类名.方法名”的方式,也可以使用“对象名.方法名”的方式。
  2.而实例方法只有后面这种方式。也就是说,只有调用静态方法时可以无需创建对象。
根据题目1:AB为一个类,可以不创建对象,直接使用AB.method(“类名.方法名”的方式) 所以method是static修饰的静态方法
2:其次method无返回值 所以method是void类型的方法
4、static方法中能直接嗲用类里的非static的属性
5、i的值是11

int i;
for(i=2;i<=10;i++){
System.out.println(i);
}

6、语句:char foo=‘中’,是正确的(假设源文件以GB2312编码存储。并且以javac-enconding GB2312命令编译)
这在java中是正确的,在C语言中是错误的,java的char类型占两个字节,默认使用GBK编码存储。这种写法是正确的,此外java还可以用中文做变量名。
Java语言中,中文字符所占的字节数取决于字符的编码方式,一般情况下,采用ISO8859-1编码方式时,一个中文字符与一个英文字符一样只占1个字节;采用GB2312或GBK编码方式时,一个中文字符占2个字节;而采用UTF-8编码方式时,一个中文字符会占3个字节。
在C++中
在C++中,char是基础数据类型,8位,1个字节。byte不是基础数据类型,一般是typedef unsigned char byte;这样子的,也就是说,byte其实是unsigned char类型,那么也是8位,1个字节。不同的是,char可以表示的范围是-128-127,而byte可以表示的范围是0-255。
在Java中
在java中,char和byte都是基础数据类型,其中的byte和C++中的char类型是一样的,8位,1个字节,-128-127。但是,char类型,是16位,2个字节, ‘\u0000’-’\uFFFF’。
为什么java里的char是2个字节?
因为java内部都是用unicode的,所以java其实是支持中文变量名的,比如string 世界 = “我的世界”;这样的语句是可以通过的。
综上,java中采用GB2312或GBK编码方式时,一个中文字符占2个字节,而char是2个字节,所以是对的
7、下列执行结果为21

public static void main(String args[])throws InterruptedException{
      Thread t=new Thread(new Runnable(){
         public void run(){
            try{
               Thread.sleep(2000);
            }catch (InterruptedException(e){
               throw new RuntimeException(e);
            }
            System.out.print("2");
         }
      });
      t.start();

      t.join();
      System.out.print("1");
  }

解析:thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
t.join(); //使调用线程 t 在此之前执行完毕。
t.join(1000); //等待 t 线程,等待时间是1000毫秒
子线程的休眠时间太长,因此主线程很有可能在子线程之前结束也就是输出结果是12,但子线程用了join函数,因此主线程必须等待子线程执行完毕才结束,因此输出结果只能是21
8、以下代码输出结果是多少

public class Demo{
   public static void main(String [] args){
      Collection<?>[] collections={new HashSet<String>(),new ArrayList<String>(),new HashMap<String,String>().values()};
      super subToSuper=new Sub();
      for(Collection<?>collection:collections){
      System.out.println(subToSuper.getType(collection));
   }
 }
 abstract static class Super{
    public static String getType(Collection<?> collection){
    return "Super:collection";
 }
 public static String getType(List<?> list){
    return "Super:list";
 }
 public String getType(ArrayList<?> list){
    return "Super:Arraylist";
}
public static String getType(Set<?> set){
    return "Super:set";
 }
  public static String getType(HashSet<?> set){
    return "Super:list";
 }
 }
 static class Sub extends Super{
    public static String getType(Collection<?> collection){
    return "Sub";}
 }
 }

输出:
在这里插入图片描述
这是静态分派的过程,在编译时已经决定了使用super的方法,因为subToSuper 是指super对象,可是为什么会选择collection呢,for循环出来他们实际上指的是collection对象表示的,即类似于Collection col = new HashSet<>();这样传入方法getType()中的参数就是col,左边是静态类型,右边是实际类型。由于重载实际上是使用静态分派的,重载时是通过参数的静态类型而不是实际类型作为判定依据的。
9、
在这里插入图片描述
10、servlet周期包含init初始化、service请求处理、destory 销毁/停止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值