第一章:J2SE概述
一、Java的基本功能特点<开源、免费、跨平台、纯面向对象>
1.大部分软件都是用java语言开发。
2.java高度健壮且非常安全。(健壮:Java语言运行过程中产生的垃圾是自动回收的)
3.只编写一次代码,并在几乎每个计算机平台上运行它。
4.它是纯面向对象的应用程序开发而设计的,更符合人的思维特性。
5.java没有继承指针、运算符重载等功能,特别的java语言底层是c++实现的而不是C语言。(简单性)
6.Java是具有自动内存管理功能的多线程语言。
7.java程序只需编译一次可以在windows操作系统上运行,不做任何修改就可以在其他操作系统上运行。(可移植性、跨平台)
- 因为不同操作系统内核不同,操作系统执行指令方式也不一样,所以Java程序不能直接和操作系统挂钩,他们让Java程序运行在Java虚拟机(JVM)当中,Java虚拟机再和底层的操作系统挂钩。
二、复习常用DOS命令
1.cls:清屏
2.exit:推出当前DOS命令窗口
3.dir:列出当前目录下所有的子文件/子目录
4.cd(change directory):目录的路径(相对路径和绝对路径)
5.cd…:回到上级目录
6.cd\:直接回到根目录
7.c:回车 d:回车:切换盘符
三、关于windows操作系统的文件扩展名的设置
编写java程序,要新建以.java为结尾的文件,保证其扩展名。(打开计算机–>组织–>文件夹和搜索选项–>查看–>隐藏已知文件类型的扩展名)
四、Java的加载与执行原理
1.编译阶段
- 新建扩展名为.java的文件符合Java语法规则则生成正常的字节码文件。(xxx.class,不是纯粹的二进制,无法再操作作系统中直接运行)
- 使用JDK自带的javac.exe命令进行编译.java文件。(javac是一个java的编译工具/命令)
javac在DOS窗口使用
javac使用规则:javac java源文件的路径
注意:直接代开DOS命令窗口输入javac 源文件路径然后回车,出现以下:‘javac’不是内部或者外部命令,也不是可运行的程序或批处理文件,出现以上问题是因为:windows操作系统无法找到javac命令文件 - 解决方法
windows操作系统如何搜索硬盘上某个命令的
1.首先会从当前目录下搜索
2.当前目录搜索不到的话,会从环境变量path指定的路径当中搜索某个命令
3.如果都搜索不到则报以上错误
方法:配置环境变量path
path环境变量和java语言没有关系,path环境变量是属于windows操作系统的知识点,path环境变量是专门给windows操作系统指路的。
javac若想随意使用,需将javac所在目录配置到环境变量path当中:
path=xxxx;c:\Program Files\java\jdk8\bin
- java源文件可以编译生成多个.class文件(最终要执行的文件),.class文件生成之后删除java源文件并不会影响java程序的执行, .class文件是运行在java虚拟机上的所以.class文件也可以直接在不同操作系统上运行。
2.运行阶段(可在其他操作系统跨平台)
- java.exe命令主要负责运行阶段
java.exe在DOS窗口使用
使用规则:java 类名例如:硬盘有一个A.class,那么用法就为:java A - 运行过程:
1.打开DOS命令窗口
2.输入:java A(首先需要讲DOS窗口中的目录切换到A.class文件所在目录)
3.java.exe命令会启动java虚拟机(JVM),JVM会启动类加载器ClassLoader。
4.ClassLoader会去硬盘上搜索A.class文件,找到该文件并将字节码文件装载到JVM中。
同样注意和在DOS窗口中输入javac一样,class loader会在当前路径下加载字节码文件,这是需要配置环境变量classpath,classpath环境变量属于java语言中的环境变量,不属于windows操作系统【path环境变量属于操作系统】
新建一个属于Java的环境变量classpath
此时就可以
所以如果想要随意使用,可以在java环境变量classpath里面增加路径
5.JVM讲A.class字节码文件解释成二进制数据。
6.操作系统执行二进制和底层硬件平台进行交互。
五、注释<出现在java的源程序中,对java源代码的解释说明>
1.注释不会被编译到.class字节码文件当中。
2.可读性会增强。
3.用法
- 单行注释(//)
- 多行注释(/* …*/)
- javadoc注释(/** … */)注意:此注释会被javadoc.exe提取出来形成文件,及文件相当于使用java程序的说明书。
六、 解释java文件
1.Helloword文件
//public表示公开的
//class表示定义一个类
//HelloWorld表示一个类名
public class HelloWorld{表示定义一个公开的类,起名HelloWorld,==类体中不允许直接编写java语句【除声明变量之外】
public static void main(String[] args){//表示定义一个公开的静态的主方法,程序执行的入口,固定编写方式,args可以随意写不是固定
/*
public表示公开的
static表示静态的
void表示空
main表示方法名是main
*/
//方法体;(java语句以";"终止,分号为半角分号)
//方法体;
//方法体;
//方法体;
System.out.println("Hello World!");//向控制台输出一段消息,字符串用半角双引号""
}
}
2.public class和class的区别:
- 一个java源文件当中可以定义多个class
- 一个java源文件当中public的class不是必须的(及可以不写public class,写class)
- 一个class会定义生成生成一个xxx.class字节码文件
- 一个java源文件当中定义公开的类的话,public的class只能有一个,并且该类名称必须和java源文件名称一致
- 每一个class当中都可以编写main方法,都可以设定程序的入口,想执行哪一个x.class的main方法,就输入java x
- 注意:当在命令窗口中执行java Hello,那么要求Hello.class当中必须有主方法,若没有主方法会出现运行错误,及找不到在类Hello中找不到主方法。
第二章: java语言基础
一、标识符
1.什么是标识符?
- 在java源程序当中凡是程序员有权利自己命名的单词都是标识符
- 标识符在EditPlus编辑器中以黑色字体高亮显示
2.标识符可以表示什么元素?
- 类名
- 方法名
- 变量名
- 接口名
- 常量名
- …
3.标识符的命名规则【不按照规则编译器会报错】
- 一个合法的标识符只能由数字、字母、下划线、美元符号组成,不能含有其他符号 。合法:_123test 不合法:123test、public、hello world、class
- 不能以数字开头
- 严格区分大小写
- 关键字不能做标识符
关键字:public,void,if,for,while,do,default,byte,short,int,long,float,double,boolean,char,private,protected,swich,true,false,throw,throws,try,catch…详细关键字链接 - 理论上无长度限制
4.标识符的命名规范【只是一种规范,不属于语法,不遵守规范编译器不会报错】
- 见名知意,最好不要老是用abcABC
- 遵守驼峰命名方式,SystemService、UserService
- 类名、接口名:首字母大写,后面每个单词首字母大写
- 变量名、方法名:首字母小写,后面每个单词首字母大写
- 常量名:全都大写
二、关键字
==详细关键字链接
三、字面值
1.什么是字面值?(在C语言中称为常量)
- 10、100
- 3.14
- “abc”
- ‘a’
- true、false
- 字面值就是数据
- 字面值是java源程序的组成部分你之一,保罗标识符和关键字都是Java源程序的组成部分
- 数据在显示世界当中是分门别类的,所以数据在计算机编程语言当中也是有类别的:【数据类型】
2.数据类型
- 10、100 属于整数型字面值
- 3.14 属于浮点型字面值
- true,false 属于布尔型字面值
- “abc”、“中国” 属于字符串型字面值
- ‘a’,‘人’ 属于字符型字面值
- 注意:
1.java语言当中所有字符串类型字面值必须使用半角双引号括起来
2.java语言当中所有字符型字面值必须使用半角单引号括起来
四、变量
1.什么是变量?
- 变量本质上说是内存中的一块空间,这块空间有数据类型、名字、字面值。
- 变量包括三部分:数据类型、名称、字面值【数据】
- 变量是内存中存储数据的最基本的单元。
2.数据类型的作用
- 不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间。
- 数据类型是知道程序在运行阶段应该分配多大的内存空间。
- 所以变量中存储的具体的数据必须和变量的数据类型一直(C语言、python都是如此)
3.声明/定义变量的语法格式
数据类型 变量名;
例如:
int age;
int length;
…
4.变量声明后的赋值
- 变量名 = 字面值; (和C语言一样“=“是赋值运算)
- 声明和赋值可以在一起完成
- 可重新赋值
5.通常访问一个变量的访问方式
- 第一种:读取变量中保存的具体数据 get/获取
- 第二种:修改变量中保存的具体数据 set/设置
6.作用域
- 变量的作用域描述的是变量的有效范围,只能在有效范围内访问。
- 在同一个作用域中变量不可重名,在不同的作用域中可以重名,如打印在不同作用域中的重名变量,该打印结果遵循就近原则。
public class Hi
{
//成员变量
static int i=100;
public static void main(String[] args)
{
int k=10;
//在for循环内定义的变量,只能在for循环内使用,循环结束该变量所占用的空间释放
for(int a=0;a<20;a++)
{
...;
}
//在for循环外定义的变量,'b'是方法作用域中的变量
int b;
for(b=0;b<20;b++)
{
...;
}
//局部变量
System.out.println(k);
//无法访问,'a'是for循环作用域内的变量
System.out.println(a);
//可以访问,'b'是方法作用域内的变量
System.out.println(b);
}
public static void doSome(String[] args)
{
//报错,在此方法中'k'没有被定义
System.out.println(k);
//全局变量,可以在多个方法中被使用
System.out.println(i);
}
}
7.变量的分类
- 根据变量的位置分类
1.在方法体当中声明的变量叫做局部变量
2.在方法体外(类体之内)声明的变量叫做成员变量
public class Hi
{
//成员变量
static int i=100;
public static void main(String[] args)
{
//局部变量
int k=10;
System.out.println(k);
}
public static void doSome(String[] args)
{
...;
}
}
五.1、数据类型
1.数据类型的作用
- 程序当中有很多数据,每一个数据都有相关类型,不同的数据类型的数据占用空间大小不同。
- 数据类型的作用是知道JVM在运行程序的时候给该数据分配多大的内存空间。
2.java数据类型的分类
- 基本数据类型
- 引用数据类型
3.基本数据类型
- 基本数据类型包括四大类八小种:
第一类:整数型 byte,short,long
第二类:浮点型 double,float
第三类:布尔型 boolean
第四类:字符型 char
4.引用数据类型
- 第一类:字符串
5.八种数据类型占用空间大小(单位:字节)
- byte 1
- short 2
- int 4
- long 8
- float 4
- double 8
- boolean 1
- char 2
6.二进制
- 计算机在任何情况下都只能识别二进制。10110010…
现代的计算机底层采用交流电的方式,接通和断开两种状态,计算机只识别’1’,‘0’ - 什么是二进制
数据的表示形式 :
0 1 10 11 100 101 110 111 1000 1001…
0 1 2 3 4 5 6 7 8 9…
7.字节(byte)
- 1 byte = 8 bit 【1个字节 = 8个比特位】1个比特位表示一个二进制位:1/0
- 1 KB = 1024 Byte
- 1 MB = 1024 KB
- 1 GB = 1024 MB
- 1 TB = 1024 GB
8.JAVA数字类型
- 数字有正负之分,数字的二进制当中有一个二进制位被称为“符号位”,并且这个“符号位”在所有二进制的最左边,'0’表示正数,'1’表示负数。
- byte类型最大值:01111111 127
- byte类型最小值:-128
- byte类型可以表示256个不同的数字【256个不同的二进制】
9.ASCII码
- 一本人为制定的计算机字典,每一个字符对应一个二进制码
- 随着计算机的发展,出现新的编码方式,国际化标准组织ISO制定(支持西欧语言,向上兼容ASCII码,任然不支持中文:ISO-8859-1,又被称为Latin-1
- 随着计算机向亚洲发展,计算机开始支持中文、人文、韩文等,其中支持中文的编码方式:GB2312 < GBK < GB18030
- 支持繁体中文:五大码 < big5 >
- Unicode编码统一了全球所有文字:UTF-8(** 实际开发中一般使用 **)、UTF-9…
- Java语言源代码采用的是unicode编码方式,所以‘标识符’可以用中文
10.八种基本数据类型取值范围
- byte [-128,127]
- short [-32768,32767]
- int [-2147483648,2147483847]
- long
- float
- double
- boolean [true,false]
- char [0,65535]
- 注意:short和char所表示的种类总数是一样的(所占字节数相同),只不过char可以表示更大的正整数,因为char没有负数
11.八种基本数据类型的默认值
- 成员变量没有手动赋值系统会默认赋值,局部变量不会
- byte,short,int,long 0
- float,double 0.0
- boolean false(0)
- char \u000
五.2、数据类型详解
1.原码、反码、补码
- 1100110011 原
- 1011001100 反 除符号位,按位取反
- 1011001101 补 除符号位,按位取反再加1
- 正数的原反补是一样的
2.char类型(略)
3.转义字符
- 转义字符:反斜杠 ’ \ ’
转义字符出现在特殊字符之前,会将特殊字符转换成普通字符。 - 反斜杠在java语言当中具有转义功能
- 在java语言中System.out.println和System.out.print区别:println表示输出之后换行,print表示输出但是不换行,也可以用换行符’\n’
- 换行符:‘\n’
- 制表符:‘\t’ 相当于一个按键Tab
- 要求在控制台上输出“反斜杠字符”:
char k = ‘\’;
System.out.println(k);
解释:第一个反斜杠具有转移功能,将后面的反斜杠转义为普通的反斜杠字符。
结论:在java当中两个反斜杠代表一个普通的反斜杠字符。 - 在控制台输出一个普通的“单引号字符”:
char k = ‘’';
System.out.println(k); - 反斜杠u:‘\u’
\u后面的一串数字是某个文字的unicode编码
如何获得某个文字的unicode编码:在命令行输入native2ascii,回车,然后输入文字之后获得unicode编码(JDK中自带的native2ascii.exe命令)
4.整形字符
1.java语言当中的“整数型字面值”被默认当作int类型来处理,要让这个“整数型字面值”被当作long类型来处理的话,需要在“整数型字面值”后面添加l/L,建议使用大写L。
public class Hi
{
public static void main(String[] args)
{
long k = 2147483648;
System.out.println(k);//不能正常打印,因为右边的数会默认为int类型,而214783648已超出了int类型的取值范围
long k = 2147483648L;//在右边赋值值后面加L
System.out.println(k);//能正常打印
}
}
2.java语言当中的整数型字面值有三种表示方法
第一种方式:十进制【一种缺省默认的方式】
第二种方式:八进制【在编写八进制整数型字面值的时候需要以0开始】
第三种方式:十六进制【在编写十六进制哦整数型字面值时候需要以0x开始】
3.java中可以小容量直接转换成大容量,但是大容量转换成小容量,需要进行强制类型转换,而且强制类型转换编译通过后,运行阶段可能损失精度,谨慎使用强制类型转换。
- 强转一
public class Hi
{
public static void main(String[] args)
{
long i = 100L;
int k = i;//需要强制类型转换
int k = (int)i;
System.out.println(k);
}
}
强转原理:
原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
强制转换后的数据:00000000 00000000 00000000 0110100
将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
- 强转二
public class Hi
{
public static void main(String[] args)
{
long i = 2147483648L;
int k = (int)i;
System.out.println(k);//损失精度严重,结果为负【-2147483648】
}
}
原始数据:00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
强制转换后的数据:10000000 00000000 00000000 00000000
10000000 00000000 00000000 00000000目前存储在计算机内部,计算机储存数据都是采用补码的形式存储,将以上的补码转换到原码就是最终的结果
- 强转三
public class Hi
{
public static void main(String[] args)
{
byte k = 50;//可以
byte k = 127;//可以
byte k = 128;//不可以
byte k = byte(128);
System.out.println(k);//损失精度严重,结果为负【-128】
}
}
原始数据:00000000 00000000 00000000 10000000
强制转换后的数据:10000000