Java中的类名、变量名、方法名都是标识符。
Java 中有 8 种基本数据类型,分别为:
6 种数字类型:
4 种整数型:byte、short、int、long
2 种浮点型:float、double
1 种字符类型:char
1 种布尔型:boolean。
注意:
Java 里使用 long 类型的数据一定要在数值后面加上 L,否则将作为整型解析,同理,float类型在数值后加F。
char a = 'h’char :单引号,String a = “hello” :双引号。
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
1 bit 表示1 位
1Byte 表示一个字节,1B= 8b
1024B = 1KB
1024KB = 1M
1024M = 1G
public class Hello{
public static void main(String[] args) {
float f1 = 0.1f;
double f2 = 1.0/10;
System.out.println(f1); //0.1
System.out.println(f2); //0.1
System.out.println(f1==f2); // false
float f3 = 23232323232222f;
float f4 = f3+1;
System.out.println(f3);
System.out.println(f4);
System.out.println(f3==f4); // true
}
}
float : 有限、离散、存在舍入误差、大约、接近但不等于
最好不要使用浮点数进行比较
金融类问题中,涉及到钱的表示时,使用数学工具类BigDecimal
所有的字符本质都是数字,可以对字符进行强制类型转换为int,即Unicode编码
Unicode编码,2字节,0-65526(2^16)
U0000 - UFFFF
public class Hello{
public static void main(String[] args) {
char c1 = 'a';
char c2 = '你';
char c3 = '\u0061';
System.out.println(c1); //a
System.out.println((int)c1); //强制类型转换 97
System.out.println(c2); //你
System.out.println((int)c2); //强制类型转换 20320
System.out.println(c3); // a
}
}
Java是强类型语言,在运算中,不同的数据类型必须转化为同一类型再进行运算。
优先级从低到高
byte,short,char ---->int—>long---->float ---->double
强制类型转换 : 优先级从高到低
自动类型转换 :优先级从低到高
注意点
public class Hello{
public static void main(String[] args) {
int a = 128;
byte b = (byte)a; //强制类型转换
double c = a; //自动类型转换
System.out.println(a); //128
System.out.println(b); //-128 byte类型的最大为127,内存溢出
System.out.println(c); //128.0
}
}
public class Hello{
public static void main(String[] args) {
int money = 10_0000_0000; //借助下划线进行分割,不影响输出
int year = 20;
int total = money*year;
long total1 = money*year;
long total2 = money*((long)year);
System.out.println(total); //-1474836480 内存溢出
System.out.println(total1); //-1474836480 内存溢出
System.out.println(total2); //20000000000 先对一个数字进行强制类型转换
}
}
type varName [=value] [{,varName[=value]}]
//数据类型 变量名= 值;可以使用逗号隔开来声明多个同类型变量(但是不建议,程序可读性较低)
注意点
public class Variable {
// 实例变量
String name;
int age;
//类变量(全局变量)static
static int schoolId = 1002;
public static void main(String[] args) {
//局部变量,必须进行声明和初始化
int stuId = 1002003;
System.out.println(stuId); // 1002003
Variable variable = new Variable();
System.out.println(variable.name); // null
System.out.println(variable.age); //0
System.out.println(schoolId); //1002
}
public void add(){
int a = 10;
int b = 12;
System.out.println(a+b);
System.out.println(stuId); // 报错,未声明
System.out.println(schoolId); //1002
}
}
final static double PI = 3.14; 和static final double PI = 3.14; 都可以,修饰符不分先后顺序
Java语言支持如下运算符:
public class HelloWorld {
public static void main(String []args) {
int m = 10;
int n = 4;
System.out.println(m/n);// 2
System.out.println(m/(double)n); //2.5
int a = 2;
int b = a++; //等价于 b=a,a=a+1,先赋值,后自增,b=2,a=3
int c = ++a; //等价于 a=a+1,c=a,先自增,后赋值,a=4,c=4
System.out.println("a的值:"+a); //4
System.out.println("b的值:"+b);//2
System.out.println("a的值:"+a);//4
System.out.println("c的值:"+c);//4
}
}
public class HelloWorld {
public static void main(String []args) {
//字符串连接符 +
int a = 20;
int b = 30;
System.out.println("" +a+b);// 2030
System.out.println(a+b+"");//50
}
}
public class HelloWorld {
public static void main(String []args) {
//与(and) 或(or) 非(取反)
boolean a = true;
boolean b = false;
System.out.println("a&&b:"+(a&&b)); //false逻辑与运算,两者都为真结果才是true,有一个为假则是假
System.out.println("a||b:"+(a||b));//true逻辑或运算,变量有一个为真,结果就为真,两个全假,结果才是假
System.out.println("!(a&&b):"+(!(a&&b)));//true取反,真变假,假变真
//短路运算
int c1 = 8;
int c2 = 8;
int c3 = 8;
boolean d = (c1>10)&&(c1++>8);
boolean e = (c2>5)||(c2++>8);
boolean f = (c3>5)&&(c3++>8);
System.out.println("c1:"+c1);//8
System.out.println("c2:"+c2);//8
System.out.println("c3:"+c3);//9
System.out.println("d:"+d);//false
System.out.println("e:"+e);//true
System.out.println("f:"+f);//false
}
}
public class HelloWorld {
public static void main(String []args) {
//与(&) 或(|) 非(~) 异或(^)
/*
A = 0011 1100
B = 0000 1101
==============
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
如何提高2*8 = 16的计算速度?
使用位运算符中的<<, 2*8 =>2*2*2*2=>2<<3
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 1000 8
0001 0000 16
*/
int a = 2;
System.out.println("a<<3:"+(a<<3));// a<<3:16
}
}
public class HelloWorld {
public static void main(String []args) {
//三元运算符 ? :
// x?y:z
// 如果x==true,则结果为y,否则结果为 z
int age = 17;
String adult = age>18 ? "成年" : "未成年";
System.out.println(adult);
}
}
括号级别最高,逗号级别最低,单目 > 算术 > 位 > 关系 > 逻辑 > 三目 > 赋值
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ( ) [ ] . | 从左到右 |
2 | ! ~ ++ – | 从右到左 |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | << >> >>> | 从左到右 |
6 | < <= > >= instanceof | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ? : | 从左到右 |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= | 从右到左 |
15 | , | 从右到左 |
《阿里巴巴Java开发手册》
javadoc命令用于生成自己的API文档
参数信息:
Idea设置文件创建时自动生成注释:
File–>settings–>Editor–>File and Code Templates–>Files–>Class文件类型–>includes
/**
*@author ${USER}
*@date ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINUTE}
*/
Java.util.Scanner 是Java5的新特性,可通过Scanner类来获取用户的输入。
基本语法:
Scanner s = new Scanner(System.in);
通过Scanner 类的next()与nextLine()方法获取输入的字符串,再读取前使用hasNext()和haxNextLine()判断是否还有输入的数据。
import java.util.Scanner;
public class HelloWorld {
public static void main(String []args) {
// 创建一个扫描器对象,用于接收用户输入的键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式进行接收:");
//判断用户是否还有输入
if(scanner.hasNext()){
//使用next接收
String str = scanner.next(); //程序等待用户输入完成之后继续运行
System.out.println("用户输入为:"+str);
}
System.out.println("使用nextLine方式进行接收:");
//判断用户是否还有输入
if(scanner.hasNextLine()){
//使用next接收
String str = scanner.nextLine(); //程序等待用户输入完成之后继续运行
System.out.println("用户输入为:"+str);
}
//凡是属于IO流的类,使用完之后要进行关闭,否则会一直占用资源
scanner.close();
}
}
import java.util.Scanner;
public class MyScanner {
public static void main(String []args) {
// 创建一个扫描器对象,用于接收用户输入的键盘数据
Scanner scanner = new Scanner(System.in);
//接收用户传入的数据
int i = 0;
float f = 0.0f;
System.out.println("请输入整数:");
//判断用户是否还有输入
if(scanner.hasNextInt()){
//使用nextInt接收
i = scanner.nextInt(); //程序等待用户输入完成之后继续运行
System.out.println("整数数据:"+i);
}else{
System.out.println("输入的不是整数!!");
}
System.out.println("请输入小数:");
//判断用户是否还有输入
if(scanner.hasNextFloat()){
//使用nextFloat接收
f = scanner.nextFloat(); //程序等待用户输入完成之后继续运行
System.out.println("小数数据:"+f);
}else{
System.out.println("输入的不是小数!!");
}
//凡是属于IO流的类,使用完之后要进行关闭,否则会一直占用资源
scanner.close();
}
}
练习:
计算连续输入的多个数字的和以及他们的平均数
import java.util.Scanner;
public class MyScanner {
public static void main(String []args) {
// 创建一个扫描器对象,用于接收用户输入的键盘数据
Scanner scanner = new Scanner(System.in);
//接收用户传入的数据
int sum = 0;
double n = 0.0;
System.out.println("请输入整数:");
while(scanner.hasNextDouble()){
double x = scanner.nextDouble();
n++;
sum +=x;
}
System.out.println("您一共输入了"+n+"个数字。");
System.out.println(n+"个数字的总和是:"+sum);
System.out.println(n+"个数字的平均数是:"+sum/n);
//凡是属于IO流的类,使用完之后要进行关闭,否则会一直占用资源
scanner.close();
}
}
Java的基本结构就是顺序结构,除非特别指明,否则就是按照顺序一句一句执行
语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个一次执行的处理步骤组成的,顺序结构是任何一种算法都离不开的基本算法结构。
if (布尔表达式){
//表达式为真,则执行语句
语句;
}
其他语句;
import java.util.Scanner;
public class MyScanner {
public static void main(String []args) {
// 创建一个扫描器对象,用于接收用户输入的键盘数据
Scanner scanner = new Scanner(System.in);
//接收用户传入的数据
String s = scanner.nextLine();
if(s.equals("Hello")){
System.out.println(s);
}
System.out.println("欢迎!");
//凡是属于IO流的类,使用完之后要进行关闭,否则会一直占用资源
scanner.close();
}
}
if(布尔表达式){
//表达式为真
语句一;
}else{
//表达式为假
语句二;
}
import java.util.Scanner;
public class MyScanner{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的年龄:");
int age = scanner.nextInt();
if(age>=18){
System.out.println("恭喜您,成年了!");
}else{
System.out.println("很遗憾,您还未成年!");
}
scanner.close();
}
}
if(布尔表达式1){
//布尔表达式1为真时的执行语句
语句1;
}else if(布尔表达式2){
//布尔表达式2为真时的执行语句
语句2;
}else if(布尔表达式3){
//布尔表达式3为真时的执行语句
语句3;
}else{
//以上布尔表达式都不为真时执行的代码
语句4;
}
import java.util.Scanner;
public class MyScanner{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的成绩:");
int score = scanner.nextInt();
if(score == 100){
System.out.println("恭喜您,满分!");
}else if(score>=90 && score<100){
System.out.println("A级!");
}else if(score>=80 && score<90){
System.out.println("B级!");
}else if(score>=70 && score<80){
System.out.println("C级!");
}else if(score>=60 && score<70){
System.out.println("D级!");
}else if(score>=0 && score<60){
System.out.println("很遗憾,不及格!");
}else{
System.out.println("输入成绩不合法!!!");
}
scanner.close();
}
}
注意
if(布尔表达式1){
// 如果布尔表达式1为真,则执行后续代码,否则直接跳出
if(布尔表达式2){
//布尔表达式2为真时执行的代码
}
}
import java.util.Scanner;
public class MyScanner{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入您的号码:");
int num = scanner.nextInt();
if(0<num && num <100){
if(0<num && num<50){
System.out.println("num的位置在左边");
}else{
System.out.println("num的位置在右边");
}
}else{
System.out.println("您的num不合法");
}
scanner.close();
}
}
switch 语句中的变量类型可以是:
switch(expression){
case value1:
语句一;
break; //可选
case value2:
语句二;
break; //可选
case value3:
语句三;
break; //可选
... //case语句数量任意
default: //可选
语句;
}
注意
case穿透
没有break的情况,满足条件的case之后的所有case不管是否满足条件都会执行
public class MyScanner{
public static void main(String []args){
char grade ='C';
switch(grade){
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
break;
case 'C':
System.out.println("中等");
// break;
case 'D':
System.out.println("再接再厉");
// break;
default:
System.out.println("输入有误");
}
}
}
//case 穿透,满足条件之后的所有case都执行了
// 中等
// 再接再厉
// 输入有误
字符的本质还是数字,switch case 中使用字符串,底层还是转换为了hashcode进行比较
反编译 : Java编译生成 class 文件(字节码文件),使用Idea进行反编译,查看底层逻辑
项目结构(Project setting ) -->编译输出目录(Project compiler output)–>在目录中找到对应的class文件–>讲class文件从文件夹的角度放进Idea工作区(不能直接拖,会报错)–>双击class文件进行查看
Hello.java
public class Hello{
public static void main(String[] args) {
String name = "肖战";
switch(name){
case "肖战":
System.out.println("唯一");
break;
case "哥哥":
System.out.println("张杰");
break;
default:
System.out.println("还有谁");
}
}
}
Hello.class
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class Hello {
public Hello() {
}
public static void main(String[] args) {
String name = "肖战";
byte var3 = -1;
switch(name.hashCode()) {
case 695456:
if (name.equals("哥哥")) {
var3 = 1;
}
break;
case 1045570:
if (name.equals("肖战")) {
var3 = 0;
}
}
switch(var3) {
case 0:
System.out.println("唯一");
break;
case 1:
System.out.println("张杰");
break;
default:
System.out.println("还有谁");
}
}
}
while循环的基本结构
while(布尔表达式){
//循环内容
}
public class MyScanner{
public static void main(String []args){
int i = 0;
int sum = 0;
while(i<100){
i++;
sum +=i;
}
System.out.println("0-100的和为:"+sum); // 0-100的和为:5050
}
}
对于while语句而言,如果不满足条件,则不能进入循环,有时需要即使不满足条件也至少执行一次。
do …while循环和while循环相似,但是do…while循环至少会执行一次。
do{
//代码语句
}while(布尔表达式);
public class MyScanner{
public static void main(String []args){
int i = 0;
int sum = 0;
// 使用while
// while(i<100){
// i++;
// sum +=i;
// }
// System.out.println("0-100的和为:"+sum);
System.out.println("==========");
// 使用do...while
do{
i++;
sum += i;
}while(i<100);
System.out.println("0-100的和为:"+sum);
}
}
while 和do…while的区别
public class MyScanner{
public static void main(String []args){
int i = 0;
// 使用while
while(i>0){
System.out.println(i);
}
System.out.println("==========");
// 使用do...while
do{
System.out.println(i);
}while(i>0);
}
}
// 运行结果
// ==========
// 0
在Java5中引入了一种主要用于数组的增强型for循环。
for(初始化;布尔表达式;迭代更新){
//代码块
}
public class MyScanner{
public static void main(String []args){
// 使用while循环
int m = 0; //循环初始条件
while(m<10){ //循环终止条件
System.out.println("while"+m); //循环执行语句
m+=2; //迭代条件
}
System.out.println("while循环结束");
// 使用for循环
for(int j=0;j<10;j+=2){//循环初始条件、终止条件、迭代语句
System.out.println("for:"+j); //循环执行语句
}
System.out.println("for循环结束");
}
}
注意点
(1)计算0-100之间的奇数和偶数的和
public class Sum{
public static void main(String []args){
int oddSum = 0;
int evenSum = 0;
for(int i=0;i<=100;i++){
if(i%2==0){
evenSum+=i;
}
else{
oddSum+=i;
}
}
System.out.println("0-100奇数的和:"+oddSum);
System.out.println("0-100偶数的和:"+evenSum);
}
}
(2)用while和for循环输出1-1000之间能够被5整除的数,一行输出5个
public class ForDemo{
public static void main(String []args){
// 用while和for循环输出1-1000之间能够被5整除的数,一行输出5个
// 使用for循环
int sum = 0;
for(int i=1;i<=1000;i++){
if(i%5==0){
System.out.print(i+"\t");
}
if(i%(5*5)==0){
System.out.println();
// System.out.print("\n");
}
}
System.out.println("==========");
// 使用while循环
int sum2 = 0;
int j = 1;
while(j<=1000){
if(j%5==0){
System.out.print(j+"\t");
}
if(j%(5*5)==0){
System.out.println();
// System.out.print("\n");
}
j++;
}
}
}
(3)打印九九乘法表
public class MultiNine{
public static void main(String []args){
// 打印九九乘法表
// 1. 先打印列;2.将固定的1用循环包起来;3.去掉重复项,i<=j;4.调整样式
// 1.倒三角
for(int i=1;i<10;i++){
for (int j=i;j<10;j++){
System.out.print(i+"*"+j+"="+(i*j)+"\t");
}
System.out.println();
}
System.out.println("========================");
// 2.正三角
for(int i=1;i<10;i++){
for (int j=1;j<=i;j++){
System.out.print(i+"*"+j+"="+(i*j)+"\t");
}
System.out.println();
}
}
}
for(声明语句:表达式){
//代码语句;
}
public class ForPlus{
public static void main(String []args){
// 增强for循环
int nums[] = {1,2,3,4,5,6};
for(int x:nums){
System.out.println(x);
}
System.out.println("===============");
for(int i=0;i<nums.length;i++){
System.out.println(nums[i]);
}
}
}
public class MyBreak{
public static void main(String []args){
// break 结束循环
// 程序执行,输出0-77,然后跳出循环,执行后面的语句
for(int i=0;i<100;i++){
if(i==78){
break;
}
System.out.println(i);
}
System.out.println("Finish");
}
}
public class MyContinue{
public static void main(String []args){
// continue 结束单次循环
// 程序执行,遇到13的倍数则跳过这次循环,进行下一次的判断
for(int i=0;i<100;i++){
if(i%13==0){
System.out.println();
continue;
}
System.out.print(i+"\t");
}
System.out.println("Finish");
}
}
打印一个三角形
public class Triangle{
public static void main(String []args){
// 打印一个三角形
for(int i = 0;i<5;i++){
for(int j=5;j>i;j--){
System.out.print(" ");
}
for(int m=0;m<=i;m++){
System.out.print("*");
}
for(int n=0;n<i;n++){
System.out.print("*");
}
System.out.println();
}
}
}