笔试题目一:请问&与&&的区别?
首先看如下代码:
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
网友评论