Day1
1.1 源文件组成部分
- 编写类,也叫外部结构
- 编写main方法,也叫主方法或程序的入口
注意:- 编写在类中
- 在一个类中main方法是可有可无的
- 如果编写main方法,则在一个类中最多有一个
- 编写代码
注意:- 暂时将代码写在入口处
- 可以在入口中编写N条语句,语句也就是以英文分号结束
- 建议:一行编写一条语句
1.2 输出语句
System.out.print("编写大小写字母、汉字、数字、特殊符号。但是输出后不换行");
System.out.println("") // 表示空一行
System.out.println("输出后换行:先输出后换行");
1.3 注释
- 作用:解释说明,在程序中并不运行
- 目的:增加程序的可读性
- 注释分类:
单行注释://
多行注释:/* 内容 /
文档注释:/* 注释内容 */
1.4 public class和class的区别
- 一个类前面的public是可有可无的
- 如果一个类使用public修饰则文件名必须与类名,一致
- 如果一个类前面没有使用public修饰,则文件名和类名可以不一致,当编译成功后会生成对应类名的字节码文件(.class)
- 一个类中的main方法是可有可无的,如果没有编写main方法编译成功,但是不能运行
- 在一个源文件编写任意多个类,当编译成功后会自动生成对应类的个数的字节码文件,并可以运行每个字节码文件(必须保证有入口:main方法)
- 在一个源文件中,最多有一个类前面使用public修饰
Day2
2.1 CLASSPATH
字节码文件路径
注意:当在默认情况下,运行每个字节码文件时在当前目录下找,如果找到则运行,否则报错
配置claspath
临时配置classpath
1.使用set命令完成临时配置classpath:
set classpath=F:\javacourse\javalearning\src\javapack
找到运行,找不到就报错;
set classpath=F:\javacourse\javalearning\src\javapack;
找到就运行,找不到就在当前目录下找,找到运行找不到报错;
set classpath=F:\javacourse\javalearning\src\javapack;F:\javacourse
从前往后找
2.使用set命令完成查看c是否lasspath配置:set classpath
3.使用set命令完成删除classpath配置:set classpath=
永久配置classpath
永远去你配置的路径找,不建议配置永久classpath
2.2 关键字
在java中具有特殊意义的,全部小写
如:class,public,static,void…
2.3 标识符
也就是名字,对类名、变量名、方法名、参数名的修饰
标识符命名规则
以字母、下划线或$开头,其后可以是字母、数字、下划线或美元符号。区分大小写,不能使用关键字
标识符命名规范
- 建议:见名知意,就是说最好编写单词,如name,age
- 建议:类名的每个单词首字母大写,如Hello,HelloWorld,Student
- 建议:变量名称、方法名称、参数名称采用驼峰命名法,如,age,getInfo
- 建议:标识符长度不要超过15个字符,如:HelloWorld,args,avg
2.4 字面值
- 整数类型字面值:100,9,-1,0
- 浮点类型字面值:0.1,3.14159,-98.2
- 字符串类型字面值:必须使用英文双引号引起来,如"你好"
- 字符类型字面值:‘a’,‘1’,‘男’
- 布尔类型字面值:表示只有两个取值,分别是true,false
2.5 进制以及进制之间的转换
常用进制:二进制(0,1),八进制(0-7),十进制(0-9),十六进制(0-9,A-F)
2.6 字符编码
按某种格式某种规定将数据存在计算机中
常用的字符编码:
ASCII:‘a’--------->97 ‘b’------------->98 ‘A’------>65 ‘0’------->48…
iso8859-1:西欧语言编码,兼容ASCII码
GBK/GB2312:中文编码
Unicode:统一全球所有国家的文字
常用的有:utf-8 utf-16 utf-32
注意:java源代码采用unicode编码
乱码、编码、解码
2.7 变量
变量:
存放数据,且该变量中的数据时可以发生改变的
常用的数据类型
整数类型int,浮点类型double,字符串类型string,字符类型char,布尔类型Boolean
变量的操作步骤
- 声明变量,即确定当前变量存放数据的类型
语法格式:数据类型 变量名称;
如,int a - 赋值,也就是将=右侧值赋给等号左边的变量名称
语法格式:变量名称=值;
如a=18 - 使用,暂时使用输出变量的值
class Var{
public static void main(String[] args){
//变量操作步骤
//第一步,声明变量
int a;
double b;
String c;
//第二步,赋值
a = 100;
b = 3.14;
c = "北京市";
//第三步,使用
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
声明的同时完成赋值:
语法格式:数据类型 变量名称 = 值
class Var01{
public static void main(String[] args){
//优化Var代码,在声明的同时完成赋值
//第一步,声明变量并且赋值
int a = 100;
double b = 3.14;
String c = "北京市";
//第二步,使用
System.out.println("a = "+ a); // +表示连接
System.out.println("b = "+ b);
System.out.println("c = "+ c);
}
}
多个变量类型相同,可以一次声明多个变量,之间使用逗号隔开:
class Var02{
public static void main(String[] args){
//将0.1,99.87,-1,59.9存放在变量中,并输出变量的值
//如果有多个变量类型相同,可以一次声明多个变量,之间使用逗号隔开
double a = 0.1,b = 99.87,d = 59.9;
int c = -1;
//第二步,使用
System.out.println("a = "+ a + "\nb = "+b+"\nc = "+c+"\nd = "+d);
}
}
2.8 转义序列符
转义符 | 含义 |
---|---|
\n | 换行符 |
\t | 制表符 |
\\ | \ |
\" | " |
\' | ’ |
\u0000 | Unicode转义符 |
class Var03{
public static void main(String[] args){
System.out.println("Hello\nWorld");//换行符
System.out.println("Hello\n\nWorld");
System.out.println("Hello\tWorld");//水平制表符
System.out.println("F:\\学习视频\\Java视频");//F:\学习视频\Java视频
System.out.println("\"F:\\学习视频\\Java视频\"");//"F:\学习视频\Java视频"
System.out.println("\'F:\\学习视频\\Java视频\'");
System.out.println("'F:\\学习视频\\Java视频'");//'F:\学习视频\Java视频'
System.out.println("Hello\u0000World");//Hello World
System.out.println("Hello\u2605World");//Hello★World
}
}
2.9 变量分类
-
按声明位置(作用范围)分为:
局部变量:在方法中声明的,如main
全局变量:在类中声明,class下 -
按数据类型范围:
基本数据类型变量:在内存中存放真正的值
引用数据类型变量:在内存中存放地址(引用)
变量的内存分析
1.当运行程序时,在内存中JVM会自动分配空间
2.内存中包含
栈:存放方法以及方法中的局部变量
堆:存放方法对象
方法区:代码片段、常量池、静态属性
class Var04{
public static void main(String[] args){
int i;
double j;
i = 123;
String s;
char ch;
ch = '男';
j = 3.14;
s = "李四";
}
}
内存分析图:
结论:
基本数据类型的变量
在内存中存放真正的值,比如int、char、double
引用数据类型变量
在内存中存放地址,比如:String
2.10 基本数据类型
又分为4大类共计8种
整数类型: byte,short,int,long
整数类型中默认为int
整数类型各自取值范围
类型 | 占用存储空间 | 存储范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | [ − 2 15 , 2 15 − 1 ] [-2^{15},2^{15}-1] [−215,215−1] |
int | 4字节 | [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1] [−231,231−1] |
long | 8字节 | [ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63}-1] [−263,263−1] |
class Var05{
public static void main(String[] args){
//byte
byte a = 1;//注意:在java中,当对byte,short,char类型赋值,若没超范围则直接赋值
a = 5;
// a = 128; // 超过了范围
System.out.println("a = "+a);
//long
long d = 6;
d = 123456;
// d = 123456789009;//出现编译错误,因为默认类型为int
d = 123456789009L;//就变成了long,l或L
}
}
浮点类型: float,double(默认)
类型 | 占用内存空间 | 存储范围 |
---|---|---|
float | 4字节 | -3.404E38~3.404E38 |
double | 8字节 | -1.789E308~1.789E308 |
class Var06{
public static void main(String[] args){
//浮点类型
double x = 0.1;
x = 999.99;
System.out.println("x="+x);
// float y = 0.87;//取值大的类型不能直接给小的赋值
float y = 0.87f;//解决办法1
float y = (float)0.87;//解决办法2:强制类型转换
}
}
字符类型: char
- 一次只能存放一个,并且使用英文的单引号引起来
- 一个汉字表示一个字符
- 整数类型和字符类型是可以相互转换的
- 字符类型取值范围0------>65535占两个字节
class Var07{
public static void main(String[] args){
//字符类型
char ch = 'a';
ch = '好';
ch = 100;//注意整数值直接给字符赋值,存放的是ASCII码对应的字符
// ch = -1;//注意字符类型是有取值范围的:0---->65535
System.out.println("ch = "+ch);
int i = 6;
i = 'a';//字符也可以给int赋值,存放的是对应的ASCII码值
System.out.println("i = "+i);
}
}
布尔类型: boolean
- 布尔类型只有两种取值,分别是true、false
- 布尔类型占一个字节
class Var08{
public static void main(String[] args){
//布尔类型
boolean x = true;
System.out.println("x = "+x);
}
}
2.11 类型之间的转换
- 强制类型转换:也叫显式类型转换
当取值范围大的类型赋给取值范围小的类型,必须进行强制类型转换,但是可能存在精度损失,3.14------->3 - 自动类型转换:也叫隐式类型转换
当取值范围小的类型赋给取值范围大的类型
class Var09{
public static void main(String[] args){
//自动类型转换也叫隐式类型转换
byte a = 1;
int b = a;//构成自动类型转换
float c = a;//1.0
int i = (int)3.14;//构成强制类型转换
}
}
Day3
3.1 类型转换的6条规则
- 基本数据类型中除了boolean类型以外,剩余7种类型可以进行相互转换
- 当取值范围小的类型赋值给取值大的类型,构成自动类型转换,也叫隐式类型转换
byte,short,char,int,long,float,double - 当取值范围大的类型不能直接给类型小的赋值,则必须强制类型转换,但可能有精度损失
- 当对byte,short,char类型赋值时,如果没超过该类型取值范围则可以直接赋值
- 当对byte,short,char类型进行混合运算时,先转为int类型再进行计算
- 当多种数据类型混合,先转为取值范围大的类型再进行计算
public class Datatype {
public static void main(String[] args){
byte a = 3;
short b = a;
int c = a + b;
System.out.println("c="+c);
int i = 5;
long j = 6;
double k = 1.2;
double x = i+j+k;
}
}
3.2 算术运算符:
+ - * / %(求余,取模) ++ --
public class Datatype {
public static void main(String[] args){
//当+两边操作数都是数值类型时,则做加法运算
System.out.println(10 + 20);//30
System.out.println(10 + 20.0);//30.0
int a = 3,b = 4;
int sum = a + b;
double k = 1.2;
//当+两边操作数中有一个为非数值型,则做连接
System.out.println("sum="+sum);//sum=7
System.out.println("sum="+a +b);//sum=34
System.out.println("sum="+(a+b));//sum=7
//-,必须保证两个操作数都是数值类型
System.out.println(10-20);
System.out.println(6-4.3);
int x = 5,y=6;
int z=x-y;
System.out.println("z="+z);//z=-1
System.out.println("z="+(x-y));//z=-1
//*
System.out.println(5*6);
System.out.println(5.0*6);
int m=3,n=4;
int l = m*n;
System.out.println("l="+l);//12
System.out.println("l="+m*n);//12
System.out.println(10/2);//5
System.out.println(10/3);//3
System.out.println(7/2.0);//3.5
System.out.println("s结果="+20/6);//3
System.out.println(10%5);//0
System.out.println(9%3.0);//0.0
System.out.println(4%6);//4
System.out.println(0%10);//0
System.out.println(6%0);//除数不能为0
}
}
综合案例:
class Operator{
public static void main(String[] args){
//练习:计算123各个位之和
int num=123;
int gw=num%10;
int sw=num/10%10;
int bw=num/100;
int sum=gw+sw+bw;
System.out.println("sum="+sum);//sum=6
}
}
++
++:表示自身加一
前置++:将++编写在变量名称前面,例如++a;先自身加1再做其他运算
后置++:将++编写在变量名称后面,例如a++;先做其他运算再加一
--
–:自身减一,也分为前置减减和后置减减
class Operator01{
public static void main(String[] args){
//++
int a = 3;
int b = ++a;
System.out.println("a="+a+"\nb="+b);//a=4,b=4
int x = 5;/*
int y = x++;
System.out.println("x="+x+"\ny="+y);//x=6,y=5
*/
int z = x++ +2;
System.out.println("x="+x+"\nz="+z);//x=6,z=7
}
}
3.3 连接运算符:+
求和、连接
class Operator02{
public static void main(String[] args){
int a = 12;
int b = 3;
String s =""+a+b;//有非数值就是拼接
System.out.println("s="+s);//s=123
}
}
3.4 赋值运算符: =
扩展赋值运算符:+=,-=,*=,/=
class Operator03{
public static void main(String[] args){
int x = 5;
x += 0.5;//自动类型转换。x=x+0.5会出现编译错误。
System.out.println("x="+x);//x=5
int a = 123,s=0;
s = s*10+a%10;//s=3
//s *= 10+a%10;//s=s*(10+a%10)
System.out.println("s="+s);
}
}
3.5 关系运算符:
优先级别:算术运算符>关系运算符>赋值运算符
class Operator04{
public static void main(String[] args){
//关系运算符,结果为布尔类型的值
System.out.println(1>2); //false
System.out.println(10>9); //true
System.out.println(5 != 3); //true
//优先级别:算术运算符>关系运算符>赋值运算符
System.out.println(9 % 2==0); //false
System.out.println(2 + 3/6 <= 4*2%5);//true,2<=3
boolean b = 7/4+5%2 == 16/8-5*2%3;//false
}
}
3.6 逻辑运算符:
逻辑与&,逻辑或|,逻辑异或^,逻辑非!,短路与&&,短路或||
逻辑异或:
当两个条件的值不同时,则结果为true,否则为false
逻辑非!:
对布尔类型取反
class Operator05{
public static void main(String[] args){
//逻辑运算符
System.out.println(9>1 & 0 != 1); //true
System.out.println(3 <= 1 & 100 > 10);//false
System.out.println(8 != 9 ^ 12 >10);//false
System.out.println(!false);//true
System.out.println(!(1>9));//true
//优先级别:算术运算符>关系运算符>逻辑运算符
System.out.println(9/6 -4%2 > 0 & 18%9 == 0);//true
//短路与和逻辑与运行结果一样,执行过程不同
System.out.println(3>19 && 0<1);//第一个为false就为false,否则继续判断
System.out.println(3>19 & 0<1);//每一个都要判断
//短路或和逻辑或运行结果一样,短路或第一个结果为true,直接输出true
System.out.println(1 != 2 || 55>66);//true
System.out.println(1 != 2 | 55>66);//true
}
}
3.7 三目运算符:
也叫条件运算符:
条件 ? 代码1:代码2
class Operator06{
public static void main(String[] args){
//三目运算符
String s = 10>20 ? "大于":"不大于";
System.out.println("s="+s);//s=不大于
int num = -3;
int i = num > 0 ? 1 : num < 0 ? -1 : 0;//三种情况嵌套
System.out.println("i="+i);//i=-1
}
}
3.8 键盘接收用户输入
源文件首行输入:
package day03;
import java.util.Scanner;
class Input07{
public static void main(String[] args){
//输入一个数并将概数输出
//第二步:创建Scanner对象
Scanner input = new Scanner(System.in);
//第三步:友好提示
System.out.println("请输入一个数:");
//第四步:键盘输入
int num = input.nextInt();//等待接收用户键盘输入值,回车键结束
System.out.println("num="+num);
}
}
class Input08{
public static void main(String[] args){
//计算两个数的和
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数:");
int num1 = input.nextInt();
System.out.println("请输入第二个数:");
int num2 = input.nextInt();
int sum = num1 + num2;
System.out.println(num1 + "+" + num2 + "=" + sum);
}
}
输入学生信息
class Input09{
public static void main(String[] args){
//输入某个学生的信息(姓名,年龄,性别,成绩,现住址,婚否),输出所有信息
Scanner input = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = input.next();//注意:在java中,键盘接收字符串类型时没有nextString(),而使用的是next()
System.out.print("请输入年龄:");
int age = input.nextInt();
System.out.print("请输入性别:");
String s = input.next();//先接收字符串类型,然后再字符串获取第0个位置的值,则使用charAt(0)
char sex = s.charAt(0);
System.out.print("请输入成绩:");
double score = input.nextDouble();
System.out.print("请输入现住址:");
String address = input.next();
System.out.print("请输入现婚否(true表示已婚,false表示未婚):");
boolean isFlag = input.nextBoolean();
System.out.println("\n学生信息如下:");
System.out.println("姓名:"+name+"\n年龄:"+age+"\n性别:"+sex+"\n成绩:"+score+"\n现住址:"+address+"\n婚否:"+isFlag);
}
}
Day4
4.1 程序流程控制的三大结构
顺序结构: 按顺序逐行进行执行
选择结构:
循环结构:
4.2 if选择结构
语法格式:
if (条件) {
代码块
}
4.3 if else选择结构
if (条件) {
代码块1
}else{
代码块2
}
4.4 多重if选择结构
当做两种或两种以上的情况时,则可以使用多重if选择结构完成
if(条件1){
代码块1
}else if(条件2){
代码块2
}
class If02 {
public static void main(String[] args){
//练习:加入张三参加java考试,判断如果在95分以上有奖励,否则发红包
Scanner input = new Scanner(System.in);
System.out.print("请输入成绩:");
double score = input.nextDouble();
/* 法一:使用两个if块
if(score>95){
System.out.println("有奖励");
}
if(score<=95){
System.out.println("发红包");
}
*/
/* 法二:使用if else
if(score>95){
System.out.println("有奖励");
}else{
System.out.println("发红包");
}
*/
/* 法三:使用三目运算符完成
System.out.println(score>95 ? "有奖励" : "发红包");
*/
// 法四:多重if
if(score>95){
System.out.println("有奖励");
}else if(score<=95){
System.out.println("发红包");
}
}
}
练习:根据输入的年龄,输出老年,中年,青年还是少年
1.注意条件的顺序
2.注意最后else(可省略)
class If03 {
public static void main(String[] args){
//练习:根据输入的年龄,输出老年,中年,青年还是少年,注意条件的顺序
Scanner input = new Scanner(System.in);
System.out.print("请输入年龄:");
int age = input.nextInt();
if(age >= 55){
System.out.println("老年");
}else if(age >= 30){
System.out.println("中年");
}else if(age >= 18){
System.out.println("青年");
}else if(age < 18 && age > 0){
System.out.println("少年");
}
System.out.println("错误的输入");
}
}
练习:判断一个数是奇数还是偶数
class If04 {
public static void main(String[] args){
//练习:判断一个数是奇数还是偶数
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数:");
int num = input.nextInt();
//判断当前数num是否是奇数还是偶数
if(num % 2 == 0){
System.out.println(num+"是偶数");
}else{
System.out.println(num+"是奇数");
}
}
}
4.5 if嵌套
if(){
if(){
}else{
}
}else if(){
}
练习:判断一个三位正整数是否为水仙花数
class If05 {
public static void main(String[] args){
//练习:判断一个三位正整数是否为水仙花数
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数:");
int num = input.nextInt();
//判断当前数num是否是三位正整数
if(num >= 100 && num <= 999){
//获取各个位上的数
int bw = num/100,sw = num%100/10,gw = num%10;
//计算各个位的立方和
int sum = bw*bw*bw+sw*sw*sw+gw*gw*gw;
//判断是否相等
if(sum == num){
System.out.println(num+"是水仙花数");
}
System.out.println(num+"不是水仙花数");
}else{
System.out.println(num+"不是三位正整数");
}
}
}
字符串进行比较
案例:第一名奖励10w,第二名奖励5w,第三名奖励2w,其他情况不奖励
class If06 {
public static void main(String[] args){
//练习:输入名次输出奖励
Scanner input = new Scanner(System.in);
System.out.print("请输入名次:");
String info = input.next();
/*
if(info == "第一名"){
System.out.println("奖励10w");
}else if(info == "第二名"){
System.out.println("奖励5w");
}else if(info == "第三名"){
System.out.println("奖励2w");
}else{
System.out.println("对不起,没有任何奖励");
}
*/
//java中使用==比较的是地址是否一致,如果在字符串中比较必须使用equals
//当字符串进行比较内容时,建议固定值编写在前面
if("第一名".equals(info)){
System.out.println("奖励10w");
}else if("第二一名".equals(info)){
System.out.println("奖励5w");
}else if("第三名".equals(info)){
System.out.println("奖励2w");
}else{
System.out.println("对不起,没有任何奖励");
}
}
}
4.6 switch case
当做等值操作时,可以使用switch case
语法格式:
switch(表达式){
case 常量值1:
操作1;
break;
case 常量值2:
操作2;
break;
default:
}
注意:
- 表达式可以是byte、short、int、char类型,在JDK7.0及以后还可以是String类型、枚举
- 在switch中编写任意多个case
- 常量值类型必须与表达式类型一致
- 当遇到break则执行switch case外面的语句
- default可有可无,如果有一个switch只有一个
class Switch07 {
public static void main(String[] args){
//练习:输入名次输出奖励
Scanner input = new Scanner(System.in);
System.out.print("请输入名次:");
String info = input.next();
switch(info){
case "第一名":
System.out.println("奖励10w");
break;//表示中断,当遇到break则执行switch case外面的语句
case "第二名":
System.out.println("奖励5w");
break;
case "第三名":
System.out.println("奖励2w");
break;
default:
System.out.println("对不起,没有任何奖励");
break;
}
}
}
常见的注意事项:
- case后面顺序可以任意
- default位置也可以任意,建议在最后面
- break可有可无,当没有break则从当前第一个匹配的case一直向下执行(就是穿透)。因此根据题意适当添加break
- case也可以合并
class Switch08 {
public static void main(String[] args){
//练习:输入每天该做的事情
Scanner input = new Scanner(System.in);
System.out.print("请输入字符类型星期(一~日):");
char week = input.next().charAt(0);
switch(week){
case '一':
case '二':
case '四':
case '六':
System.out.println("学习");
break;
case '三':
case '五':
System.out.println("自习");
break;
case '日':
System.out.println("休息");
break;
}
}
}
4.7 多重if和switch case区别
多重if:可以做等值操作,也可以做区间操作
switch case:只能做等值操作