<方法重载> 同一个类中的方法的重载:方向名相同,参数列表不同;而方法的返回值类型和修饰符都是没有关系的;
如下程序的输出结果:
public class IfTest{
public static void main(string[]args){
int x=3;
int y=1;
if(x=y)
System.out.println(“Not equal”);
else
System.out.println(“Equal”);
}
}
解答:最终在编译时就会报错,因为在C++中,if(x=y)的意思是将y赋值给x之后然后将x与0来做比较,即x=y;if(x>0)…;而在java中,if(x=y)的意思是将y赋值给x之后然后直接进行boolean值判断;即x=y;if(x)…..所以,如果x此时不是boolean类型的值,将会在编译时直接报错;必须是boolean类型值,其他整形、浮点型之类的数据都会报错;
<反射>JAVA反射机制主要提供了以下几个功能:
1.在运行时判断一个对象所属的类;
2.在运行时创建任意一个类的对象;
3.在运行时判断任意一个类所具有的所有成员变量和方法;
4.在运行时调用任意一个对象的方法;
5.生成动态代理
如下代码的输出结果:
package test;
import java.util.Date;
public class SuperTest extends Date{
private static final long serialVersionUID = 1L;
private void test(){
System.out.println(super.getClass().getName());
}
public static void main(String[]args){
new SuperTest().test();
}
}
解答: SuprtTest类和Date类都没有重写Object类的getClass()方法,因此最终调用的是Object类的getClass()方法;Object的getClass方法返回的是当前运行时的类的名字;在这里运行的java类的名字是test.SuperTest
数据库结果对象 ResultSet跟普通的数组不同,索引是从1开始而不是从0开始;
标识符定义规则 由字符、数字、_和$组成;其中开头必须不能为数字
类构造器 在本类的构造器中可以调用另外一个构造器,不过与调用方法不同,它是通过this来调用的
Integer的缓存问题
使用Integer a=i;或者 Integer a = Integer.valueOf(i);来创建整型变量时,在i处于-128~127的情况下a都会自动拆箱成为基本数据类型,因为Integer的valueOf方法缓存了-128~127之间的整型数值;
而对于使用Integer b = new Integer(i)来创建整型变量的引用类型时,不管i为多少,都是创建引用类型变量;
箱子类型比较问题
int a = 1
Integer aa = new Integer(1)
System.out.println(a == aa)
System.out.println(aa.equals(a))
System.out.println(a.equals(aa))
解答 基本类型和对应的引用类型进行比较时,比较符右侧的数据会自动进行装箱或者拆箱然后进行比较; 引用类型调用equals方法与基本类型进行比较时,基本类型会自动装箱然后在进行比较;而第三个基本类型无equals方法,所以将会编译错误;
<多线程>
public class NameList
{
private List names = new ArrayList();
public synchronized void add(String name)
{
names.add(name);
}
public synchronized void printAll() {
for (int i = 0; i < names.size(); i++)
{
System.out.print(names.get(i) + ””);
}
}
public static void main(String[]args)
{
final NameList sl = new NameList();
for (int i = 0; i < 2; i++)
{
new Thread()
{
public void run()
{
sl.add(“A”);
sl.add(“B”);
sl.add(“C”);
sl.printAll();
}
} .start();
}
}
}
解答
首先,add和printAll方法都是线程同步的,因此在printAll之前,一定会有ABC的add即会有ABC的输出;
其次,虽然线程调用的两个方法都是同步的,但是线程之间确实异步的,所以会出现片段的穿插执行,比如在第一个线程add A/B后穿插了线程2add A之类的操作,都是有可能的;
总之,这里需要注意两个:1.线程调用的方法同步;2.线程之间异步;
<赋值>在java程序中使用赋值运算符来进行对象赋值时,可以得到两个完全相同的对象是错误的,比如A=B;只是将A的引用地址赋给了B,最终还是只有一个对象;