您的位置:首页 > 编程语言 > Java开发

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

2016-05-17 00:47 309 查看
       学习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多接口也可以!?难道不是只有类是单继承吗!?其实这也是接口的特殊之一吧,它是可以多继承的,毕竟接口不是类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: