本文共 3702 字,大约阅读时间需要 12 分钟。
一: 自曾自减原理
1 2 3 4 5 6 7 | class VarDemo { public static void main(String[] args) { int x = 30 ; x = x++; System.out.println(x); } } |
结果: 30
内存中计算实现的过程
temp = x => temp =30
x = x + 1 => x = 31
x = temp => x =30
注: 第一步编译器发现是 x++;所以会把x先转到temp临时内存中,然后x++实现了x=31, 然后将x++赋值给x, x=temp
换成
x = ++x
内存中实现过程是:
x= x + 1 x => 31
x = x x => 31
二: 自动转换数据类型和强制转换类型
byte x = 30;
x = x +4;
以上会报错,解释:
第一步:
byte x =30;实现的过程是,将int型的30赋值给byte类型的时候,java编译器底层会做,强制转换,(如果int型的整数能放入byte类型的话)将30转换成为byte类型(否则报错),在赋值给byte类型的变量x。
第二步:
x是byte类型 + int类型的4,因为x是变量,底层无法判断x+4是否能正确的转换到byte类型,所以报错
E:\java3200\day002>javac VarDemo2.java
VarDemo2.java:4: 错误: 可能损失精度
x = x +4;
^
需要: byte
找到: int
1 个错误
但可以强制进行转换:
x = (byte)(x +4);
三:x+=5; 是否等于 x = x+5
解答:
byte x = 30;
x+=5;
以上不会报错,以上只有赋值一个步骤。
byte x = 30;
x = x +5;
这个会报错,报错的原因就是第二种情况,类型自动转换不了!以上有先计算x+5 在赋值的两个步骤
四: 双与和单与的区别(java中)
&&
&
两种的区别是,逻辑运算的结果一样,但是过程不一样
&& 当左边的执行结果为false的时候,右边不参加运算
& 无论左边为何结果,右边都会运算
综合以上,&&的效率更高,但是有时候要得到与结果,接右边一定要参加运算的情况,要使用单与
单与还有一个作用在位运算(6&3)结果 2
0000-0000 0000-0000 0000-0000 0000-0010
五: 两个变量的交换
两个变量之间数值的交换
如:
a = 5
b = 9
方法一:采用第三个临时变量
t = a
a = b
b = t
开发的时候,是使用这种方法,因为阅读性强,且临时空间的开辟不会对性能造成很大的影响!
方法二:不采用第三个临时变量
a = a + b
b = a -b
a = a - b
这种方法: 可能回超出int型的取值范围,会强制转换,数据就会变。且阅读性差,常用于面试题
方法三: 异或的方法
a = a ^ b ; a = 5 ^ 9
b = a ^ b ; b = (5 ^ 9)^9
a = a ^ b ; a = (5^9)^5
原理: 就是一个数异或一个两次,还是原来的值
六:三目运算的应用
//获取两个数的最大数
max = a>b?a:b
//获取三个数的最大值
int temp = o>p?o:p
int max = temp>q?temp:q
七:一条语句的代码块可以省略{},在流程控制中,什么叫一条语句呢?
1 2 3 4 5 | if (score >= 90 ) { if (score >= 95 ) { System.out.println( "very very good" ); } } |
可以省略成:
1 2 3 | if (score >= 90 ) if (score >= 95 ) System.out.println( "very very good" ); |
因为: 相对if(score >90) 而言
1 2 | if (score >= 95 ) System.out.println( "very very good" ); |
是一个条件语句。
相对if (score >90)而言
1 | System.out.println( "very very good" ); |
是一条语句
八:代码块的用途:
1 2 3 4 5 6 | { int a= 1 ; a=a+ 1 ; //代码块内的运算,可以定义变量的生命周期,作用域值只在这个代码块内 System.out.println(a); } |
代码块可以优化性能,将一些运算放置在代码块内,可以节省内存空间,因为代码块内的变量,运算结束后就消失,被回收。作用范围决定的。 JVM内存有限,代码劣质可能会造成内存溢出。
九:Switch中的执行过程和顺序
不常规的写法,分析过程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class SwitchDemo { public static void main(String[] args) { int x = 4 ; switch (x) { default : System.out.println( "d" ); // break; case 1 : System.out.println( "a" ); // break; case 2 : System.out.println( "b" ); break ; case 3 : System.out.println( "c" ); break ; } } } |
执行结果是:
d
a
b
原因:
case 和default两个无序,在内存中一定是先执行case,在执行defaul。x=4 先执行case 不配 1 2 3
所以执行default,打印输出"d",因为没有break跳出switch,所以往下执行,因为已经匹配了default,就不用再去判断是否匹配case中的表达式,所以打印"a", "b",然后遇到break,跳出循环。
注意: 默认的靠近下面花括号的那个case或者default可以省略break的,这样即使都不写break也不会死循环,保证了一定存在break
十: while和for的区别
共同点,都是循环,while等做的for也能做,for能实现的,while也能实现,但是两者还是有区别的。
看以下代码,执行会出错
int x =1;
while(x<3) {
System.out.println("x="+x);
x++;
}
System.out.println(x);
for(int y=1;y<3;y++) {
System.out.println("y="+y);
}
System.out.println(y);
原因: for语句中的变量作用域只在for语句中,当for循环完毕后,所有变量都在内存中被销毁。所以只针对循环而言,for的循环对程序节省内存开销。
十一: 强类型和弱类型语言的区别
如: 强类型语言java C,数据类型都是分的比较细的,如整数分 byte short int long,任何数据都要定义类型。
如:弱类型语言python 对数据类型就没那么细微,整数就是整数类型,且定义变量不需要声明类型
函数方面的区别(java ,python)对比
java 中函数可以嵌套调用,但是不能嵌套定义,如mian主函数中,不能定义其他函数,只能调用其他函数,因为java中的函数都是在类当中的,所以函数之间只能存在"兄弟"级别。
python中函数可以嵌套定义,如装饰器中
java中即使是一个函数,也要定义返回的数据类型,即定义函数的时候,指定这函数的类型,即使没有函数没有返回值,也要定义函数的类型为void类型(不带返回值的类型),main主函数就是一个void函数类型。
python中return就可以返回任何数据类型了,函数定义不需要指明类型
十二: 函数(方法)的重载
重载:
1.同一个类中
2.函数名相同
3.参数个数不同,或者参数类型不同
4.与返回值类型无关
5.java是严谨性的语言,如果存在调用异常,会编译失败
重载的实现:
java编译器会通过参数的不同,选择调用不同的函数(函数名相同的)
重载的优点:
方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
如:
public static int add(int a, int b) {
return a +b;
}
public static double add(double a, double b) {
return a+b;
本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1790660如需转载请自行联系原作者
cuizhiliang