-switch语句能做用在byte上,可否做用在long上,可否做用在String上?java
-在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量,整数表达式能够是int基本类型或Integer包装类型,因为byte,short,char均可以隐式转换为int,因此这些类型以及这些类型的包装类型也是能够的。bootstrap
显然,long和String类型都不符合switch的语法规定,而且不能被隐式转换成int类型,素以,它们不能做用于switch语句中。数组
-short s = 1; s = s + 1; 有什么错? short s = 1; s += 1; 有什么错?安全
-对于前者,因为s + 1运算时会自动提高表达式的类型,因此结果是int类型,再赋值给short类型s时,编译器将报告须要强制转换类型的错误。多线程
对于后者,因为+=是Java语言规定的运算符,Java编译器会对它进行特殊处理,所以能够正确编译。并发
-char型变量中能不能存储一个中文汉字?为何?app
-char型变量是用来存储Unicode编码字符的,unicode编码字符集中包含了汉子,因此char型变量固然能够存储汉字啦。不过,若是某个特殊的汉字没有包含在unicode编码字符集中,那么char型变量就不能存储。补充说明:unicode编码占用两个字节,char类型变量也是两个字节。jvm
-使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变?ide
-使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容仍是能够改变的。ui
例如,对于:
final StringBuffer a = new StringBuffer("hahaha");
执行以下语句将报告编译器错误:
a = new StringBuffer("hehe");
可是,执行以下语句则能够经过编译:
a.append("broken");
有人在定义方法的参数时,可能想采用以下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param)
{
}
实际上这是办不到的,在该方法内部仍然能够增长以下代码来修改参数对象:
param.append("a");
-请说出做用域public,private,protected,以及不写时的区别。
-若是在修饰的元素上面没有写任何访问修饰符,则表示friendly。
做用域 当前类 同一Package 子孙类 其余Package
public yes yes yes yes
protected yes yes yes no
friendly yes yes no no
private yes no no no
-线程如何同步和通信
-只有多个synchronized代码块使用的是同一个监视器对象,这些synchronized代码块之间才具备线程互斥的效果,假如a代码块用obj1做为监视器对象,b代码块用obj2做为监视器对象,那么两个并发的线程能够同时进入这两个代码块中。
对于同步方法的分析,所用的是同步监视器对象this。
对于静态同步方法的分析,所用的同步监视器对象是类的Class对象。
-ClassLoader如何加载class?
-jvm里有多个类加载,每一个类加载能够负责加载特定位置的类。
例如,bootstrap类加载负责加载jre/lib/rt.jar中的类,咱们平时用的jdk中的类都位于rt.jar中。
extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。
除了bootstrap,其余的类加载自己也都是java类,他们的父类是ClassLoader。
-ArrayList如何实现插入的数据按自定义的方式有序存放?
-代码以下:
class MyBean implements Comparable{
int age;
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
if(!(o instanceof MyBean))
throw new ClassCastException();
MyBean other = (MyBean) o;
return age > other.age ? 1 : age == other.age ? 0 : -1;
}
}
class MyTreeSet{
private ArrayList datas = new ArrayList();
public void add(Object o){
for(int i = 0; i < datas.size();i++){
if(((MyBean) o).compareTo(datas.get(i))!= 1){
datas.add(i,o);
}
}
}
}
-StringBuffer与StringBuilder的区别
-由于StringBuilder是线程不安全的,运行效率高,若是一个字符串变量是在防范里面定义,这种状况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。若是要在类里面定义成员变量,而且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
-构造器Constructor是否可被override?
-构造器Constructor不能被继承,所以不能写Override,但能够被重载Overload。
-接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类?抽象类是否能够有静态的main方法?
-接口能够继承接口。抽象类能够实现接口,抽象类能够继承具体类。抽象类中能够有静态main方法。
备注:只要明白了接口和抽象类的本质和做用,这些问题都很好回答,你想一想,若是你是java语言的设计者,你是否会提供这样的支持,若是不提供的话,有什么理由?若是您i没有道理不提供,那答案就是确定的了。
只要记住抽象类与普通类惟一区别就是不能建立实例对象和容许有abstract方法。
-java中实现多态的机制是什么?
-靠的是父类或接口定义的引用变量能够指向子类或具体实现类的实例变量,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
-内部类能够引用它的包含类的成员吗?有没有什么限制?
-静态内部类不能访问外部类的普通成员,只能访问外部类中的静态成员。若是不是静态内部类,则没什么限制,能够访问。
-Anonymous Inner Class(匿名内部类)是否能够继承其余类,是否能够implements 接口?
-不只是能够,而是必须!
-String s = new String(xyz)建立了几个String对象,两者之间有什么区别?
-两个或一个。"xyz"对应一个对象,这个对象放在字符串常量缓冲区,常量"xyz"无论出现多少遍,都是缓冲区中的那一个。new String每写一遍,就建立一个新的对象,他依据那个常量"xyz"对象的内容来建立出一个新的String对象。若是之前就用过"xyz",就不会建立“xyz”本身了,直接从缓冲区拿。
-数组有没有length()这个方法,String有没有length()这个方法?
-数组没有length这个方法,有length属性。String有length()这个方法。