1.理解int型取值范围
public class INTVALUE {
public static void main(String[] args) {
long max = Integer.MAX_VALUE + 1;
long min = Integer.MIN_VALUE - 1;
System.out.println("int型最大值加1:"+max);
System.out.println("int型最小值减1:"+min);
}
}
程序运行结果:
int型最大值加1:-2147483648
int型最小值减1:2147483647
可以发现最大值加上1,结果变成了最小值;当最小值减去1,结果变成了最大值;以上情况就是数据类型的溢出。
2.得到精确结果
public class Rigorous {
public static void main(String[] args) {
double d = 10.00;
double f = 9.30;
System.out.println(d-f);
}
}
结果不是0.7哟,而是0.6999999999999993
要想得到准确的结果可以使用BigDecimal类
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal d = new BigDecimal("10.0");
BigDecimal f = new BigDecimal("9.3");
BigDecimal sub = d.subtract(f);
double ret = sub.doubleValue();
System.out.println(ret);
}
}
此时结果为0.7,但是此方法复杂且运行速度慢。
public class SwitchLong {
public static void main(String[] args) {
double d = 10.00 ;
double f = 9.30 ;
long d1 = (long) (d*100);
long f1 = (long) (f*100);
double ret = (d1-f1)/100.0;
System.out.println(ret);
}
}
答案同样是0.7,此方法是先将浮点型转换为整型计算后,再将整型转换为浮点型。
3.请写出以下代码运行结果
public class LongDemo {
public static void main(String[] args) {
long l = 2147283640 * 10;
System.out.println(l);
}
}
答案是-2000080 而不是 21472836400 。这是因为在
long l = 2147283640 * 10; 中2147283640还在int型的取值范围内,所以不加L是不会出编译错误的,但*10后的结果早早就超出了int型的取值范围,造成了数据类型的溢出。以后要声明一个long型变量,最好在其值后加上L。
4.关于if语句
public class TestIf {
public static void main(String[] args) {
int a=3,b=4,c=7;
if (a+b>c)
if(++a==b)
System.out.println(++a);
else
System.out.println(a++);
}
}
答案是没有任何输出,这是因为if(a+b>c) //a+b>c返回的是false,所以后面的所有语句都不会执行。
public class TestIf2 {
public static void main(String[] args) {
int i=1;
double j=1.0;
float k=1.0f;
if (i==j && i==k && j==k) {
System.out.println("i=j=k");
}
}
}
输出结果i=j=k.对于基本数据类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
5.使用foreach循环输出时的注意事项
public class TestForEach {
public static void main(String[] args) {
String language[] = new String[] {"aaaa","bbbb","cccc","dddd"};
for (String lang : language) {
lang = "abcd";
}
for (String lang : language) {
System.out.print(lang+" ");
}
}
}
程序输出结果:aaaa bbbb cccc dddd
使用foreach语句循环时,不能通过循环变量来改变数组或者集合元素的值。
6.形参个数可变的方法
public class ChangeArgs {
public static void main(String[] args) {
System.out.println("传入一个参数:");
print("Java");
System.out.println("\n传入两个参数:");
print("Java","C");
System.out.println("\n传入三个参数:");
print("Java","C","C++");
}
//定义可变参数的方法
public static void print(String ... str){
for (String string : str) {
System.out.print(string+" ");
}
}
}
程序结果:
传入一个参数:
Java
传入两个参数:
Java C
传入三个参数:
Java C C++
在JDK1.5之后Java语言提供一个新的概念——可变参数。可变参数是允许为方法指定不再固定数目的参数,可以根据需要传入多个参数。
7.关于字符串
public class TestString {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
String str3 = "HelloWorld";
//str1+str2 两个变量相加,相当于
//(newStringBuilder(String.valueOf(s1))).append(s2).toString();
//运行时会有新的地址空间的分配。为false
System.out.println(str3==str1+str2);
//和上面是相同的原理,会有新的地址空间的分配
System.out.println(str3==str1+"World");
//+两边都是字符串常量,Java系统先把两个字符串拼接起来,
//然后到常量池中去找是否有相同内容的字符串
//上面str3内容即为HelloWorld,找到后就把str3的地址返回。结果为true。
System.out.println(str3=="Hello"+"World");
}
}
8.静态成员的调用
下面两个程序可以编译并运行的是
public class TestStatic01 {
public static int add(int x){
int y;
if(x>0){
y=10;
}
return x+y;
}
public static void main(String[] args) {
System.out.println(add(5));
}
}
public class TestStatic02 {
public static int add(int x){
int y;
if(x>0){
y=10;
}else {
y=0;
}
return x+y;
}
public static void main(String[] args) {
System.out.println(add(5));
}
}
第一个在编译时会报错,局部变量必须经过初始化后才能使用,第二个程序y在使用前已经确保会被初始化。
9.普通代码块
下面代码能够正常编译?
public class CodeBlock {
public static void main(String[] args) {
int x=5;
System.out.println(x);
{
int x=3;
System.out.println(x);
}
}
}
直接在一个方法或语句中出现的{ }就称为普通代码块。
此程序中代码块是在main()方法的作用域内定义的,在同一个作用域中,一个变量只能定义一次。