Java基础中常犯的一些细节上的错误

       学习Java有段时间了 ,说实话,本人的基础不太好,因此常常犯一些低级的错误,所以今天把最近犯的和容易犯错的一些问题尽可能地罗列出来,一来提醒自己,二来算是为初学者提供一点点帮助吧,以免犯同样的错误。

        如有什么地方说的不对,还望指点。微笑

       

        一、基本类型数据运算中的+=和+,如:short a+=1和short a =a+1

        咋一看,貌似没什么问题,a+=1不就相当于a=a+1吗?是的,程序在运算时确实是将a+=1先变成a=a+1,但区别是,一个是程序或者是java编译器编译时自动转变的,而另一个是你自己写的,这就不一样了。请记得:byte、short和char类型数据是先转换成int型再进行运算的。前一个程序会自动转换成int型,而后一个就需要你手动转了,所以short a+=1没问题,而short a =a+1则会编译错误,应是short a =(int)a+1。

        二、字符串拼接时有运算参与,如:1:System.out.println(""+1+2+1)和2:System.out.println(1+2+""+1),以及3:System.out.println(""+1+2+'a')

       我想不少初学者在这个问题上纠结的时间很长,不光是前俩个,尤其是最后一个,之所以要写最后一个是因为我当时在这里绕了半天才出来。

        其实理解了就不难了,只有记住字符串能将跟它拼接的数据类型转换成字符串就ok了,也就是说,1语句是""先和1拼接成字符串“1”,然后再和2拼接成字符串...这样结果就为 121字符串,而2语句则是先1+2=3,再和""拼接,结果为31,那么3语句呢?记住一点就ok了,那就是char类型数据只要不单独成一句代码就转换为对应的ASCII值,也就是转换为int型,那么3语句就变得很简单了,结果为1297。

       三、类中局部变量和成员变量的作用范围问题

         先看一个例子:

  01 public class Piont{
02  int y = 7;
  03  public void step(int y) {
04     y += y;
05    System.out.println(y);
06  }
07  public static void main(String[] args) {
08    Point p = new Point();
09    p.step(10);
10  }
11 }

        相信很多童鞋给出的答案是17,但事实上是20。这是一个典型的成员变量和局部变量的区别问题,step方法中的代码行 “ y += y;”其中的两个y都是局部变量,即step方法的形式参数y。如果要引用成员变量y那么应该是this.y。 当实参10传递给step方法的形参y时,根据之前的解释,“ y += y;”中的两个y表示的是局部变量y,计算后,y的值为20。同样,再看另一个:

01 public class Answer {
02  public static void main(String[] args) {
03     int score = 20;
04    Answer  ans= new Answer();
05    ans.add(score);
06    System.out.println(" main: score = " + score);
07  }
08  void  add(int score) {
09    System.out.println(" add: score=" + score++);
10  }
11 }
            这个例子主要是说明Java的方法参数传递。在Java中方法参数传递只有值传递,其特点如下: 1)基本数据类型传递的是值本身。 2)引用数据类型传递也是引用的值,是对象的地址,而不是对象本身。 本例中,首先要明白main方法中的局部变量score,和add方法的形参score在栈内存中是两个变量,当调用add方法时,是把main方法中局部变量score的值20赋值给add方法的形式参数score,所以当形参score在add方法中发生变化时不会影响到main方法中局部变量score的值。

        四、接口的实现和继承问题

       接口,其实就是一种规范,一个标准,只要实现了已有的接口,那么就要重写其方法,所以说,只要我们写好了接口后,无论是谁去实现它,都得重写其中的方法,源文件是我们在写接口时相当于制定了一个标准,规范实现的类。

        虽然接口不可实例化,但它可以通过其实现类来完成相应的功能,说的直接点就是接口其实也是一钟“类”,一个很特殊的“类”,其封装的只能是常量或public的抽象方法,只能通过其他类来实现其方法的重写。

        那么,既然接口是一种很特殊的“类”,它就有继承问题,而接口之所以特殊就在与它相比较类来说可以多继承多实现。

public interface A {
02  public void doSomething(String thing);
03 }
04 interface B {
05 }
06 interface extends A, B {
07 }
08 interface D {
09  public void doIt(String thing);
10 }
11 class AImpl implements C ,D{
12  public void doSomething(String msg) {}
13  public void doIt(String thing) {}
14 }

         我想看到上面的代码,很多有一定写代码经验的童鞋都会认为第6行会编译错误,因为我开始也是这么想的难过,虽然我有一点开发经验(是一点!一点!一点!)。在实际开发中(我接触过的)很少会有去多继承接口的写法,尤其是自己写接口,基本是多实现,所以很多童鞋都会认为多继承不对,其实这也是经常写接口给自己挖的坑,因为我们经常是implements多个接口,长时间习惯,慢慢就会认为extends多接口也可以!?难道不是只有类是单继承吗!?其实这也是接口的特殊之一吧,它是可以多继承的,毕竟接口不是类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值