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。
三、类中局部变量和成员变量的作用范围问题
先看一个例子:
相信很多童鞋给出的答案是17,但事实上是20。这是一个典型的成员变量和局部变量的区别问题,step方法中的代码行
“ y += y;”其中的两个y都是局部变量,即step方法的形式参数y。如果要引用成员变量y那么应该是this.y。 当实参10传递给step方法的形参y时,根据之前的解释,“ y += y;”中的两个y表示的是局部变量y,计算后,y的值为20。同样,再看另一个:
这个例子主要是说明Java的方法参数传递。在Java中方法参数传递只有值传递,其特点如下:
1)基本数据类型传递的是值本身。 2)引用数据类型传递也是引用的值,是对象的地址,而不是对象本身。 本例中,首先要明白main方法中的局部变量score,和add方法的形参score在栈内存中是两个变量,当调用add方法时,是把main方法中局部变量score的值20赋值给add方法的形式参数score,所以当形参score在add方法中发生变化时不会影响到main方法中局部变量score的值。
四、接口的实现和继承问题
接口,其实就是一种规范,一个标准,只要实现了已有的接口,那么就要重写其方法,所以说,只要我们写好了接口后,无论是谁去实现它,都得重写其中的方法,源文件是我们在写接口时相当于制定了一个标准,规范实现的类。
虽然接口不可实例化,但它可以通过其实现类来完成相应的功能,说的直接点就是接口其实也是一钟“类”,一个很特殊的“类”,其封装的只能是常量或public的抽象方法,只能通过其他类来实现其方法的重写。
那么,既然接口是一种很特殊的“类”,它就有继承问题,而接口之所以特殊就在与它相比较类来说可以多继承多实现。
我想看到上面的代码,很多有一定写代码经验的童鞋都会认为第6行会编译错误,因为我开始也是这么想的
,虽然我有一点开发经验(是一点!一点!一点!)。在实际开发中(我接触过的)很少会有去多继承接口的写法,尤其是自己写接口,基本是多实现,所以很多童鞋都会认为多继承不对,其实这也是经常写接口给自己挖的坑,因为我们经常是implements多个接口,长时间习惯,慢慢就会认为extends多接口也可以!?难道不是只有类是单继承吗!?其实这也是接口的特殊之一吧,它是可以多继承的,毕竟接口不是类。
如有什么地方说的不对,还望指点。
一、基本类型数据运算中的+=和+,如: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 classPiont { |
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 | } |
“ 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 | } |
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 C 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 | } |
,虽然我有一点开发经验(是一点!一点!一点!)。在实际开发中(我接触过的)很少会有去多继承接口的写法,尤其是自己写接口,基本是多实现,所以很多童鞋都会认为多继承不对,其实这也是经常写接口给自己挖的坑,因为我们经常是implements多个接口,长时间习惯,慢慢就会认为extends多接口也可以!?难道不是只有类是单继承吗!?其实这也是接口的特殊之一吧,它是可以多继承的,毕竟接口不是类。
相关文章推荐
- java基础第八天_多线程
- JAVA CDI 学习(1) - @Inject基本用法
- spring的Bean注入和P标签使用
- hibernate学习(1)
- 在 Windows 中实现 Java 本地方法
- java学习笔记5.16
- MD5解密算法-JAVA算法实现
- Java中跳出多层循环的各种方法
- JAVA编程题
- JAVA代码查错
- JAVA相关基础知识
- Java 运行程序,并获得结果
- java获取参数名称
- spring MVC ajax总是error
- 【小平工作日志】Hadoop环境与eclipse集成hadoop-eclipse-plugin
- mybatis与spring结合
- 从服务器中下载图片
- DateUtil
- struts2 文件上传
- Spring MVC 原理 - DispatcherServlet调用完整过程(下)