大三,到了求职的时间,需要用Java写项目,但是用过python后已经很久没有动过C++和Java了,所以复习一遍,写成笔记,也需要能够帮助到同样需要一天快速过一遍Java知识点的你。
基本知识
- Java的代码(文本,一般在src文件夹内)的后缀名为
.java,经过JVM编译后生成的二进制文件后缀为.class。 - Java文件(
.java)的文件名和公有类(public)类名必须保持一致 - JAVA语言是一种编译型-解释型语言,同时具备编译特性和解释特性。编译特性指Java程序(
.java)要被Java编译器统一编译成字节码文件(.class);解释特性指字节码文件(.class)需要被JVM翻译成本地的机器码后才能执行(边解释,边执行)。 - Java标识符(Identifier)以字母,$或下划线开始。
注释
- 单行注释:
// - 多行注释:以
/*开始,以*/结束。 - 文档注释:以
/**开始,以**/结束。允许你在程序中嵌入关于程序的信息,如:
/**
* @author: HuntChen
* @version: 1.0
*/
数据类型
Java是一种强类型语言,要求变量先定义(声明)后使用。(相对的,python是一种弱类型语言,变量可以不仅声明就开始使用。)
基本类型(primitive type)
- byte 1个字节
- short 2个字节
- int 4个字节
- long 8个字节
- float 4个字节
- double 8个字节
- char 2个字节
- boolean 1位 P.S.整数类型又分为unsign和sign类型,其能表示数据范围有差别。有符号数的能表示最小的负数的绝对值大于其能表示的最大的正数。
引用类型(reference type)
- 类
- 接口
- 数组
类型转换
以下的箭头左边的数据类型可以直接赋值转化为右边的数据类型,而不需要担心溢出问题。(小->大)。
byte->short->int->long
float->double、
如果要逆箭头转换或者浮点类型与整数类型相互转换,需要使用(type)variabel,且可能会造成溢出错误和数据截断。如下例子:
public class TypeConvert {
public static void main(String[] args) {
int a = 128;
byte b = (byte)a;
System.out.println("int类型(4字节)变量:"+a);
System.out.println("转换为byte类型(1字节)变量:"+b+"(发送溢出)");
}
}
P.S.无论如何,完全不同的类型是不能强制转换的,如int类型不能转换为boolean类型。
变量的作用域
类变量(静态变量)
独立于方法之外的变量,用 static 修饰。无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
实例变量
在方法外,类里面。同样独立于方法之外的变量,但是不用用 static 修饰。
类变量和实例变量都是成员变量,声明在类中,不属于任何一个方法,但从属于对象,作用域是整个类。
如果不主动进行初始化,则会被系统初始化为默认值。(数值型一般是0,Boolean类型为false)
局部变量
在方法类声明、定义和初始化。
思考:一个类的两个实例,如果对其中的一个实例进行操作,修改其对应的成员变量,那么另一个实例对应的成员变量会改变吗?
-和static修饰符有关
其他补充
变量的修饰符:
static:static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为static变量final:类似与C的const,变量一旦赋值后,不能被重新赋值。被final修饰的实例变量必须显式指定初始值。final修饰符通常和static修饰符一起使用来创建类常量。- 修饰符无先后顺序
包机制
用于更好的组织类,区别类名的命名空间
JavaDoc
javadoc命令用于生成API文档。(DOS命令)
输入输出
Java中的输入是依靠java.util.Scanner实现的,下面使用一个简单的例子进行说明:
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入年龄");
int ages = scanner.nextInt();
System.out.println("输入年龄");
double wage = scanner.nextDouble();
System.out.println("年龄: "+ ages);
System.out.println("工资: "+ wage);
}
}
下面是这个程序的输入和输出样例:
0
0
年龄: 0
工资: 0.0
Scanner提供next()方法和nextLine方法,用于读取缓冲区的字符串。其中,next()方法仅读取缓冲区数据到下一个空格前,而nextLine()方法则会读取缓冲区数据知道下一个回车,下面是一个小例子。
import java.util.Scanner;
public class Input {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in)
System.out.println("输入一个字符串,下面讲以next()方法读取缓存数据并输出。");
String s1 = scanner.next();
System.out.println(s1);
System.out.println("输入一个字符串,下面讲以nextLine()方法读取缓存数据并输出。");
String s2 = scanner.nextLine();
System.out.println(s2);
}
}
其输入输出如下
输入一个字符串,下面讲以next()方法读取缓存数据并输出。
这是第一个空格前的字符串 这是一个空格后的字符串 这是第二个空格后的字符串 这是第三个空格后的字符串
这是第一个空格前的字符串
输入一个字符串,下面讲以nextLine()方法读取缓存数据并输出。
这是一个空格后的字符串 这是第二个空格后的字符串 这是第三个空格后的字符串
Process finished with exit code 0
可以看到,允许的输出只有一行。输入为这是第一个空格前的字符串 这是一个空格后的字符串 这是第二个空格后的字符串 这是第三个空格后的字符串\n
next()方法读取到了第一个空格前的数据,所以打印出了这是第一个空格前的字符串,而缓冲区内剩余的 这是第二个空格后的字符串 这是第三个空格后的字符串\n被后续的nextLine()读取并输出。
此外,Scanner还提供nextInt(),nextFloat(),nextDouble()...等方法以读取其他的数据,并且又hasNextInt(),hasNextFloat(),hasNextDouble()...等方法判断下一个对应数据是否存在。
P.S. IO流类的实例十分占用资源,需要手动关闭(scanner.close())
思考:如果在缓冲区,一个double类型的数据前还有int类型的数据,那么调用scanner.hasNextDouble()会返回true还是false?
Java流程控制
流程控制就只记录不太熟的了。
switch选择结构
直接上例子:
import java.util.Scanner;
public class TrySwitch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int cv = scanner.nextInt();
switch (cv){
case 0:
System.out.println("输入是0");
break;
case 1:
System.out.println("输入是1");
break;
default:
System.out.println("输入是其他");
}
}
}
P.S. JDK7之后Switch语句也可以支持字符串比较。
注意:如果不使用break语句,会顺序执行匹配成功后的case后的所有语句。
增强for循环
主要用于遍历数组和集合,格式如下:
for(declear statement : arrary or set){
statement;
}
举个例子:
public class EnhancedFor {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6};
for(int i : arr){
System.out.println(i);
}
}
}
while循环
在Java内,有两种while循环,一种是普通的,即“当型循环”,如下
while(boolean_expression){
statement;
}
一种是do...while循环,即”直到型循环“,如下:
do{
statement;
}while(boolean_expression)
直到型循环内的语句至少会执行一次。