java基础
一、java语言的概念
1、介绍:
(1)java是一门编程语言,用来编写程序、软件。特点:跨平台(不分操作系统,口号是:一次编译,到处运行。例如:在一个操作系统编写程序,拿到另外一个操作系统照样运行)。
(2)编程语言:所谓编程语言,是 计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功。
2、程序的开发(主要有三类)
(1)手机上的软件
例如:贪吃蛇、扫雷、手机上的游戏。
(2)桌面上的应用
桌面上的程序必须下载安装包,安装后才能点击运行。
例如:QQ、IDEA、
(3)WEB应用程序
必须通过浏览器,输入网址,进行访问。
例如:淘宝/天猫、京东、百度。
二、java的发展史()
java语言是美国sun公司,1995年推出的高级编程语言。java之父:詹姆斯*高斯林。后被oracle收购。
三、计算机基础知识
1、二进制
1、二进制
0 、1 组成(逢二进一)
2、十进制
0~9组成(逢十进一)
3、十六进制
4、计算器
(1)打开计算器或者输入(calc)
(2)选择【程序员模式】
5、数学算法
(1)十进制转二进制(除2取余法)。不断的除以2直到0。然后倒着取余数。
(2)二进制转十进制(使用的是1248编码)。将二进制中1对应的十进制值加起来求和。
2、字节
1)、它是计算机的计量单位。用来计算一个文件,或者一个程序在计算机中存储的大小。
2)、一个字节可以存8位的0/1。(一个英文字母就是一个字节)。
3)、单位的换算:
1Byte = 8 bit(位) 1个英文字母
1KB = 1024 Byte 1首歌的歌词
1MB = 1024KB 1/3 首歌
1GB = 1024 MB 半部电影
1TB = 1024 GB 500部电影
3、DOS命令行
1)、启动
(1)Win + R
(2)输入 cmd 加回车
2)、常用命令
(1)切换盘符(盘符加 : 不区分大小写)。例如 c: 打开C盘、D:打开D盘。
(2)dir 显示当前文件夹下面的内容。
(3)cd 改变当前打开的文件夹。例如:cd 文件夹名称 进入文件夹。cd .. 返回上一级文件夹 。
(4)cls 清除屏幕显示内容
(5)exit 输入退出窗口命令
四、JDK、JRE、JVM
1、JDK(全称Java Development Kit)java开发包。
2、JRE(全称Java Runtime Environment)java运行环境。
3、JVM(全称Java Virtual Machine)虚拟出来的一台计算机,用来运行Java程序
4、它们的关系
JDK包含JRE。(程序员装JDK)
JRE包含JVM。(客户端装JRE)
JVM是核心。
JVM的作用:将java程序翻译给操作系统,操作系统按照要求做事情。
五、JDK下载安装(JDK网站)
1、官网 http://www.oracle.com 英文。http://www.oracle.com/cn 中文 download下载
2、安装一直下一步就行。
3、注意事项
a.不要安装到c盘
b.路径上不能有中文
c.也不要有空格
4、安装后测试
在cmd到bin路径 输入 java - version 回车。
六、入门Demo
###1、入门代码
/*
注意事项:
1、文件名必须跟类名一样.否则编译报错。
2、代码全部使用英文输入,不能中文符号。
*/
public class HelloWorld{
public static void main(String[] args){
System.out.println(“HelloWorld”);
}
}
2、文件编译运行
1、开发流程
(1)新建一个文本文件.txt,后缀名改成.java
(2)编译 :必须在.java文件路径下操作。命令格式 javac 文件名.java
(3)运行 :必须在.class文件路径下操作。命令格式 java 文件名
2、java命令介绍
javac 编译器(用来编译java文件,编译后会产生class文件)
java 解释器(用来运行class文件,读取class文件的内容)
3、程序结构说明
public class 类名{} //1、 定义一个类,java代码都写到类中
public static void main(String[] args){} //2、定义一个main方法,程序的入口
System.out.println(“...”); //3、打印换行 可以写多个打印语句
System.out.print(“...”); //4、打印不换行 可以写多个打印语句
4、java标识符(驼峰规范)
(1)标识符:就是给类、方法、变量起名。(必须遵守java的规则,否则编译报错)
(2)规则:
可以使用英文字母、数字、中文、$ 和 _ 来定义。但是不能以数字开头。不能是关键字、但是可以包含关键字。
(3)开发规范:(1、见面知意。2、使用驼峰命名)
a、大驼峰命名(用在类上)每个单词首字母大写。
b、小驼峰命名(用在方法、变量上)第一个单词全部小写,第二个单词起首字母大写。
5、常量与变量
(1)常量概述
程序运行期间,固定不变/不可改变的量。
(2)常量的分类(有六类)
1、整数常量
2、浮点常量
3、布尔常量
4、字符常量
5、字符串常量
6、空常量
(3)变量概述:在运行期间,可变的量。
(4)变量的注意事项
1、变量使用必须先定义后使用。
2、变量等号两边的类型必须一致
3、变量的使用不能超出作用域。(作用域:在类中的{}中)
4、定义变量,变量名不能一样
5、整数加上L表示long 浮点数加上F表示float
6、可以在一个语句中定义类型相同的变量
6、数据类型
(1)java使用关键字来表示数据在程序中的类型。主要分为(1、基本类型。2、引用类型)
(2)基本类型:(四类八种)
整型
byte 1字节 -128 ~127
short 2字节
int (默认) 4字节 -21亿~21亿
long 8字节
浮点型
float 4字节
double(默认) 8字节
布尔型
boolean 1字节 取值true 和 false
字符型
char 2个字节
(3)引用类型:
字符串、数组、类、接口
7、类型的转换
(1)、自动转换(将小类型转成大类型,不需要做任何处理,自动完成)
(2)、强制转换(大类型转小类型)
格式: 小类型 变量名 = (小类型)大类型的值;(必须手动处理,否则会报错)
(3)、强制转换的注意事项
1、数据丢失(会产生高位截肢)
2、精度丢失(将浮点数转换成整型,无条件丢掉小数部分)
8、ascii码表(char 与 int 的互转)
(1)编码表概述
编码表就是,将人类的文字和一个十进制数进行对应起来,组成一张的表格。
(2)ASCII码表:它是美国标准信息交换代码表。
(3)特点:
一个字符对应一个整数,将整数进行二进制化,保存到计算机中。
(4)主要对应的字符和编号
小写 a 97 ,大写 A 65 ,字符 0 48 。
(5)总结
计算机中不存储汉字、字母,只存二进制,汉字、字母会通过码表进行转换成二进制存储到计算机中。
9、运算符
1、算数运算符
+ :(1)数值表示求和。(2)连接字符串。(当+号两边只要有一边出现字符串就会拼接成字符串)
- :减
* :乘
/ :除
%模 取余:(两个数先做除法,取相除剩下的余数,只能是两个整数才能用)
++自增1
-- 自减1
2、赋值运行符
+= , -= ,*= ,/= ,%=
3、比较运行符(会得到一个boolean值)
> 大于 < 小于 >= 大于或者等于 <= 小于或者等于 == 是否相等 != 是否不等
4、逻辑运算符(常用的逻辑运算符)
(1)&& 双与 并且 (2)|| 双或 或者 (3)! 非 取反
5、三元运算符
(1)概述和特点
Java中唯一个需要三个表达式参与运算的”运算符”。在比较两个数大小的情况,三元运算符比if-else简化
(2)规则:
a、结果必须被使用,直接打印或者赋值给一个变量
b、冒号前后两个表达式的值的类型必须一致
七、执行语句
1、执行语句概述
执行语句分三种:
1、顺序结构(从上到下执行)
2、选择结构(让代码有选择性的执行)【有 if语句 ,switch语句】
3、循环结构(执行重复的代码)【for语句、while语句、do while语句】
2、if 语句
//第一种格式
if(/*布尔表达式*/){
//true就执行语句,false就不执行
}
//第二种格式
if(/*布尔表达式*/){
//true执行语句,
}else{
//false执行默认语句体
}
//第三种格式
if(/*布尔表达式1*/){
//表达式1成立,执行语句体1
}else if (/*布尔表达式2*/){
//表达式2成立,执行语句体2
else{
//都不成立,执行默认语句体
}
3、switch语句
/*
注意事项:
表达式的结果只能是byte、short、char、int、String
执行流程:
匹配上哪一个分支 ,就执行它的语句体。
switch穿透性:
如果你省略了标准格式中的break,就会发生穿透性。直接执行分支的语句体,不作匹配,直到碰见break。
使用场景:
当多个分支需要执行相同的语句体时,使用穿透性可以简化代码。
*/
switch(/*表达式*/){
case //常量1:
//执行语句体1
break;
case //常量2
//执行语句体2
break;
case //常量3 可以有多个sase
//执行语句体3
break;
default:
//执行默认语句体
break;
}
4、for语句
/*
使用场景:
计数器有明确的范围。例如1~100
*/
for(/*①初始化语句; ②循环条件; ④步进表达式*/){
//被重复执行的代码 -③循环体
}
5、while语句
/*
特点:
循环条件为true会一直执行,值为false跳出循环。
使用场景:
计数器的范围不明确的时候使用。例如:不知道有具体的多少数量。IO读取一个文件夹没有具体的数量要求。
*/
// ①初始化语句
while(/*②循环条件*/){
//④循环体
//③步进语句
}
6、do while语句
/*
特点:
执行第一次循环体时,不用进行循环条件的判断。所以无论循环条件是否满足至少执行一遍
*/
//格式
//①初始化语句
do{
/*③循环体
④步进*/
}while(/*②循环条件*/);
7、break、continue关键字
break作用:在循序中使用。会立刻跳出当前的循环。
continue作用:立刻跳过本次循环。它只能在循环中使用。
八、方法
1、方法的作用与执行流程
1、方法的作用
将相同的代码放在一起(封装),通过调用来使用,达到重复使用代码的目的。
2、方法的执行流程
(1)、从调用处找到这个方法
(2)、传参,将调用处的实际数据传给参数列表
(3)、执行方法体计算得到结果
(4)、通过return 返回值; 将结果交给调用处
2、方法的重载(overload)
1、方法重载概述
在同一个类中,允许存在多个名字相同的方法。
2、规则(根据参数列表来进行区分)
(1) 参数类型必须不同。
(2) 参数个数必须不同。
(3) 顺序必须不同。
3、参数基本、引用类型的区别
1、基本类型
在main方法中定义两个变量,当做参数传给方法中。交换后。打印变量是main方法中变量原来的值。
2、引用类型
把引用类型当做参数传递到方法中,做修改后。引用类型会变。
3、执行原理
(1)注意:调用处调用方法传参,实际是将参数赋值一份给方法中参数(将实参复制一份给形参)。
(2)基本类型
方法中进行修改形参,不影响实参。方法在栈中执行完就会释放,但是实参还在。
(3)引用类型
引用类型是将地址赋值赋值一份传给方法中。地址是存在堆中。方法内修改形参,实参会有影响。因为调用处加载引用类型,依然是根据地址进行获取数据。
九、数组
1、数组概述与特点
1、概述
数组相当于一个容器,定义一个可以存储多个数据。
2、特点
(1)数据类型必须一致。
(2)数组一旦创建,长度是固定不变的。
(3)它是通过索引进行操作里面的存储的具体值。
2、数组的三种格式
1、使用格式(1、3种。2、等号两边的数据类型必须一致。3、长度:必须大于0 否则 编译正常,运行报错)
(1)第一种:(我们来指定长度)
数据类型[] 数组名 = new 数据类型[长度];
(2)第二种:(1、内容由我们指定。2、长度由系统计算。3、等号右边的[]不能写长度)
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...}
(3)第三种:
数据类型[] 数组名 = {元素1,元素2,元素3...}
3、常见的数组异常
1、数组越界异常: ArrayIndexOutOfBoundsException
2、数组空指针异常:NullPointerException
十、JVM内存
1、JVM内存分5块
(1)栈 Stack
(2)堆内存 Heap
(3)方法区 Method Area
(4)寄存器(CPU)
(5)本地方法区(操作系统)
2、栈的作用:保存变量、运行方法。
3、堆的作用:保存所有new出来的地址。例如:数组,对象等。
4、方法区的作用:保存java运行出来的class文件。和class文件里面的方法。
5、方法区和栈的关系:方法区保存方法。栈是运行方法。没有掉用的方法保存在方法区中,调用的时候加载到栈中。
十一、java对象
1、面向对象概述
1、介绍:
面向对象是一种思想。早期的计算机编程是基于面向过程,
2、例如:
面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾 起来 。(全部的步骤叫做面向过程)
面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来(洗衣机就是对象)
3、总结:
它可以将复杂的事情简单化,并将我们从执行者变成了指挥者。
2、java对象的三大特征【】
(1)封装:相同属性和行为,进行单独的抽取封装。
(2)继承:子类继承该类的属性和行为,使得子类对象有与父类相同的属性、行为。
(3)多态:一种事物的多种形态。
3、成员变量局部变量
1、区别(有4个方面)
(1)在类中的位置不同
a、成员变量:类中,方法外
b、局部变量:方法中或者方法声明上(形式参数)
(2)作用范围不一样
a、成员变量:类中
b、局部变量:方法中
(3)初始化值的不同
a、成员变量:有默认值
b、局部变量:没有默认值。必须先定义,赋值,最后使用
(4)在内存中的位置不同
a、成员变量:堆内存
b、局部变量:栈内存
(5)生命周期不同
a、成员变量:随着对象的创建而存在,随着对象的消失而消失
b、局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
十二、static关键字
1、介绍:
它是java的一个关键字,它可以用来修饰的成员变量和成员方法。
2、特点:
(1)被修饰过的成员变量、成员方法可以直接调用。
(2)被修饰过的成员变量在内存中只会存储一份
3、静态原理
(1)是随着类的加载而加载的,且只加载一次。
(2)存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。
(3)它优先于对象存在,所以,可以被所有对象共享。
4、静态代码块
(1)位置:类中方法外。
(2)执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。
(3)作用:给类变量进行初始化赋值。
5、注意事项
(1)static 修饰成员,直接调用
(2)静态访问静态
(3)非静态访问所有
十三、继承、抽象类
1、继承概述(extends)
1、概述:
定义一个类对多个类中存在相同属性和行为,进行单独的抽取封装。子类继承该类的属性和行为,使得子类对象有与父类相同的属性、行为。子类可以直接 访问父类中的非私有的属性和行为。
2、好处:
1. 提高代码的复用性。
2. 类与类之间产生了关系。
3、特点
只能是单继承,一个类继承一个类。
2、方法的重写(Override)
1、规则:
(1)继承关系中,子类定义一个与父类一模一样的方法。
(2)方法名必须一样。
(3)返回值类型必须一样。
(4)参数列表必须一样。
(5)子类方法权限必须>=父类。
2、不遵守规则
编译不报错,重写失败,子类增加一个方法。
3、权限
public > protected >默认 > private
4、继承内存执行
先在内存中创建父类,在创建子类。子类对象会把父类对象包含进行去。读取会先读取子类,就近原则。
5、this和super
1、介绍
(1)其实this、super是只内存空间。
(2)this:指向子类对象空间的引用。(如果成员变量与局部变量重名,使用this区分)
(3)super 指向父类对象空间的引用。
(4)成员变量:定义在类中方法外。
(5)局部变量:定义在方法中。
2、注意事项
this、super只能子类中方法中使用。
3、this()、super()
(1)this() 表示执行本类的构造方法
(2)super() 表示执行父类的构造方法
(3)如果有参数,必须传参数
(4)只能在子类构造方法的第一行使用
(5)同子类构造方法中,只能调用super()或者this()。其中的一个。
6、抽象类(abstract )
1、概述:
(1)java抽象关键字abstract。可以修饰类、方法。被修饰的类叫抽象类,修饰的方法叫抽象方法。子类继承抽象类必须重写父类的抽象方法,(开发中表示强制的意思)。
(2)抽象方法 : 没有方法体的方法。
(3)抽象类:包含抽象方法的类。
2、规则:
(1)抽象类中可以没有抽象方法。
(2)抽象方法必须在抽象类中。
3、格式:
类:public abstract class 类名{}
方法:public abstract 返回值类型 方法名(参数列表);
4、注意事项:
(1)抽象类不能直接创建。(不能直接new)。
(2)抽象类可以不写抽象方法。
(3)使用抽象类,直接使用它的子类。
十四、接口、多态
1、接口(interface )
1、概述:
接口就是对一类事物进行连接java语言一个规范。其他语言想要连接必须实现java提供的接口。
2、特点:
(1)接口关键字(interface)实现关键字(implments)
(2)面向对象的特征之一。
(3)补救抽象类的扩展性不足。
(4)提高代码的复用性和扩展性。
(5)是多态的前提。
3、接口格式:
public interface 接口名{
静态常量
抽象方法
默认方法
静态方法
私有非静态方法
私有静态方法
}
4、使用:
(1)接口不能直接使用,想要使用只能使用它的实现类。
(2)抽象方法,实现类,子类必须无条件覆盖重写(否则必须是抽象类)
(3)默认方法,覆盖重写,冲突。否则可以不覆盖重写
5、注意事项:
(1)不能成员变量
(2)不能get/set公有普通方法
(3)不能构造方法
(4)不能静态代码
2、继承、实现区别
1、优先级:
父类优先级高于接口,子类优先级高于父类。
2、区别:
继承:一个类只能有一个父类 类与类 单继承。
实现:一个接口 能继承多个接口 接口与接口可以多继承。
3、多态
1、概述:
是指同一行为,具有多个不同表现形式。例如:树有不同的种类: 杨树、松树、柏树。那么具体的树就是多态。
2、java中类的多态。
(1)必须存在继承关系。
(2)子类不能是抽象类。
(3)父类可以不是直接父类。可以是间接父类
3、java中接口的多态
(1)子类/实现类必须实现这个接口
(2)子类不能是抽象类
4、多态的好处
(1)提高代码的复用性与扩展性。
(2)定义方法变量的参数,或者返回值的时候可以使用多态。有接口写接口,有父类写父类。
5、多态运行时特点:
(1)成员变量编译看左边,运行看左边(子类和父类有相同名字的变量时候)
(2)成员方法编译看左边,运行看右边()
6、弊端:
子类对象保存成父类类型时,不能调用子类的成员。
7、多态的形态转换
(1)向上转型
父类转成子类型
子类类型 对象名 =(子类类型) 父类
(2)向下转型
子类类型转成父类
父类 对象名 = 子类对象
8、手动转型注意:
(1)格式
子类类型 对象名 =(子类类型) 父类
(2)手动转换有风险
假如这两个类型并没有任何继承关系,不符合类型转换的定义。 报ClassCastException异常
9、instanceof 关键字
(1)java提供了instanceof关键字、给引用变量做类型的校验。我们可以使用它来规避下来转型的风险,用来判断当前对象是不是这个类创建的。返回值是true或者false。
(2)格式
类 instanceof 类或者接口。返回值是boolean类型。
十五、final、权限访问符
1、final关键字
1、概述与特点
(1)final表示的最终的,最后的。
(2)可以用来修饰类、方法、成员变量、局部变量。
(3)final修饰的类,不能有子类。它不能和abstract 同时修饰类(会产生冲突)
(4)final修饰修饰的方法,不以被子类覆盖重写。
(5)final修饰变量,一旦赋值不能再赋值。
2、权限访问符
1、关系
public > protected > 默认 > private
2、使用范围(其实是指包的访问范围)
(1)public :公有的,任何地方都可以访问。
(2)protected:受保护的, 同包才可以访问。特点是强调子类访问,也就是子类在任何包下都可以访问。
(3)默认 :同包才可以访问。
(4)private :私有的,只有本类可以访问。
3、内部类
1、理解:
一个类中定义另外一个类,好处:更好的面向对象,用类描述事物。
2、格式:
public class 外部类名{
public class 成员内部类名{
}
public void method(){
}
}
3、使用:
格式一:
外部类名.内部类名 对象名 = new 外部类名() .new 内部类名();
格式二:(简化版)
外.内 对象名 = new 外().new 内();
外.this.成员变量名
4、局部内部类
1、理解:
方法中创建类。
2、格式:
public class 外部类名{
public void method(){
class 局部内部类{
//
}
}
}
3、规则:
(1)直接class,前面不能有修饰符。
(2)局部内部类,只能在这个方法中使用,其他方法不能使用。
5、匿名内部类
1、概述
匿名内部类是内部类的简化写法,它本质是一个带具体实现的。继承父类或者父接口。
2、匿名内部类的前提
匿名内部类必须继承一个父类或者实现一个父接口。
3、格式
格式一:
new 抽象类/接口(){
//重写所有的抽象方法
}.调用的方法名();
格式二:
//开发中会给new出来的对象赋值一个变量,表示起了一个名字
抽象类/接口 对象名 = new 抽象类/接口() {
//重写所有的抽象方法
};
使用里面的方法的时候,直接对象名.方法名进行调用。
6、内部类的区分
在out文件夹中带有 $ 符号的就是内部类。它是java生产的。
十六、基础类
1、Scanner类(键盘输入)
1、作用:
(1)一个可以解析基本类型和字符串的简单文本扫描器。用户输入的数据一般是通过键盘 System.in
(2)用来读取键盘输入的信息。
2、使用:
(1)在 java.util 包下
(2)创建对象
Scanner sc = new Scanner(System.in);
(3)接受键盘输入的信息(键盘输入什么类型,就用什么类型接受)
例如:int i = sc.nextInt() 接收一个键盘录入的整数
2、Random类(随机数)
1、作用:
让程序产生随机的整数
2、使用:
(1)在 java.util 包下
(2)创建对象
Random rd = new Random();
(3)生产随机数
int i = rd.nextInt()//nextInt()
(4)nextInt方法介绍
(1)它可是无参
(2)它可以接受int类型的参数。例如:参数是100 。表是生产 0~99 之间的随机数。
3、String字符串类
1、特点:
(1)不可变性
(2)共享性
(3)字符串的底层是字符数组
2、常量池:
(1)字符串时存储在“字符串常量池”中,常量池在堆中。
3、创建方式:
格式一:String 字符串对象名 = new String();
格式二:String 字符串对象名 = new String(字符串);
格式三:String 字符串对象名 = new String(字符数组);
格式四:String 字符串对象名 = new String(字节数组);
4、常用方法:
(1)判断功能
equals:比较字符串是否相同区分大小写。
equalsIgnoreCase:比较字符串是否相同不区分大小写。
(2)获取功能
length: 获取字符个数。
charAt: 获取索引对应字符。
indexOf: 获取字符对应的索引,第一次出现。
substring:截取字符串的一部分。
(3)转换功能
toCharArray:用于将字符串转成字符数组。
getBytes:用于将字符串转换成字节数组。
replace:将字符串中,参数A字符,全部替换参数B字符。
(4)切割功能
split:对当前字符串进行分割。
(5)包含方法:
startsWith():是否包含。
4、Arrays类(数组工具类)
1、作用:
该类包含用于操作数组的各种方法(如排序和搜索)
2、使用:
(1)在 java.util 包下
(2)方法全是静态的。直接:类名.静态成员方法名()就行。
3、常用方法:
toString:将数组中的数据转换成字符串。
sort:对数组里面的数据,进行从小到大排序。
5、Math类
1、作用:
它里面包含基本的数学算法。(可以用来取 绝对值、取整)
2、使用:
在java.lang包下,表示不用导包直接使用。
3、常用方法:
abs:取绝对值。负数绝对值是正数。正数绝对值是正数。例如: -3.14 绝对值 3.14
ceil:向上取整。
floor:向下取整。
round:四舍五入。