01/27 DAY1

程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。

JAVA:Sun Mircosystems于1995年推出的高级编程语言。

JAVA的几种版本:

  • SE:主要用于桌面程序,控制台开发,是JAVA学习的基础体系。
  • EE:企业级开发(网站开发和基于b/s模式的编程)。
  • ME:嵌入式开发(手机、小家电)

他仨大概是这个关系:

┌───────────────────────────┐
│Java EE                    │
│    ┌────────────────────┐ │
│    │Java SE             │ │
│    │    ┌─────────────┐ │ │
│    │    │   Java ME   │ │ │
│    │    └─────────────┘ │ │
│    └────────────────────┘ │
└───────────────────────────┘

因为Java程序必须运行在JVM之上,第一件事情就是安装JDK,配置环境变量,这个我会,跳过了。

JAVA程序结构:

  • 这里的类名是shawroot,JAVA大小写敏感。类名必须和文件名一致,例如这里久必须叫shawroot.java
  • public表示这个类是公开的,publicclass都是Java的关键字,必须小写。
  • 这里的main方法有一个参数,参数类型是String[],参数名是argspublicstatic用来修饰方法,这里表示它是一个公开的静态方法,void是方法的返回类型,而花括号{}中间的就是方法的代码。

输出Hello,World!

public class shawroot{
	public static void main(String[] args){
		System.out.println("Hello World!");
	}
}

编译:

JAVA中print、println、printf的区别:

  • print:就是一般的标准输出, 但是不能换行。
  • println:和print没啥区别,最后会换行。
  • printf:继承了C语言的一些特性,可以进行格式化输出。
public class shawroot{
	public static void main(String[] args){
		int d = 123;
		double f = 123.4567;
		String str = "hello world!";
		System.out.printf("%f", f);// "f"表示格式化输出浮点数
		System.out.println();
		System.out.printf("%9.2f", f);// "9.2"中的9表示输出的长度,2表示小数点后的位数。
		System.out.println();
		System.out.printf("%d", d);// "d"表示输出十进制整数。
		System.out.println();
		System.out.printf("%x", d);// "x"表示输出十六进制整数。
		System.out.println();
		System.out.printf("%o", d);// "o"表示输出八进制整数。
		System.out.println();
		System.out.printf("%#x", d);// "#x"表示输出带有十六进制标志的整数。
		System.out.println();
		System.out.printf("%s", str);// "s"表示输出字符串。
	}
}

运行后效果:

//我是java的单行注释。
/*
hi,我是java的多行注释。
*/

常用的控制输出符:

  • \t:输出8个空格,相当于一个制表位。
  • \n:换行。

01/28 DAY2

变量:是存储数据的一个单元。

变量就是一个容器,用来装数据的,变量是放在内存里的。

数据类型如下:

数据类型说明
char(字符)占2个字节,用来存储单个字符,例如:‘开’、‘关’。
int(整型)整数。从-2147483648,到2147483647共10位。
double(双精度)占八字节,小数。
float(单精度)比较浮点数时a==0.1是不合适的,应该a-0.1==0
boolean(逻辑)只允许取值true或false,不可以0或非0的整数替代true和false。
string(字符串)例如:‘少女的征途是星辰大海’。
byte(字节)占1个字节,从-128~127。
short(短整型)从-32768到32767。

判断某个数据的类型:https://blog.csdn.net/weixin_42553433/article/details/88070083

需要注意的点1:

变量名命名规范(首字母+其余部分):

  • 首字母:不能是关键字,可以是字母、‘_’下划线、‘$’符号。
  • 其余部分:数字字母、‘_’下划线、‘$’符号。

需要注意的点2:必须先声明变量并且赋值,才能使用。

下面这段代码,因为没有给变量title赋值,所以报错了:

public class shawroot{
	public static void main(String[] args){
		String title;
		System.out.println(title);
	}
}

需要注意的点3:赋值运算符是‘=’,它会将右面的值传给左面的变量。

下面这段代码,因为没有给变量b赋值(未初始化b),却要将b的值赋给变量a,所以报错了:

