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

来源:互联网 发布:王者荣耀mvp 详细算法 编辑:程序博客网 时间:2024/03/28 22:57

       学习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。

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

         先看一个例子:

  01public 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。同样,再看另一个:

01public 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}
04interface B {
05}
06interface extends A, B {
07}
08interface D {
09 public void doIt(String thing);
10}
11class AImpl implements C ,D{
12 public void doSomething(String msg) {}
13 public void doIt(String thing) {}
14}

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

0 0
原创粉丝点击