欢迎关注我的公众号【软件大爆炸】
Java学习中的碎碎念
Java中易忽略的基础知识
Java面向对象基础
Java中的核心类
Java抽象类和接口
Java中的异常
Java中的泛型与集合
Java语言中基本所有输入元素都是采用ASCII,而标识符、字符、字符串和注解则采用 Unicode
局部变量被定义在某个程序块内或方法体内,局部变量的作用范围有限,只在相应的程序块内或方法体内有效,超出程序块或方法体则这些变量将无效。
public class VarScope {
public static void main(String[] args) {
// a 变量的作用范围在整个main()方法内
int a = 10;
{
// b 的作用范围是当前的两个大括号内
int b = a * a;
//下面的语句是正确的
System.out.println("a = " + a + ", b = " + b);
}
//下面这条语句是可以执行的
System.out.println("a = " + a);
//不可以执行,超出作用域范围
// System.out.println("b = " + b);
}
}
在上面的例子中,变量a
的作用范围为main()
函数内,变量b
的作用范围为 { }
内。
当超出变量作用域的范围后,系统就会释放它的值,即变量的生存期受到其作用域的限制。
例如
b
的值在执行到}
之后时,它的值会被立即释放
如果在作用域中初始化一个变量,则每次调用该代码块时系统都会重新初始化该变量。
局部变量在使用之前必须进行初始化,即变量必须有值后才能被使用(先写后读)。
public class VarValue {
public static void main(String[] args) {
int a = 10;
int b;
System.out.println("a = " + a);//正确,已赋值
// System.out.println("b = " + b);//错误,还没有被赋值
b = 20;
System.out.println("b = " + b);//正确,已赋值
}
}
这一点和C语言不太一样,C语言会自动将未赋值的变量赋值为默认类型
#include <stdio.h>
int main()
{
int z;
printf("z=%d\n",z);
return 0;
}
z=0
--------------------------------
Process exited after 0.01581 seconds with return value 0
请按任意键继续. . .
Integer.toBinaryString(num)
会将整数以二进制字符串形式输出,负数输出的是补码
public class IntValueDemo {
public static void main(String[] args) {
int a = 0b01001;
System.out.println("二进制a的值为"+a);
int b = 012;
System.out.println("八进制b的值为"+b);
int c = 19;
System.out.println("十进制c的值为"+c);
System.out.println("十进制c 的二进制表示为"+Integer.toBinaryString(c));
int d = 0xFF;
System.out.println("十六进制d的值为"+d);
int e = -19;
//负数的二进制会以补码形式存储
System.out.println("十六进制e 的二进制表示为"+Integer.toBinaryString(e));
}
}
二进制a的值为9
八进制b的值为10
十进制c的值为19
十进制c 的二进制表示为10011
十六进制d的值为255
十六进制e 的二进制表示为11111111111111111111111111101101
从Java7开始增强了 switch语句的功能,允许控制表达式的值是 Stirng字符串类型的变量或表达式,下述代码演示 switch增强功能
public class SwitchDemo {
public static void main(String[] args) {
String season = "秋天";
switch(season)
{
case "春天":
System.out.println("春天来了!");
break;
case "秋天":
System.out.println("秋天来了!");
break;
default:
System.out.println("可能是夏天或者冬天!");
break;//不是必须要写的
}
}
}
Java语言没有提供goto语句来控制程序的跳转,但提供了带标签的break语句,与标签语句配合使用从内层循环或内层程序块中退出。
不使用标签时跳出的是内循环
public class BreakDemo {
public static void main(String[] args) {
int loop = 5;
for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop; j++) {
if (1 == j){
System.out.println(j);
break;
}
}
}
}
}
1
1
1
1
1
Process finished with exit code 0
如果使用标签,则跳出了外循环:
public class BreakDemo {
public static void main(String[] args) {
int loop = 5;
tag : for (int i = 0; i < loop; i++) {
for (int j = 0; j < loop; j++) {
if (1 == j){
System.out.println(j);
break tag;
}
}
}
}
}
1
Process finished with exit code 0
注意:不能从循环外跳到循环内。
数组的创建:
int[] array
此过程是在栈区域中创建一个了一个数组变量,还没有在堆中给数组分配内存空间,因此还不能访问数组中的元素。
array=new int[5]
此过程在堆中分配了存储空间并且对数组中的元素进行了默认初始化。
System.out.println(array)
这句话会输出这个数组对象的哈希码。
foreach的用法
for(数据类型变量名:数组名)
public class ForeachDemo {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for (int e : array
) {
System.out.println(e);
}
}
}
二维数组道理同上。其实Java中的二维数组也就是一维数组。
请看内存示意图:
所以根据这个道理我们可以很容易申请到每行数组元素不同的数组
例如:
首先申请一个二位数组变量放到栈中 int[][] array;
然后申请一个三行的空间放到堆中 array = new int[3][];
接下来为每一个行分配空间 array[0] = new int[2]; array[1] = new int[3];array[2] = new int[1];
public class ArrayTwo {
public static void main(String[] args) {
int[][] array;
array = new int[3][];
array[0] = new int[]{1,2};
array[1] = new int[]{1,2,3};
array[2] = new int[]{1};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
1 2
1 2 3
1
Process finished with exit code 0