java面试&、&&、内部类以及泛型相关

2018-03-27  本文已影响0人  pr0metheus

笔试题目一:请问&与&&的区别?

首先看如下代码:

public class ArithmeticTest {

    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        int c = a & b;
        System.out.println(c);
    }
}

控制台输出1,证明&具有按位与的功能。

看如下代码:

    public static void main(String[] args) {
       int a = 1;
       int b = 2;
       if ((a == 2) & ((b = 3) == 4)) {
           System.out.println("Exception");
       }
       System.out.println(a);
       System.out.println(b);
    }

控制台输出1、3,证明&具有逻辑与的功能并且不短路。

看如下代码:

    public static void main(String[] args) {
       int a = 1;
       int b = 2;
       if ((a == 2) && ((b = 3) == 4)) {
           System.out.println("Exception");
       }
       System.out.println(a);
       System.out.println(b);
    }

控制台输出1、2,证明&&具有逻辑与的功能并且是短路的。

总结:&既具有按位与的功能也具有逻辑与的功能(不短路)而&&只具有短路与的功能

笔试题目二:如下代码能否编译通过?并说明理由。

import java.util.Date;
public class AnonymousTest {
    @SuppressWarnings("deprecation")
    public String get(Date date) {
        return date.toLocaleString();
    }

    public static void main(String[] args) {
        AnonymousTest test = new AnonymousTest();
        String result = test.get(new Date(){});
        System.out.println(result);
    }
}

答案:能编译通过。因为new Date(){}是匿名内部类,可以看作生成了一个对象它是Date类的子类。

关于匿名内部类:该类一定是继承了某个父类或者实现了某个接口

下面代码会输出什么?

package com.test;
import java.util.Date;

public class AnonymousTest {
    @SuppressWarnings("deprecation")
    public String get(Date date) {
        return date.toLocaleString();
    }

    public static void main(String[] args) {
        AnonymousTest test = new AnonymousTest();
        String result = test.get(new Date(){
            @Override
            public String toLocaleString() {
                return "hello world";
            }
        });
        System.out.println(result);
    }
}

答案:输出hello world

笔试题目三:如下代码能否编译通过?并说明相应理由?

import java.util.*;
public class GenericTest {

    public void method(List<Object> list) {

    }

    public void method2() {
        method(new ArrayList<Object>());
        method(new ArrayList<String>());
        method(new LinkedList<Integer>());
    }
}

答案:编译通不过,因为对于泛型而言List<Object>只能接受List接口的实现类并且元素只能是Object类型而不能是Object的子类。虽然String继承了Object但是在泛型里是不成立的。如果new ArrayList<String>()改为new ArrayList<Object>(),new LinkedList<Integer>改为new LinkedList<Object>那么可以编译通过。

笔试题目四:如下代码能否编译通过?并说明相应理由?

import java.util.*;
public class GenericTest {

    public void method(List<? extends Object> list) {

    }

    public void method2() {
        method(new ArrayList<Object>());
        method(new ArrayList<String>());
        method(new LinkedList<Integer>());
    }
}

答案:编译能够通过。List<? extends Object>意思表示能够接受实现List接口的实现类并且元素是继承Object的。

笔试题目五:如果代码能否编译通过?并说明理由?

import java.util.*;
public class GenericTest {

    public void method(List<?> list) {

    }

    public void method2() {
        method(new ArrayList<Object>());
        method(new ArrayList<String>());
        method(new LinkedList<Integer>());
    }
}

答案:编译能够通过。List<?>永远等价于List<? extends Object>通常只写List<?>因为List<? extends Object>太啰嗦了。

知识点罗列

内部类分类:

上一篇 下一篇

猜你喜欢

热点阅读