牛客网日常刷题错题汇总2017-09-08

<方法重载> 同一个类中的方法的重载:方向名相同,参数列表不同;而方法的返回值类型和修饰符都是没有关系的;


如下程序的输出结果:
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,最终还是只有一个对象;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值