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

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

首先看如下代码:

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>太啰嗦了。

知识点罗列

内部类分类:

  • 静态内部类 (static inner class)
    • 不依赖外部类,可以声明静态属性,但不能访问外部类中非静态变量与方法
  • 成员内部类 (member inner class)
    • 依赖外部类,可以访问外部类中所有变量包括私有的、静态的,但不能声明静态变量与方法,静态常量除外
  • 局部内部类 (local inner class)
    • 定义在一个方法或一个作用域里面的类,局部内部类的访问仅限于方法内或作用域内
  • 匿名内部类 (anonymous inner class)
    • 是没有构造器的类,在编译的时候由系统自动起名为outer$1.class
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一个星期六的傍晚,李紫华正在家门口玩着,突然看见母亲回来了,她马上迎了上去,母亲急匆匆的说:“有...
    lizihua李子阅读 402评论 7 6
  • 这是我第二次写这个不知该被称为什么的东西,也许……该叫……规划? 上大学以来,疲倦,逃避,萎靡,恐慌。这些,都是我...
    如翎阅读 255评论 0 2
  • 雄安和反抽板共同造就了今天的反弹,短线来看市场指数压力依旧,题材方面人气还不是很稳定,雄安从昨天的分歧快速过度到了...
    mfan688阅读 281评论 0 0
  • 这是一个最好的时代,这是一个最坏的时代; 这是一个智慧的年代,这是一个愚蠢的年代; 这是一个光明的季节,这是一个黑...
    青松玥冷阅读 214评论 0 0

友情链接更多精彩内容