因为本人已经有C、C++、python的基础,所以不会那么事无巨细,只会着重强调一些java与上述语言的不同点。(即第一篇当中所说的按照本人的逻辑来记笔记)
标识符
- 由字母、下划线、美元符号和数字组成,长度不受限制(可以是汉字、假名等字符);
- 第一个字符不能是数字;
- 不能是关键字、true、false、null。
- 注:关键字肯定都是小写的。
数据类型
八种基本数据类型
- 逻辑类型:boolean
- 整数类型:int、byte、short、long
- 字符类型:char
- 浮点类型:float、double
整数类型
int类型 | byte类型 | short类型 | long类型 | |
---|---|---|---|---|
大小 | 4字节,32位 | 1字节,8位 | 2字节,16位 | 8字节,64位 |
范围 | -2^31 ~ 2^31-1 | -2^7 ~ 2^7-1 | -2^15 ~ 2^15-1 | -2^63 ~ 2^63-1 |
备注 | 用后缀L表示 |
备注:
- int型常量可以用十进制、八进制、十六进制来表示;
- 八进制数字以0开头,十六进制以0x开头;
- 字节为byte,位为bit,1 byte = 8 bit。
字符类型
- 常量 / 变量
- Unicode标准字符集(也是为什么占两个字节的原因)
- 内存分配2个字节(byte),占16位(bit)
- 转义字符与c++相同
浮点类型
float型 | double型 | |
---|---|---|
格式 | 须带后缀f或F | 可带后缀d或D,也可省略 |
大小 | 4个字节,32位 | 8个字节,64位 |
精度 | 保留8位有效数字 | 保留16位有效数字 |
备注:
- 小数表示法 / 指数表示法(1e-12F表示1乘10的-12次方);
- 带有小数部分的数据默认是double,若必须要求是float,则必须附带后缀。
- 可以用1.表示1.0,也可以用.1表示0.1。
类型转换
- 数据类型按照精度由“低”到“高”排列为:
byte、short、char、int、long、float、double
- 将级别 低 的变量赋给级别 高 的变量时,系统自动完成数据类型的转换;
- 把级别 高 的变量赋给级别 低 的变量时,必须使用类型转换运算,即在数字前面加括号,备注需要转换成的类型名,否则会报错。
- 例如:
- byte b = 128; (error)
- byte b = (byte)128; (ok)
- 原因:byte表示的范围是-128~127,强制类型转换相当于截断。
示例1:
public class main {
public static void main (String args[]) {
byte a = 127;
byte b = (byte)128;
byte c = (byte)129;
System.out.println(a+"\n"+b+"\n"+c);
}
}
运行效果如下:
(用刚学的计原知识)分析:
- +128的原码、反码和补码均为010000000,当赋值给一个字节的byte类型时,自动被切成了10000000,也就是补码形式的-128。
- 同理,+129的原码、反码和补码均为010000001,自动被切成了10000001,是补码形式的-127。
- 负数补码转换为原码的方法:数值位按位取反再加一,再加上负号。
示例2:
public class main {
public static void main (String args[]) {
byte b = 22;
int n = 129;
float f =123456.6789f ;
double d=123456789.123456789;
System.out.println("b="+b);
System.out.println("n="+n);
System.out.println("f="+f);
System.out.println("d="+d);
b=(byte)n; //导致精度的损失.
f=(float)d; //导致精度的损失
System.out.println("\n转换后的b="+b);
System.out.println("转换后的f="+f);
}
}
运行效果如下:
输入输出
输入
- 需要先用Scanner类创建一个对象;
- Scanner的对象调用以下函数,从键盘读入数据:nextBoolean()、 nextByte()、 nextShort()、 nextInt()、nextLong()、nextFloat()、nextDouble()
示例1:
import java.util.Scanner; // 这行很重要!
public class main {
public static void main (String args[]) {
Scanner s = new Scanner(System.in);
byte b = s.nextByte();
int c = s.nextInt();
System.out.println(b+"\n"+c);
}
}
运行效果如图:
示例2:
import java.util.Scanner; // 这行很重要!
public class main {
public static void main (String args[]) {
Scanner scan = new Scanner(System.in);
// 从键盘接收数据
// next方式接收字符串
System.out.println("next方式接收:");
// 判断是否还有输入
if (scan.hasNext()) {
String str1 = scan.next();
System.out.println("输入的数据为:" + str1);
}
scan.close();
}
}
运行结果如下:
输出
常规输出:
- System.out.println()输出后换行,System.out.print()输出后不换行。
- 可以用+号把不同类型的数据连接,一起输出。
public class main {
public static void main (String args[]) {
Student stu = new Student("每天都很困");
System.out.print(stu+"!!!");
}
}
class Student{
String name = "";
public Student(String name){
this.name = name;
}
public String toString(){
return "This student's name is " + this.name;
}
}
运行结果如下:
格式化输出:
- 类似于C中printf的写法,有:System.out.printf(“格式控制部分”,表达式1,表达式2,…表达式n)
- 例如:System.out.printf("%d,%f",12, 23.78);
数组
基础知识
import java.util.Scanner; // 这行很重要!
public class main {
public static void main (String args[]) {
//声明数组
int [] ar;
Scanner s = new Scanner(System.in);
//为数组分配空间
ar = new int[4];
for(int i=0;i<4;i++){
System.out.print(ar[i]+" ");
}
for(int i=0;i<4;i++){
ar[i] = s.nextInt();
}
for(int i=0;i<4;i++){
System.out.print(ar[i]+" ");
}
}
}
运行结果如下:
- 声明一维/二维数组数组的方式,均是两种都可:
- int a[];
- int []a;
- int [][]a;
- int a[][];
- 由示例可知,数组在声明之后,需要为其分配空间;
- 声明与分配空间可以在一个语句中完成,示例中的两行等效于:int []a = new int[4];
- 数组中元素若不特别说明,默认赋为0。
- 声明数组的同时也可以给数组元素初始值,需要用大括号括起。
说明:数组属于引用型变量,数组变量中存放着数组的首元素的地址,通过数组变量的名字加索引使用数组的元素。
关于length
- 对于一维数组,“数组名.length”的值就是数组中元素的个数;
- 对于二维数组,“数组名.length”的值是它含有的一维数组的个数。
- 对于a[3][8]而言,a.length的值为3,而a[0].length、a[1].length、a[2].length的值均为8。
示例1:
import java.util.Scanner; // 这行很重要!
public class main {
public static void main (String args[]) {
int []a = {1,2};
// 试试直接打印数组名会出现什么
System.out.println(a);
// 试试声明时就对数组元素赋值的话,数组的长度如何
System.out.println(a.length);
// for循环的另外一种表达形式
for(int i : a){
System.out.println(i);
}
}
}
运行结果如下:
- 由此可见,在数组声明时就指定元素值,会自动给数组分配长度。
- 直接打印数组名会打印出一串地址。
示例2:
import java.util.Scanner; // 这行很重要!
public class main {
public static void main (String args[]) {
int []a = {1,2};
int []b = a;
for (int i : a) System.out.print(i+" ");
System.out.print('\n');
for (int i : b) System.out.print(i+" ");
System.out.print('\n');
// 创建新的Scanner对象用于输入
Scanner sca = new Scanner(System.in);
a[0] = sca.nextInt();
a[1] = sca.nextInt();
// 查看b是否会跟着a一起改变
for (int i : a) System.out.print(i+" ");
System.out.print('\n');
for (int i : b) System.out.print(i+" ");
System.out.print('\n');
// 查看a与b的地址是否相同
System.out.println(a);
System.out.println(b);
// 查看b数组的长度
System.out.println(b.length);
}
}
运行结果如下:
- 由此可见,数组属于引用型变量,两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素。