Java语言部分基础知识
Java语言的特点:
开源:开发源代码
查看Java源代码如何实现!
跨平台:
跨操作系统
软件结构划分
C/S结构:Client-Server :客户端和服务器端的交互
特点:客户端想要使用服务器端的高版本功能,必须升级!
典型的应用:QQ客户端,办公软件,其他客户端
B/S结构:Browser-Server:浏览器端和服务器端的交互
应用: 大型网站---网银新闻,游戏网站
特点:计算机中只要有一个浏览器(IE,谷歌,火狐,欧鹏...),就可以访问网站!
JDK,JRE,JVM三者的关系
JDK (Java Development Kit):是Java程序开发工具包,包含JRE和开发人员使用的工具.
JRE(Java Runtime Environment):是Java程序的运行时环境,包含JVM和运行时所需要的核心类库.
JVM(Java Virtual Machine)(Java虚拟机)的缩写,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java最具吸引力的特性之一.我们编写的Java代码,都运行在JVM上。
三者关系:JDK > JRE > JVM
path环境变量配置
配置方式一:
1)找到(jdk安装目录的bin目录):复制这个路径
D:\develop_software\Java\jdk1.8.0_162\bin
win10系统:
找到path:
新建变量:D:\develop_software\Java\jdk1.8.0_162\bin(建议:移动的前面)
win7/win8:
path: D:\develop_software\Java\jdk1.8.0_162\bin(放置path中其他系统变量最前面)
配置方式二:(推荐第二种方式)
此电脑/计算机---->右键---属性----->高级系统设置---->环境变量
在系统变量新建一个变量:
变量名:JAVA_HOME
变量值:jdk的安装目录的路径:D:\develop_software\Java\jdk1.8.0_162
path中:引入JAVA_HOME路径
最前面:
%JAVA_HOME%\bin;%System32% (path系统变量在同一行上,每一个系统变量中间需要分号隔开)
Java中的数据类型
基本数类型:四类八种
整数类型:默认int
byte 范围:-128-127 1个字节
short 2个
int 4
long 8
浮点类型:默认double
float 4
double 8
字符类型:char 2个字节
布尔类型
boolean (true/false) 占1个字节
引用数据类型:
数组,接口,类(具体类,抽象类)
关键字
关键字
被Java语言赋予特定的含义的单词!
class:类(最基本的单元)
public:权限修饰符 (公共的,公开的)
static:静态修饰符(面向对象部分讲解)
void:(Java中方法没有具体返回值:使用void代替:讲方法的时候说!)
数据类型:
基本类型.... int,boolean,double,float,long,byte,short...
运算符号:
面向对象部分:extends(继承) interface(接口) abstract(抽象)
main:不是关键字:main(): 程序的入口 (能够被Java虚拟机 jvm识别)
常量与变量
常量
在程序运行过程中,其值不发生改变!
1)字面值常量
字符串常量
字符常量
'a' ,'A','0':单独使用输出的字符本身
参与运算:找ASCII码表的值
'A':65
'a':97
'0':48
整数常量
小数常量
布尔常量
空常量
2)自定义常量(居多) :和final有关系
变量
变量的三要素
数据类型
变量名称(遵循标识符的规则)
初始化值
运算符
算术运算符
++/--
参与运算:
++/--在变量前面:先进行自增或者自减,然后参与运算
++/--在后面:先运算,在自增或者自减
逻辑运算符
常见的逻辑运算符:& | ^ !
&:表示并列关系,有false则false
&&:左边表达式为false,则右边不执行(短路效果)
|:有true则true
||:左边表达式为true,右边不执行(短路效果)
逻辑单与和逻辑双与:都表示并列关系,有false,则false!
逻辑双与&&连接的表达式:左边为false,右边就不执行了(具有短路效果)
逻辑异或^:相同则为false,不同则为true
逻辑非!:非true,false;非false,则true,偶数个非是它本身!
三元运算符
格式:
(表达式) ? 执行true的结果:执行false的结果
表达式:可以是简单的或者复杂的表达式------>true/false
执行流程:
1)先判断表达式是否成立,如果成立,执行true的结果
2)如果不成立,执行false的结果
位异或:^
一个数据被另一个数据位异或两次,其值是该数据本身!
<<: 将<<左边的数据值乘以2的移动次幂 2<<3 2*2^3
>>: 将>>左边的数据除以2的移动次幂 24 >> 2 24/2^2 = 6
标识符的规则
1)对类的命名规则:
单个单词:首字母大写,其余小写
多个单词:每个单词首字母大写,其余小写(大驼峰命名法)
class StudentDemo{}
2)对变量的命名规则:
单个单词:字母全部小写
多个单词:第一个单词全部小写,从第二个开始,每个单词首字母大写(小驼峰命名法)
int num = 10;
int applePrice = 20 ;
显示转换与隐式转换
显示转换:强制类型转换
目标数据类型(目前基本类型) 变量名 = (目标数据类型)初始化值;
隐式转换:默认类型提升
byte,short,char三者之间不转换,一旦运算,先转换为int类型进行计算!
键盘录入
操作步骤
a)导包
在class上面,package 下面
import java.util.Scanner ;
b)在main方法中创建键盘录入对象Scanner
Scanner sc = new Scanner(System.in) ;
c)提示并集接收数据
System.out.println("请输入数据:") ;
//目前使用方法:Scanner类提供了方法:nextInt()
int number = sc.nextInt() ;
d)针对number操作,要么输出/比较/求最大值....
键盘录入里面的细节
1)同时录入两个int
2)同时录入两个字符串String nextLine()
3)先录入字符串,在录入一个int
以上三个都没有问题.
4)先录入int,在录入一个String
存在问题:
先录入int类型的数据,在录入String---->字符串数据没有录入,直接漏掉了,
回车符号
每次录入数据----->敲"回车符号" 10,回车符号本身---->字符串值
import java.util.Scanner;
class ScannerTest{
public static void main(String[] args){
//1)导包
//2)创建键盘录入对象
Scanner scanner = new Scanner(System.in) ;
//3)提示并接收数据
System.out.println("请您输入第一个数据:") ;
int num1 = scanner.nextInt() ;
System.out.println("请您输入第二个数据:") ;
int num2 = scanner.nextInt() ;
//4)两个数据中的最大值
//三元运算符进行比较
int max = (num1 > num2) ? num1: num2 ;
System.out.println("两个数据的最大值是:"+max) ;
System.out.println("-----------------------------------") ;
//键盘录入:三个数据:求最大值
//提示并接收数据
System.out.println("请输入第一个数据:") ;
int a = scanner.nextInt() ;
System.out.println("请输入第二个数据:") ;
int b = scanner.nextInt() ;
System.out.println("请输入第三个数据:") ;
int c = scanner.nextInt() ;
//两种方式:
//1)中间变量
//int temp = (a>b) ? a: b ;
//int result = (temp > c)? temp : c ;
//2)直接三元运算符
int result = (a > b) ? ((a > c) ? a : c) : ((b > c)? b: c) ;
System.out.println("result:"+result) ;
System.out.println("-----------------------------------") ;
//键盘录入两个数据:比较是否相等
//提示并接收数据
System.out.println("请输入第一个数据:") ;
int firNum = scanner.nextInt() ;
System.out.println("请输入第二个数据:") ;
int secNum = scanner.nextInt() ;
boolean flag = firNum == secNum ;
System.out.println("flag:"+flag) ;
}
}
for循环的格式:
for(初始化语句;条件表达式;步长语句){
循环体语句;
}
执行流程:
1)初始化语句给变量进行赋值,只执行一次
2)判断这个条件表达式是否成立,
如果成立,就执行循环体语句,在去执行步长语句 (++,--)
3)再次判断条件表达式是否成立,如果成立,继续上面执行方式...
...
...
4)一直循环到条件表达式不成立的时候,for循环结束!
class ForTest{
public static void main(String[] args){
//1,2,3,4,5,6,7,8,9,10
//原始的做法:
System.out.println(1) ;
System.out.println(2) ;
System.out.println(3) ;
System.out.println(4) ;
System.out.println(5) ;
System.out.println(6) ;
System.out.println(7) ;
System.out.println(8) ;
System.out.println(9) ;
System.out.println(10) ;
System.out.println("-------------------------------") ;
//上面原始做法:代码冗余(重复度高)
//优化:
//for循环
for(int x = 1; x <= 10 ; x ++){
//x=1,x<= 10 ---->System.out.println(1) ----> x++ --2
//x=2, x<=10 ---->System.out.println(2)----->x++ --3
//x=3 , x <=10 ---->System.out.println(3)
//循环体
System.out.println(x) ;//1,2,.....
}
}
}
if语句格式
if语句格式2以及执行流程
开发中:if...else...
if(表达式){
语句1;
}else{
语句2;
}
表达式是否成立,如果成立,执行语句1,否则,执行语句2;
if语句格式2的嵌套:
if(表达式){
//表达式成立
if(表达式1){
语句1;
}else{
语句2;
}
}else{
//不成立
if(表达式11){
语句11;
}else{
语句22;
}
}
流程:
首先判断外层if中表达式是否成立,
如果成立,执行表达式2是否成立
如果表达式2成立,执行语句1;否则,执行语句2;
外层if中表达式不成立,就执行else中的语句
首先判断表达式11是否成立,如果成立,执行语句11,
否则执行语句22;
//导包
import java.util.Scanner ;
class IfDemo4{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示,并接收数据
System.out.println("请您录入学生的成绩: ") ;
int score = sc.nextInt() ;
if(score >100 || score < 0){
System.out.println("您录入的是一个非法数据...") ;
}else if(score >= 90 && score <=100){
System.out.println("该学生成绩十分突出...") ;
}else if(score >=80 && score< 90){
System.out.println("该学生成绩优秀...") ;
}else if(score >= 70 && score <80){
System.out.println("该学生成绩良好...") ;
}else if(score >= 60 && score <70){
System.out.println("该学生成绩及格...") ;
}else{
System.out.println("该学生成绩不及格...") ;
}
}
}
if语句格式2它和三元运算符的区别?
if语句格式2范围更大一些:推荐使用if语句格式2
if语句格式2:既可以操作具体的数据值/也可以操作输出语句
三元运算符:仅仅是作为一个运算符,一般都是操作具体的数据值!
int a = 10 ;
int b =20 ;
(a>b) ? a: b ;
如果能够使用三元运算符的就一定能够使用if...else...
但是如果能够使用if...else...,不一定能够使用三元运算符!
switch语句的格式
switch(表达式){
case 值1:
语句1;
break ;
case 值2:
语句2;
break ;
...
...
default:
语句n;
break ;
}
执行流程:
1)先判断表达式的值它和case语句值1,是否匹配
如果匹配,执行语句1,遇见break ,switch语句结束了!
2)如果值1不匹配,继续判断值2是否和表达式中的值是否匹配,如果匹配,执行语句2
遇见break,switch语句结束!
3)如果上面的所有case语句都不匹配,执行default语句,执行语句n,直接结束
switch语句使用的注意事项:
1)switch语句中的case语句后面跟的常量值,不能跟变量!
对比:javascript:switch语句 中的case可以是常量也可以变量
2)case语句中的break不能轻易省略,否则就会造成"case穿透"
如果没有写break,跟下面case值不进行比较,直接运行语句,直到遇见break结束!
3)switch中的default语句:书写位置默认是在末尾,但是它也可以在switch语句中的任何位置,但是不影响执行流程
都需要先跟case中的值进行比较,如果都没有匹配,都需要执行default...
如果default在语句的末尾,break可以省略,如果在语句中的话,不建议省略break ;
4)关于switch语句的结束问题:
1)遇见break (中断,结束的意思) ,switch语句结束
break:属于跳转控制语句中一种:两种场景:switch中/循环语句中
2)语句默认执行到末尾!
//导包
import java.util.Scanner;
class SwitchDemo{
public static void main(String[] args){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
//提示并接收数据
System.out.println("请您输入一个数据:") ;
int weekDate = sc.nextInt() ;
switch(weekDate){
case 1:
System.out.println("星期一") ;
break ;
case 2:
System.out.println("星期二") ;
break ;
case 3:
System.out.println("星期三") ;
break ;
case 4:
System.out.println("星期四") ;
break ;
case 5:
System.out.println("星期五") ;
break ;
case 6:
System.out.println("星期六") ;
break ;
case 7:
System.out.println("星期天") ;
break ;
default : //末尾
System.out.println("非法数据!!") ;
break ;
}
}
}