java语言概述
软件开发
软件,即一系列按照特定顺序组织的计算机数据和指令的集合。有系统软件和应用软件之分。
- 人机交互方式
-
图形化界面(Graphical User Interface GUI)这种方式简单直观,使用
者易于接受,容易上手操作。 -
命令行方式(Command Line Interface CLI):需要有一个控制台,输
入特定的指令,让计算机完成一些操作。较为麻烦,需要记录住一些
命令。
- 常用的DOS命令
dir : 列出当前目录下的文件以及文件夹
md : 创建目录
rd : 删除目录
cd : 进入指定目录
cd… : 退回到上一级目录
cd: 退回到根目录
del : 删除文件
exit : 退出 dos 命令行
补充:echo javase>1.doc
常用快捷键
← →:移动光标
↑ ↓:调阅历史操作命令
Delete和Backspace:删除字符
常用的DOS命令
dir : 列出当前目录下的文件以及文件夹
md : 创建目录
rd : 删除目录
cd : 进入指定目录
cd… : 退回到上一级目录
cd: 退回到根目录
del : 删除文件
exit : 退出 dos 命令行
补充:echo javase>1.doc
常用快捷键
← →:移动光标
↑ ↓:调阅历史操作命令
Delete和Backspace:删除字符
计算机编程语言介绍
第一代语言
机器语言。指令以二进制代码形式存在。
第二代语言
汇编语言。使用助记符表示一条机器指令。
第三代语言:高级语言
java语言特点
Java语言运行机制及运行过程
- Java两种核心机制
Java虚拟机 (Java Virtal Machine)
垃圾收集机制 (Garbage Collection)
Java语言的环境搭建
JDK、JRE、JVM关系
JDK8 和 idea破解版下载地址:
链接:https://pan.baidu.com/s/14ge3GqlhFsmYYGg_458M4w?pwd=6666
提取码:6666
配置环境变量path
配置完成后验证
注释:
用于注解说明解释程序的文字就是注释。
Java中的注释类型:
单行注释
多行注释
文档注释 (java特有)
提高了代码的阅读性;调试程序的重要方法。
注释是一个程序员必须要具有的良好编程习惯。
将自己的思想通过注释先整理出来,再用代码去体现
Java源文件以“java”为扩展名。源文件的基本组成部分是类(class)
Java应用程序的执行入口是main()方法。它有固定的书写格式:
public static void main(String[] args) {…}
Java语言严格区分大小写。
Java方法由一条条语句构成,每个语句以“;”结束。
大括号都是成对出现的,缺一不可。
一个源文件中最多只能有一个public类。其它类的个数不限,如果源文件包含一个public类,则文件名必须按该类名命名。
java语言的特点是什么?
面向对象性:两个基本概念:类、对象;三大特性:封装、继承、多态
健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , Run Anywhere”
-
System.out.println()和System.out.print()什么区别呢?
以下代码的运行效果是什么?
System.out.println();打印完后,会换行。
System.out.print();打印完后,不会换行。 -
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以。但最多只有一个类名声明为public,与文件名相同。 -
GC是什么? 为什么要有GC
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 -
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。
当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
java的基本语法(上)
关键字和保留字
定义:
被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:
关键字中所有字母都为小写
Java保留字:
现有Java版本尚未使用,但以后版本可能会作为关键字使
用。自己命名标识符时要避免使用这些保留字
goto 、const
标识符
Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符
技巧:凡是自己可以起名字的地方都叫标识符
- 定义合法标识符规则:
由26个英文字母大小写,0-9 ,_或 $ 组成
数字不可以开头。
不可以使用关键字和保留字,但能包含关键字和保留字。
Java中严格区分大小写,长度无限制。
标识符不能包含空格
- Java中的名称命名规范
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始
每个单词首字母大写:xxxYyyZzz
常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用。
变量
变量的概念:
内存中的一个存储区域
该区域的数据可以在同一类型范围内不断变化
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值
变量的作用:
用于在内存中保存数据
- 使用变量注意:
Java中每个变量必须先声明,后使用
使用变量名来访问这块区域的数据
- 变量的作用域:
- 其定义所在的一对{ }内
变量只有在其作用域内才有效
同一个作用域内,不能定义重名的变量
- 声明变量
语法:<数据类型> <变量名称>
例如:int var;
变量的赋值
语法:<变量名称> = <值>
例如:var = 10;
声明和赋值变量
语法: <数据类型> <变量名> = <初始化值>
例如:int var = 10;
变量的分类
- 整数类型:byte、short、int、long
Java各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保
证java程序的可移植性。
java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’
java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long
- 浮点类型
- 字符类型
基本数据类型转换
自动类型转换:
容量小的类型自动转换为容量大的数据类型。数据类型按容
量大小排序为:
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的
那种数据类型,然后再进行计算。
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。 boolean类型不能与其它数据类型运算。
当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类
型的值将自动转化为字符串(String)类型。
- 字符串类型:String
String不是基本数据类型,属于引用数据类型
使用方式与基本数据类型一致。例如:String str = “abcd”;
一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如:
str = str + “xyz” ;
int n = 100;
str = str + n;
/*
* 如果其中有一个是变量,按照自动类型转换规则处理成一致的类型;
* 如果都是常量,如果一个是char,如果另一个是[0~65535]之间的整数按char处理;
*如果一个是char,另一个是其他,按照自动类型转换规则处理成一致的类型;
*/
char x = 'x';
int i = 10;
System.out.println(true ? x : i);
System.out.println(true ? 'x' : 10);
/*
*输出:120
x
*/
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使
用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。
通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可
以实现把字符串转换成基本类型。
如: String a = “43”; int i = Integer.parseInt(a);
boolean类型不可以转换为其它的数据类型。
- 特别说明:
String 类型可以和8种基本数据类型变量做运算,且运算只能是连接运算 “ + ”,运算结果是String类型
long类型不加 L 或者是 l ,会自动转换为int类型
float 类型 不加 F 或者是 f ,会自动转换为 double 类型
变量之进制
二进制
-
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;当是long类型时,二进制默认占64位,第64位是符号位
-
二进制的整数有如下三种形式:
原码:直接将一个数值换成二进制数。最高位是符号位
负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
负数的补码:其反码加1。 -
计算机以二进制补码的形式保存所有的整数。
正数的原码、反码、补码都相同
负数的补码是其反码+1 -
为什么要使用原码、反码、补码表示形式呢?
计算机辨别“符号位”显然会让计算机的基础电路设计变得十分复杂! 于是
人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正
数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有
减法, 这样计算机运算的设计就更简单了
二进制转换为十进制
十进制转换为二进制
进制间的转换
运算符
运算符分类
- 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符
算术运算符
- 算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是
负数则不可忽略。此外,取模运算的结果不一定总是整数。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只
保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的
结果是?
“+”除字符串相加功能外,还能把非字符串转换成字符串.例如:
System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55 ?
赋值运算符
- 符号:=
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制
类型转换原则进行处理。 - 支持连续赋值。
- 扩展赋值运算符: +=, -=, *=, /=, %=
比较运算符
逻辑运算符
-
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。
-
“&”和“&&”的区别:
单&时,左边无论真假,右边都进行运算;
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 -
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
-
异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。
理解:异或,追求的是“异”!
位运算符(了解即可)
三元运算符
例题
class Test {
public static void main(String[] args) {
boolean x = true;
boolean y = false;
short z = 42;
//if(y == true)
if ((z++ == 42) && (y = true)) {
z++;
}
if ((x = false) || (++z == 45)) {
z++;
}
System.out.println("z = " + z);
}
}
//结果为 z = 46
//随意给出一个整数,打印显示它的个位数,十位数,百位数的值。
/**
例如:
数字153的情况如下:
个位数:3
十位数:5
百位数:1
*/
public class Main {
public static void main(String[] args) {
int m = 153;
int gewei = m % 10;
int shiwei = m / 10 % 10;
int beiwei = m / 10 / 10;
System.out.println("gewei =" + gewei);
System.out.println("shiwei ="+ shiwei);
System.out.println("beiwei = "+ beiwei);
}
}
//为抵抗洪水,战士连续作战89小时,编程计算共多少天零多少小时?
public class Main {
public static void main(String[] args) {
int hour = 89;
int day = hour / 24;
//一天24个小时,取余的就是小时数
hour = hour % 24;
System.out.println("为抵抗洪水,战士连续作战" + day + "天" + hour + "小时");
}
}
public class Main {
public static void main(String[] args) {
//今天是周二,100天以后是周几?
int week = 2;
week += 100;
// 七天为一个周期
week = week % 7;
System.out.println("100天后星期" + week);
}
}
// 编写代码实现两个变量值交换,int m = 3, n =5;
答案一:
int temp = m;
m = n;
n = temp;
答案二:
m = m + n;
n = m - n;
m = m - n;
答案三:
m = m ^ n;
n = m ^ n;
m = m ^ n;
short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)
Java基本语法(下):
流程控制
- 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组
合成能完成一定功能的小逻辑模块。
流程结构的分类
顺序结构
- 程序从上到下逐行地执行,中间没有任何判断和跳转。
分支结构
- 根据条件,选择性地执行某段代码。
- 有if…else和switch-case两种分支语句。
if-else结构
- if-else使用说明
条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
语句块只有一条执行语句时,一对{}可以省略,但建议保留
if-else语句结构,根据需要可以嵌套使用
当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓
当多个条件是“包含”关系时,“小上大下 / 子上父下
示例:
public class Main {
public static void main(String[] args) {
int age = 75;
if (age < 0) {
System.out.println("不可能!");
} else if (age > 250) {
System.out.println("是个妖怪!");
} else {
System.out.println("人家芳龄 " + age + " ,马马乎乎啦!");
}
}
}
public class Main {
public static void main(String[] args) {
int x = 4;
int y = 1;
if (x > 2) {
if (y > 2)
System.out.println(x + y);
System.out.println("atguigu");
// 就近原则
} else
System.out.println("x is " + x);
}
// 输出 :atguigu
}
package com.ztx;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入第一个数字:");
int num1 = sc.nextInt();
System.out.println("请输入第二个数字:");
int num2 = sc.nextInt();
System.out.println("请输入第三个数字:");
int num3 = sc.nextInt();
if (num1>=num2){
if (num3>=num1){
System.out.println(num3+">="+num1+">="+num2);
}else if (num3>=num2){
System.out.println(num1+">="+num3+">="+num2);
}else {
System.out.println(num1+">="+num2+">="+num3);
}
}else{
if (num3>=num2){
System.out.println(num3+">="+num2+">="+num1);
}else if (num1>=num3){
System.out.println(num2+">="+num1+">="+num3);
}else {
System.out.println(num2+">="+num1+">="+num3);
}
}
}
}
/**
我家的狗5岁了,5岁的狗相当于人类多大呢?其实,狗的前两年每
一年相当于人类的10.5岁,之后每增加一年就增加四岁。那么5岁的狗
相当于人类多少年龄呢?应该是:10.5 + 10.5 + 4 + 4 + 4 = 33岁。
编写一个程序,获取用户输入的狗的年龄,通过程序显示其相当于人
类的年龄。如果用户输入负数,请显示一个提示信息。
*/
package com.ztx;
public class IfExer {
public static void main(String[] args) {
int dogAge = 5;
if (dogAge >= 0 && dogAge <= 2) {
System.out.println("相当于人的年龄:" + dogAge * 10.5);
} else if (dogAge > 2) {
System.out.println("相当于人的年龄:" + (2 * 10.5 + (dogAge - 2) * 4));
} else {
System.out.println("还没出生呢!");
}
// 输出:相当于人的年龄:33.0
}
}
switch-case结构
- 规则
switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,
char,int,枚举 (jdk 5.0),String (jdk 7.0);
case子句中的值必须是常量,不能是变量名或不确定的表达式值 ;
同一个switch语句,所有case子句中的常量值互不相同;
break语句用来在执行完一个case分支后使程序跳出switch语句块;如
果没有break,程序会顺序执行到switch结尾
default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
示例
package com.ztx;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String season = "summer";
switch (season) {
case "spring":
System.out.println("春暖花开");
break;
case "summer":
System.out.println("夏日炎炎");
break;
case "autumn":
System.out.println("秋高气爽");
break;
case "winter":
System.out.println("冬雪皑皑");
break;
default:
System.out.println("季节输入有误");
break; }
}
}
switch和if语句的对比
- if和switch语句很像,具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。也就是说,使用switch-case的,都可以改写为if-else。反之不成立。
package com.ztx;
import java.util.Scanner;
@SuppressWarnings({"all"})
public class Main {
public static void main(String[] args) {
//从键盘分别输入年、月、日,判断这一天是当年的第几天
Scanner sc = new Scanner(System.in);
System.out.println("请输入year:");
int year = sc.nextInt();
System.out.println("请输入mouth:");
int mouth = sc.nextInt();
System.out.println("请输入day:");
int day = sc.nextInt();
//定义一个变量来保存天数
int sumDays = 0;
switch (mouth) {
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://(二月) mouth是从0开始的
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
sumDays += 29;
} else {
sumDays += 28;
}
sumDays += 28;
case 2:
sumDays += 31;
case 1:
sumDays += day;
}
System.out.println(year + "年" + mouth + "月" + day + "日是当年的第" + sumDays + "天");
}
// 输出:请输入year:
//2019
//请输入mouth:
//5
//请输入day:
//5
//2019年5月5日是当年的第153天
}
循环结构
- 根据循环条件,重复性的执行某段代码。
- 有while、do…while、for三种循环语句。
- 注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
循环结构之for循环
循环结构之while循环
循环结构之do-while循环
嵌套循环结构
特殊关键字的使用:
break的使用
continue的使用
return的使用
-
return:并非专门用于结束循环的,它的功能是结束一个方法。
当一个方法执行到一个return语句时,这个方法将被结束。 -
与break和continue不同的是,return直接结束整个方法,不管
这个return处于多少层循环之内
特殊流程控制语句说明
- break只能用于switch语句和循环语句中。
- continue 只能用于循环语句中。
- 二者功能类似,但continue是终止本次循环,break是终止本层循环。
- break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同
于goto的。
package com.ztx;
// 100 以内的所有的质数输出
// 质数:素数 只能被1和它本身整除的自然数。
// 从 2 开始 ,到这个数 -1结束为止,都不能被这个数本身整除
@SuppressWarnings({"all"})
public class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true; //标识i是否被除尽,一旦除尽,修改其值
int count = 0;
//获取当前时间到 1970-01-01 00:00:00的毫秒数
long start = System.currentTimeMillis();
for (int i = 2; i <= 10000; i++) { // 遍历100以内的自然数
//优化二:对本身是质数的自然数是有效的
for (int j = 2; j <= Math.sqrt(i); j++) { //j:被i去除
if (i % j == 0) { //i被j除尽
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的
}
}
if (isFlag == true) {
// System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数个数为:" + count);
System.out.println("所用时间为:" + (end - start));
}
}
class PrimeNumberTest2 {
public static void main(String[] args) {
int count = 0;
long start = System.currentTimeMillis();
label:
for (int i = 2; i <= 10000; i++) {
//优化二:对本身是质数的自然数是有效的
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
continue label;
}
}
//执行到这步的,都是质数
count++;
}
long end = System.currentTimeMillis();
System.out.println("质数个数为:" + count);
System.out.println("所用时间为:" + (end - start));
}
}
数组
-
数组(Array),是多个相同类型数据按一定顺序排列
的集合,并使用一个名字命名,并通过编号的方式
对这些数据进行统一管理。 -
数组的常见概念
数组名
下标(或索引)
元素
数组的长度
数组的概述
-
数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括
基本数据类型和引用数据类型。 -
创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是
这块连续空间的首地址。 -
数组的长度一旦确定,就不能修改。
-
我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
-
数组的分类:
按照维度:一维数组、二维数组、三维数组、…
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
一维数组的使用:声明
一维数组的使用:初始化
一维数组的使用:数组元素的引用
一维数组的使用:数组元素的默认初始化值
一维数组的使用
多维数组的使用
-
Java 语言里提供了支持多维数组的语法。
-
如果说可以把一维数组当成几何中的线性图形,
那么二维数组就相当于是一个表格,像右图Excel
中的表格一样。 -
对于二维数组的理解,我们可以看成是一维数组
array1又作为另一个一维数组array2的元素而存
在。其实,从数组底层的运行机制来看,其实没
有多维数组
Arrays工具类的使用
p148例题
p159-p173