public class shawroot{
	public static void main(String[] args){
		int a = 100;
		int b;
		a = b;
		System.out.println(b);
	}
}

需要注意的点4:如果要赋值,类型必须相同。

符号:

+它既可以是算数运算符,也可以是连接符。
%取模,也称之为取余。

练习:根据天数(46)计算周数和剩余的天数?

public class shawroot{
	public static void main(String[] args){
		int all = 46;
		int week;
		int day;
		System.out.printf("总共有%d天,周数为%d,剩余天数为%d。",all,all/7,all%7);
	}
}
//运行得:总共有46天,周数为6,剩余天数为4。

02/01 DAY3

有关类型的自动转换的一些事。

【整型】+【浮点型】结果是【浮点型】:

public class shawroot{
	public static void main(String[] args){
		int a = 100;
		double b = 25.5;
		System.out.print(a+b);
	}
}
//运行得:125.5

如果不是输出【整型】+【浮点型】的值,而是将结果赋值给一个变量,这个变量必须也是浮点型,例如以下代码,将结果赋值给整型,代码会错误!正确写法为:double sum = A+AA;

public class shawroot{
	public static void main(String[] args){
		int A = 10;
		double AA = 100.5;
		int sum = A+AA;
	}
}
/*
运行结果:
shawroot.java:5: 错误: 不兼容的类型: 从double转换到int可能会有损失
                int sum = A+AA;
                           ^
1 个错误
*/

需要注意的点5:

  • double不可以自动转换为int(int a = 10.0; ×)
  • double可以存储整型(double a = 10; √)

【字符】+【字符】+【字符】相加,结果是三个char变量ascii值相加的结果:

public class shawroot{
	public static void main(String[] args){
		char a = '男';
		char b = '与';
		char c = '女';
		System.out.print(a+b+c);
	}
}
//运行得:72888

【字符】+【字符串】结果是【字符串】:

public class shawroot{
	public static void main(String[] args){
		char a = '男';
		String c = "女";
		System.out.print(a+c);
	}
}
//运行得:男女

强制类型转换格式:(类型名)表达式

练习:去年Apple笔记本所占的市场份额是20,今年增长的市场份额是9.8,求今年所占的份额?

public class shawroot{
	public static void main(String[] args){
		int lastyear = 20;
		double year = 9.8;
		int newyear = lastyear+(int)year;
		System.out.print(newyear);
	}
}
//运行得:29

需要注意的点6:String类型不能强制转换为char类型。

利用扫描仪Scanner进行数据输入,实现人机交互,

我得吐槽一下是真他🐎麻烦:

import java.util.Scanner; //放在类声明前
public class shawroot{
	public static void main(String[] args){
		//创建Scanner对象
		Scanner in = new Scanner(System.in);
		//System.out相反,是输出
		System.out.println("请告诉我,你的名字:");
		//in是变量名
		String name = in.next();
		System.out.println("你好呀,"+name);
	}
}

使用扫描仪时,不同数据接收方法也有不同的变化。

整型数据

in.nextInt();

双精度小数:

in.nextDouble();

字符串:

in.next();

需要注意的点7:没有in.nextChar()这个方法来接收单个字符的输入!

除了next()外,还有一个函数叫nextLine(),它俩的区别如下:

  • next()一定要读取到有效字符后才可以结束输入。对输入有效字符之前遇到的空格键、TAB键和Enter键等结束符,next()方法会自动将其去掉。
  • nextLine()方法的结束符只是Enter键。

02/02 DAY4

常用的关系运算符:

  • >、<
  • ==、!=
  • >=、<=

关系运算符的作用:用来作比较运算,比较后的结果是布尔类型。

public class shawroot{
	public static void main(String[] args){
		int A = 0;
		double B = 0.00;
		boolean flag;	//布尔类型
		flag = A == B;
		System.out.println(flag);
	}
}
////运行得:true

