这篇文章上次修改于 855 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
1.java语言概述:
1. 基础dos命令:
md:创建文件夹
cd:切换目录
2.java开发环境安装及配置:
3.第一个java命令:HelloWorld
class HelloWorld{
public static void main(String[] args){
System.out.println("hello world!");
}
}
4.常见问题解释:
1.在windows中,文件名不区分大小写,所以在windows中文件名的大小写不影响编译执行
2.装软件等尽量将路径改为纯英文。
1.1练习题:
1.jdk/jre/jvm三者之间的关系,以及jdk/jre包含的主要机构有哪些?
JDK=JRE + java的开发工具(javac.exe,java.exe,javadoc.exe)
JRD=JVM + java核心类库
2.为什么要配置path环境变量,怎么配置?
JAVA_HOME = bin的上一层目录
path = %JAVA_HOME%\bin
3.常用的几个windows命令行操作
dir:列出当前目录下的文件和文件夹
cd:进入指定目录
md:创建目录
rd:删除目录
del:删除文件
4.创建如下类,使运行的话可以正常输出
题目:姓名:XXX
性别:男
居住地:北京市
解题:创建一个java文件:man.java
public class man{
public static void main(String[] args){
System.out.println("姓名:XXX");
System.out.println();
System.out.println("性别:男");
System.out.println("居住地:北京市");
}
}
5.编译和运行上述代码的指令
编译:javac man.java
运行:java man
2.java基本语法:
1.java的注释及常用字符:
1." // "表示单行注释。
2." /*注释内容*/ "表示多行注释。
3.编译后的自解码文件(.class)文件中不包含注释掉的内容。
4." /** 文档注释 xuan'xi@author @version */ "文档注释的内容可以被JDK提供的javadoc工具所解析,生成一套以网页形式存在的
javadoc用法:javadoc -d 要生成的文件名 -author -version java文件名.java
5.多行注释是不可以嵌套使用的
6.\n在java中表示换行符
7.\t在java中表示制表符
8.单独一个'\',在java中表示转义符的意思
2.java注意事项:
1.在java中,要严格区分大小写。
2.java文件(以.java结尾)写完后,先执行javac对代码进行编译,编译命令格式:javac {文件名.java} ,生成.class文件,再对该class文件利用java命令进行执行操作,运行命令格式:java {类名} 。
3.在windows中不需要配置classpath变量。
4.每一行代码的的最后要加入分号结尾
5.在一个java源文件中可以有多个类,但是最多只能有一个可以声明为public,要求声明public的类名必须与源文件名相同。
6.程序的入口时main()方法,格式是固定的:public static void main(String[] args)或public static void main(String a[])
7.输出语句:
System.out.println():先输出数据,后换行,小括号里边没有写内容的话表示不输出直接换行
System.out.print():输出完数据之后没有换行
8.编译的过程:编译以后,会生成一个或多个自解码文件,自解码文件的文件名与java源文件中的类名相同,源文件有几个类会生成几个自解码文件
9.运算符两侧习惯性加空格:a + b = c
3.java的api文档
4.关键字和保留字:
1)关键字:
定义:被java语言赋予了特殊含义,用作专门用途的字符串
特点:关键字中所有字母都为小写
2)保留字:
现有java版本尚未使用,但以后的版本可能会作为关键字使用,自己在明明标识符时要避免使用这些保留字
5.标识符:
定义:java对各种变量、方法和类等要素命名时使用的字符序列成为标识符
技巧:凡是自己可以起名的地方叫做表示符
1)合法标识符规则:
1)由26个英文字母大小写,0-9 ,_或 $ 组成
2)数字不可以开头。
3)不可以使用关键字和保留字,但能包含关键字和保留字。
4)Java中严格区分大小写,长度无限制。
5)标识符不能包含空格
2)标识符命名规范:
1)包名:多单词组成时所有字母都小写:xxxyyyzzz
2)类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
3)变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
4)常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
3)注意:
1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用
6.变量:
1)变量的概念:
内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
2)变量的作用:
用于在内存中保存数据
3)变量注意事项:
Java中每个变量必须先声明赋值,后使用
使用变量名来访问这块区域的数据
变量的作用域:在其定义所在的一对{ }内
变量只有在其作用域内才有效
同一个作用域内,不能定义重名的变量
4)变量的使用:
java定义变量的格式:数据类型 变量名 = 变量值
例:int myAge = 12
或:int myAge
myAge = 12
5)变量的分类:
1.按数据类型分:对于每一种数据都定义了明确的具体数据类型,在内存中分配了不同大小的内存空间
基本数据类型:
数值型:
整数类型:byte/short/int/long
byte:范围:-128~127
short:范围:
int:范围:
long:范围:
注意:定义该类型变量时必须以小写的L或大写的L结尾,例如:b1 = 12345555L
注意:通常定义整型变量时使用int类型
浮点类型:float(4个字节)/double(8个字节),表示带小数点的数值
float:单精度,尾数可以精确到7为有效数字(很多情况下,精度很难满足)
注意:
1.float表示的数值范围比long要大
2.定义float类型变量时,变量要以f或F结尾
double;双精度,精度时float的两倍,通常定义浮点型变量采用此类型
字符型:char(1字符 = 2字节)
·定义char型变量时,通常使用一对''单引号,内部只能写一个字符,例:char a = '1',但是char a = '12',里边包含两个字符,不可以,编译会报错
·表示方式:
1)声明一个字符:'a'
2)转义字符:'\n'
3)直接使用Unicode值来表示字符型常量:'\u0043'
注意:a在char类型中,表示的ASCII数值是97;A表示的ASCII是65
定义char类型变量时,后边数字如果带引号,那么输出结果是数字本身,如果数字不带引号,那么输出的是数字对应的ASCII表的值
char c2 = 97 输出的结果c2的值为a,因为a的对应ASCII码是97
char类型与int类型做加法,则是用char的ASCII值与int值相加
布尔型:boolean
只能取两个值中的一个:true或者false
常在条件判断或者是在循环结构中使用
引用数据类型:
类:class
接口:interface
数组:array []
注意:string类型:
注意:string类型的变量属于引用数据类型
1.声明string类型变量时,必须要使用一对""
2.string可以和8种基本数据类型变量做运算,且运算只能是连接运算:"+", 运算的结果仍然是string类型
2.按声明的位置分类:
成员变量:
实例变量:(不以static修饰)
类变量:(以static修饰)
局部变量:
形参:方法,构造器中定义的变量
方法局部变量:在方法内定义
代码块局部变量:在代码块内定义
6)了解字符编码:
1.ASCII编码
2.Uncode编码
3.utf-8编码:
7)进制之间的转换:
注意:所有数字在计算机底层都以二进制形式存在。
二进制:以0b或0B开头
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;
当是long类型时,二进制默认占64位,第64位是符号位
二进制原码、补码、反码的关系:
八进制:以数字0开头表示。
十进制:
十六进制:以0x或0X开头表示。此处的A-F不区分大小写
8)基本数据类型之间的运算规则:
前提:这里讨论的只是7种基本数据类型变量间的运算,不包含boolean类型的
1.自动类型提升:
当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型
特别说明:byte/char/short三种类型变量之间做运算的时,结果为int类型
byte、char、short ---> int ---> long ---> float ---> double
2.强制类型转换:自动类型提升运算的逆运算
需要使用强转符:(),格式:double d1 = 1.1 ;int i1 = (int)d1 -->即把double格式的d1转换为了int格式
强制类型转换,可能导致精度损失
7.运算符:
1)算数运算符
注意:运算过程每一步骤输出都会受变量类型的影响
+:可以作为加法运算符,表示两个变量相加;也可以作为连接符使用,表示两个变量组合在一起
-:减号
*:乘号
/(除号):结果显示的最终的值
%(取余运算):结果显示的余数(被除数/除数)
结果的符号与被除数的符号相同,开发中常用来判断一个数能不能被另一个数除尽,是不是另一个数的倍数。
前++/后++:都表示的是变量自增一
前++表示先自增一,在赋值运算
后++表示先赋值运算,后自增一
自增一不会改变变量自己本身的数据类型
前--/后--:都表示的自减一
前--表示先自减一,在赋值运算
后--表示先赋值运算,后自减一
自减一不会改变变量自己本身的数据类型
练习:
练习1:
public class SignTest{
public static void main(String[] args){
int i1 = 10;
int i2 = 20;
int i = i1++;
System.out.print(“i=”+i); 10
System.out.println(“i1=”+i1); 11
i = ++i1;
System.out.print(“i=”+i); 12
System.out.println(“i1=”+i1); 12
i = i2--;
System.out.print(“i=”+i); 20
System.out.println(“i2=”+i2); 19
i = --i2;
System.out.print(“i=”+i); 18
System.out.println(“i2=”+i2); 18
}
}
练习2:随意给出一个整数153,打印显示它的个位数,十位数,百位数的值
**输入中文,注意文件编码格式**
public class test1{
public static void main(String[] args){
int i = 153 ;
int i1 = i / 100 ;
int i21 = i % 100 ;
int i2 = i21 / 10 ;
int i3 = i21 % 10 ;
System.out.println("百位数为:" + i1);
System.out.println("十位数为:" + i2);
System.out.println("个位数为:" + i3);
}
}
2)赋值运算符:
注意,赋值预算符进行运算后不会改变变量本身的数据类型
=号:赋值符号,
写法:
1:int i1 = 10;
int i2 = 10;
2: int i2,j2;
i2 = j2 =10;
3: int i3 = j3 = 10;
+=号:加等号,表示变量本身在加上一个数再赋值给该变量
s1 += 2;
-=号:减等号,表示变量本身在减去一个数再赋值给该变量
s1 -= 2;
*=号:乘等号,表示变量本身乘上一个数再赋值给该变量
s1 *= 2;
/=号:除等号,表示变量本身除一个数再赋值给该变量
s1 /= 2;
%=号:取余等号,表示变量本身对后边的数取余再赋值给该变量
s1 %= 2;
3)比较运算符:判断,运算结果都是布尔类型
==符号:相等于
例:4 == 3 输出 false
注意:区分 "==" 和 "="
!=符号: 不等于 4!=3 true
<符号:小于 4<3 false
>符号:大于 4>3 true
<=符号: 小于等于 4<=3 false
>=符号: 大于等于 4>=3 true
instanceof 检查是否是类的对象 “Hello” instanceof String true
4)逻辑运算符 :
&:逻辑与
|:逻辑或
!:逻辑非
&&:短路与
||:短路或
^:逻辑异或
注意:
1.逻辑运算符操作的都是布尔类型的变量
2.&和&&的相同点:运算结果相同;当符号左边时true时,二者都会执行符号右边的运算
3.&和&&的不同点:当符号左边是false时,符号右边不参与运算
4.|和||的相同点:运算结果相同;当符号左边是false时,二者都会执行符号右边的运算
5.|和||的不同点:当符号左边是true时,|会继续执行符号右边的运算,||符号右边不参与运算
6.开发中,推荐使用&&或者||
逻辑运算关系:
a b a&b a&&b a|b a||b !a a^b
true true true true true true false false
true false false false true true false true
false true false false true true true true
false false false false false false true false
练习题:
- 练习题1:
int x = 1;
int y=1;
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//2,2 - 练习题2:
int x = 1,y = 1;
if(x++==2 && ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);//2,1 - 练习题3:
int x = 1,y = 1;
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//7,2 - 练习题4:
int x = 1,y = 1;
if(x++==1 || ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//7,1
4)位运算符:
<< :左移位运算符,在一定范围内,每向左移一位,原数值*2
>> :右移位运算符,在一定范围内,每向右移一位,原数值÷2
>>>:无符号右移
&:与运算
|:或运算
^:异或运算
~:取反运算
注意:
1.位运算符操作的都是整型的数据
2.与/或/异或运算是对二进制进行对比来得到的结果
练习:
1.交换两个变量的值
5)三元运算符(条件表达式):
格式:
(条件表达式)?表达式1:表达式2;
解释:
条件表达式为真,则执行表达式1;为假,则执行表达式2
说明:
1.条件表达式的结果为布尔类型
2.表达式1和表达式2的类型要求是一致的
3.三元运算符是可以进行嵌套使用的
三元运算符与if-else转换:
1.凡是可以使用三元运算符的地方,都可以改写为if-else,反之不成立
2.如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符,原因:简洁/高效
2.三元运算符要求必须返回一个结果。
3.if后的代码块可有多个语句
用法:
- 1.获取两个整数的最大值:
int m = 12;
int n = 5;
int max = (m > n)? m : n;
System.out.println(max);
8.流程控制:三种基本流程
注意1:如何从键盘获取不同类型的变量:需要使用Scanner类
步骤:
- 导包:import java.util.Scanner; 该声明写在类的上方
- Scanner的实例化:Scanner scan = new Scanner(System.in);
调用scanner类的相关方法,来获取指定类型的变量:int num = scan.nextInt();
举例:
import java.util.Scanner
class scanner{public static void main(String[] args){ Scanner scan1 = new Scanner(System.in); int num = scan1.nextInt(); System.out.println(num); }
}
注意2:对于char型的获取,Scanner类没有提供相关的方法,只能获取一个字符串;获取一个字符串某个位置上的字符:
例:Scanner scan1 = new Scanner(System.in); /定义一个scan对象叫做scan1/
String a = scan1.next(); /*定义一个字符串类型的变量a*/
char b = a.charAt(0); /*定义一个char类型的变量b,b的值从a中的第一个位置取值*/
注意3:对于字符串类型(String)的数据进行比较,不能使用逻辑运算符
方法:对象.equals(真值):判断是否与真值一样
1)顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转
2)分支结构:根据条件,选择性地执行某段代码, 有if…else和switch-case两种分支语句
a)if-else结构:条件判断结构,有三种表达方式
第一种结构:
if(条件表达式){执行代码块;
}
第二种结构:二选一
if(条件表达式){执行代码块1;
}
else{执行代码块2;
}
第三种结构:多选一
if(条件表达式1){执行代码块1;
}
else if (条件表达式2){执行代码块2;
}
……
else{执行代码块n;
}
说明:
在实际程序中,else结构是可选的
针对条件表达式:
如果多个表达式之间是互斥的关系(没有交集),则判断和执行语句的顺序无所谓
如果多个表达式之间有交集,需要根据实际情况确定将哪个结构声明在上面
如果多个表达式之间是包含关系,通常情况下需要将范围小的声明在范围大的上面,否则范围小的就无法执行了
针对if-else结构:
if-else结构是可以相互嵌套的
如果if-eslse结构中的执行语句只有一行时,对应的一堆{}是可以省略的,但是,一般不建议大家省略
例题1:如何获取一个随机数10-99
需要用到的结构:Math.random(),取到数值的范围左闭右开
公式:[a,b]-->(int)(Math.random()*(b-a+1)+a)
b)switch-case结构:
switch(表达式){
case 常量1:
语句1;
// break;
case 常量2:
语句2;
// break; … …
case 常量N:
语句N;
// break;
default:
语句;
// break;
}
说明:
1.根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句,当调用完执行语句后,依然继续向下执行其他case结构中的执行语句,直到遇到break关键字或者到末尾结束。
2.break:可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
3.switch结构中的表达式,只能是如下6中类型之一:byte/short/char/int/枚举类型(jdk5.0新增)/String类型(jdk7.0新增)
4.case之后只能声明常量,不能声明范围
5.break关键字是可选的
6.default:相当于if-else结构中的else
7.如果switch-case结构中,多个case结构的执行语句相同,则可以考虑进行合并
switch-case和if-else的相互转换及选择
1.凡是可以使用switch-case的结构,都可以转换为if-else结构,反之则不成立。
2.如果分支结构的两个结构都可以使用(switch中表达式的取值情况不太多),优先使用switch-case结构,原因是该结构的执行效率稍高
例题1:编写程序:从键盘上输入2019年的“month”和“day”,要求通过程序输出输入的日期为2019年的第几天
import java.util.Scanner;
class summer{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入2019年的month:");
int month = scan.nextInt();
System.out.println("请输入2019年的day:");
int day = scan.nextInt();
int sumDays = 0;
switch(month){
case 12:
sumDays += 30;
case 11:
sumDays += 31;
case 10:
sumDays += 30;
case 9:
sumDays += 31;
case 8:
sumDays += 31;
case 7:
sumDays += 30;
case 6:
sumDays += 31;
case 5:
sumDays += 30;
case 4:
sumDays += 31;
case 3:
sumDays += 28;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println("2019年")
}
}
例题2:从键盘分别输入年、月、日,判断这一天是当年的第几天
思路:在上个例题的基础上,对第二个月天数进行判断,平年时28天,闰年是29天
System.out.println("请输入2019年的year:");
int year = scan.nextInt();
case 3:
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){
sumDays += 29;
}
else{
sumDays += 28;
}
3)循环结构
根据循环条件,重复性的执行某段代码
有while、do…while、for三种循环语句
注意:JDK1.5提供了foreach循环,方便的遍历集合、数组元素
- 循环语句的四个组成部分:
初始化条件
循环条件 ----> 布尔类型
循环体
迭代条件
a)for循环:
结构:
for(初始化条件;循环条件;迭代条件){循环体;
}
- 执行过程:
初始化条件 --- 循环条件 --- 循环体 --- 迭代条件 --- 循环条件 --- 循环体 --- 迭代条件 ... 循环条件 break关键字的使用:
一旦在循环中执行到break,就跳出循环
例1:重复输出hello world
class chongfu{ public static void main(String[] args){ for (int i = 1;i < 5;i++){ System.out.println("hello world!!") } } }
例2:遍历100以内的偶数:
for (int i = 1;i <= 100;i++){ if(i % 2 == 0){ System.out.println(i); } }
例3:遍历100以内的偶数并求和,并显示出偶数的个数:
class bianlioushu{ public static void main(String[] args){ int sum = 0; int count = 0; for (int i = 1;i <= 100;i++) { if (i % 2 == 0) { // 求和 sum += i; //显示遍历次数 count++; } } System.out.println(sum); System.out.println(count); } }
- 例4:输入两个正整数m和n,求其最大公约数和最小公倍数:
import java.util.Scanner;
class gongyueshu{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
//定义第一个正整数为m
System.out.println("请输入第一个正整数:");
int m = scan.nextInt();
//定义第二个正整数为n
System.out.println("请输入第一个正整数:");
int n = scan.nextInt();
//求最大公约数和最小公倍数
int min = (m <= n)? m : n;
for(int i = min;i >= 1;i--){
if(m % i == 0 && n % i == 0){
System.out.println("最大公约数为:" + i);
break;
}
}
int max = (m >= n)? m : n;
for (int j = max;j >= max;j++){
if (max % n == 0 && max % m == 0){
System.out.println("最小公倍数为:" + j);
break;
}
}
}
}
没有评论