if条件语句的使用实例:

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.print("请问您的性别是:");
		String sex = sc.next();
		if(sex.equals("男")){
			System.out.println("您好,先生。");
		}
		if(sex.equals("女")){
			System.out.println("您好,女士。");
		}
	}
}

需要注意的点8:字符串是对象,比较要用sex.equals("男"),单引号代表char类型,双引号是String类型。

上述代码还是不严谨,可以引入[if]-[else if]-[else]条件结构重新修改一下:

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.print("请问您的性别是:");
		String sex = sc.next();
		if(sex.equals("男")){
			System.out.println("您好,先生。");
		}
		else if(sex.equals("女")){
			System.out.println("您好,女士。");
		}
		else{
			System.out.println("您好。");
		}
	}
}

练习:对学员的结业考试进行成绩评测。

成绩描述
>=90优秀
>=80且<90良好
>=60且<80中等
<60
import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入成绩:");
		double score = sc.nextDouble();
		if(score >= 90){
			System.out.println("成绩优秀。");
		}else if(score >= 80 && score < 90){
			System.out.println("成绩良好。");
		}else if(score >= 60 && score < 80){
			System.out.println("成绩中等。");
		}else{
			System.out.println("成绩差。");
		}
	}
}

Switch多分支结构。Switch是切换的意思,case是例子。Switch中的变量是多少,就会匹配到具体的case中。需要注意的点9:case中是不能写变量的,必须是常量。

示例:

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.print("想要几颗糖?");
		int number = sc.nextInt();
		switch(number){
			case 1:
				System.out.println("给你一颗糖^^。");
				break;
			case 2:
				System.out.println("给你两颗糖^^。");
				break;
			default:
				System.out.println("我没有那么多糖TAT。");
		}
	}
}

break断开的意思,在这里表示逻辑执行完毕,如果去掉break,程序还会去执行下面的逻辑。

取整随机数,方法一:

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		Random xx = new Random();
		int number = xx.nextInt(10);//0~9
		System.out.println(number);
	}
}

取整随机数,方法二:最小值+(类型)(Math.random()*最大值)

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		int randomNum = 0 + (int)(Math.random() * 10);
		System.out.println(randomNum);
	}
}

综合运用示例,猜拳游戏:

import java.util.*; //通配符表示,引入Scanner
public class shawroot{
	public static void main(String[] args){
		System.out.println("[*]欢迎来到猜拳游戏!");
		Scanner sc = new Scanner(System.in);
		System.out.print("[*]请出拳(1.剪刀2.石头3.布):");
		int person = sc.nextInt();
		int computer = 1+(int)(Math.random()*3);
		//System.out.println(computer);
		String marks1 = "拳头";
		String marks2 = "拳头";
		switch(person){
			case 1:
				marks1 = "剪刀";
				break;
			case 2:
				marks1 = "石头";
				break;
			case 3:
				marks1 = "布";
				break;
			default:
				marks1 = "作弊";
		}
		switch(computer){
			case 1:
				marks2 = "剪刀";
				break;
			case 2:
				marks2 = "石头";
				break;
			case 3:
				marks2 = "布";
				break;
		}
		System.out.println("[*]你出的是:"+marks1);
		System.out.println("[*]我出的是:"+marks2);
		if(marks1 == "作弊"){
			System.out.println("[*]玩家作弊,游戏结束!");
		}else if(person == computer){
			System.out.println("[*]平局。");
		}else if((person == 1 && computer == 3) || (person == 2 && computer == 1) || (person == 3 && computer == 2)){
			System.out.println("[*]你赢啦。");
		}else{
			System.out.println("[*]我赢啦。");
		}
	}
}

02/04 DAY5

三元运算符:

public class shawroot{
	public static void main(String[] args){
		int a = 50;
		int c = a>100?200:500;    //三元运算符
		System.out.println(c);
	}
}

等价于:

public class shawroot{
	public static void main(String[] args){
		int a = 50;
		int c;
		if(a > 100){
			c = 200;
		}else{
			c = 500;
		}
		System.out.println(c);
	}
}

while循环:如果代码重复执行或相似或相近的代码,其中有变化的地方是有规律可循的,那么就可以考虑使用while循环。

优点:先判断,在循环。符合条件,循环继续执行,否则推出。

示例:输出一万遍“我爱你”:

public class shawroot{
	public static void main(String[] args){
		int i = 1;
		while (i < 10000){
			System.out.println("我爱你");
			i = i + 1;
		}
	}
}

需要注意的点10:在循环里声明的变量是局部变量。所以循环体里最好不要声明变量。

练习:1+2+3+4+5+…+100=?

public class shawroot{
	public static void main(String[] args){
		int i = 1;
		int sum = 0;
		while (i < 101){
			sum = i + sum;
			i = i + 1;
		}
		System.out.println(sum);
	}
}

练习:2006年培训学院8万人,每年增长25%,请问按比增长速度,到哪一年培训人员数量达到20万人。

public class shawroot{
	public static void main(String[] args){
		int year = 2006;
		double people = 80000;
		while( people < 200000){
			people = people + (people * 0.25);
			year = year + 1;
		}
		System.out.println("当"+year+"年时可达到20万人");
	}
}

02/05 DAY6

do-while循环:先执行循环操作,再进行循环条件判断。至少要执行一次循环操作,不管它是否成立。

public class shawroot{
	public static void main(String[] args){
		do{
			[循环操作]
		}while([循环条件])
	}
}

示例:

import java.util.*;
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		String answer;
		do{
			System.out.println("接着奏乐,接着舞^^");
			System.out.println("是否继续?(y/n)");
			answer = sc.next();
		}while(answer.equals("y"));
		System.out.println("不演了,歇会。");
	}
}

练习:连续输入学生姓名,输入q则退出系统。

import java.util.*;
public class shawroot{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		String name;
		do{
			System.out.println("请输入学生姓名:");
			name = sc.next();		
		}while(!name.equals("q"));
		System.out.println("程序结束");
	}
}

for循环结构:

public class shawroot{
	public static void main(String[] args){
		for(参数初始化;条件判断;更新循环变量){
			循环操作;
		}
	}
}

练习:输出五科成绩,并计算平均分。

import java.util.*;
public class shawroot{
	public static void main(String[] args){
		String[] project = {"数学","语文","英语","物理","化学"};
		Scanner sc = new Scanner(System.in);
		int sum = 0;
		for(int i=0;i<5;i++){
			System.out.println("请输入"+project[i]+"成绩:");
			sum = sum+sc.nextInt();
		}
		System.out.println("平均成绩为:"+sum/5);
	}
}

03/01 DAY7

java类与对象 Class & Object,举例:

ClassA.java文件的内容如下:

public class ClassA{
	int a;
	char b;
}

shawroot.java文件的内容如下:

import java.util.*;
public class shawroot{
	public static void main(String[] args){
		ClassA obj1;
		obj1 = new ClassA();  //初始化 或叫做 实例化
		ClassA obj2 = new ClassA();  //声明并赋值的操作
		
		obj1.a = 20;
		obj1.b = 'k';
		
		obj2.a = 100;
		obj2.b = 'p';
		
		System.out.println(obj1.a);
		System.out.println(obj2.a);
	}
}
/*
编译并执行后得到:
20
100
*/

需要注意的是,如果不创造新的实例,指向的都是同一个变量,例如:

import java.util.*;
public class shawroot{
	public static void main(String[] args){
		ClassA obj1;
		ClassA obj2;
		obj1 = new ClassA();
		
		obj1.a = 20;
		obj1.b = 'k';
		
		obj2 = obj1;
		obj2.a = 30;
		
		System.out.println(obj1.a);
		System.out.println(obj2.a);
	}
}
/*
编译并执行后得到:
30
30
*/

类似于int、char这种赋值类型叫做:基础类型(值类型)。赋值时直接改变自身代表的数量。

而上面“ClassA”这种赋值类型叫做:引用类型。它不具体代表某个数量某个值,而是会引用内存中其他位置表示的值。java中所有Class类型都是引用类型。