变量按照数据类型的分类:
1、基本数据类型:byte \ short \ int \ long \float \ double \ boolean
2、引用数据类型:类、数组、接口、枚举、注解、记录14
数组分类:基本数据类型数组;引用数据类型的数组;
按照数组的维数来分的话:一维数组;二维数组;
数组的特点:
数组中的元素在内存中是依次紧密排列的,有序的。
数组,属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型;
数组,一旦初始化完成,其长度就确定了,长度不可更改;
创建数组对象会在内存中开辟一整块的”连续空间“。占据的空间的大小,取决于数组的长度和数组中原色的类型。
1、一维数组的使用:
数组的声明和初始化
//变量类型的赋值格式;
数组的声明;
double[] prices;
sritng[] foods;
//foods = new string[4] 第二种的话必须写上数组的长度;
数组的初始化
静态初始化 数组变量的赋值与数组元素的赋值同时进行
动态初始化 数组变量的赋值与数组元素的赋值操作是分开进行的;
prices = new double[]{10,20,30,40,55};
调用数组的指定元素
通过角标的数字,获取数组的元素;
角标的范围从0开始,到数组的长度-1;
数组的长度,用来描述数组容器的大小
length
数组的属性
数组的遍历 for循环
数组元素的默初始值
一维数组的内存解析(难)
前提:在mian方法中声明变量,int[] arr = new int[]{1,2,3};
虚拟机线:main()作为一个栈,压人栈空间中,在mian()栈帧中存储arr变量。arr记录着数组实体的首地址。
堆,数组实体储存在堆空间中
二维数组的维数跟类型必须都得一样
二维数组:
一维数组的元素又是一维数组;构成了二维数组;
使用:
数组的生声明跟初始化;
调用数组的指定元素
数组的属性,length,表示数组长度
数组的遍历
数组元素的默认初始值;
二维数组的内存解析(难)
【数组的常见算法1】
1、数值形数组特征值的统计;
这里的特征值涉及到:平均值,最大值,最小值,总和等;
2、数组元素的赋值,(实际开发中,遇到的场景比较带哦)例如:杨辉三角,要用数组这样的载体来使用
3、数组的复制,赋值
4、数组的反转
5、数组的扩容,缩容
6、数组的查找
线性查找、二分法查找;
数组的排序:
冒泡排序:最简单的
快速排序是:常用的 不是很会
数组为什么从0开始,编号,而不是1
数组的索引,表示数组元素距离首地址的片力量,因为第一个元素的地址鱼首地址相同,所以偏移量就是0。所以从0开始。
【数组的常见算法2】
1、数组的扩容与缩容
2、数组元素的查找
顺序查找:
优点 算法简单
缺点 效率较低,时间复杂度高
二分法查找
优点 算法相较于顺序来说比较复杂
缺点 算法相比来说比较难。
3、数组的排序
排序算法的衡量标准;
排序的分类
冒泡排序:
完整的冒泡:
冒泡现在完全学会啦!
好多算法都是根遍历有关系的
Java面向对象
一定要多写代码
学习面向对象的三条主线:
Java类及类成员:(重点)属性,方法,构造器;(熟悉)代码块,内部类;
面向对象的特征:封装、继承、多态、(抽象)
其他关键字的使用:this,super ,package,impor,static,final,interface,abstact等。
类:比较抽象的个体
对象:具体的一个一个的人。
面向对象的两个核心的概念 类 (class),对象(object)。
对这两个概念的理解:
类:具有相同特征的事物的抽象描述,是’抽象‘,概念上的定义。
对象,实际存在的该类事物的’每个个体‘,是’具体的‘,因而称之为’实例‘。
类与对象的声明。
类的内部成员。
成员之一、属性,成员变量,field(字段,域)
成员之二:(成员)方法,函数、method
类中的属性称之为:成员变量,
行为:函数成员方法。
变量的分类:
角度1、按照数据类型来分,基本数据类型(8种)、引用数据类型,(数组、类、接口、枚举、注解、记录)
角度二:按照变量在类中声明位置的不同,成员变量 、局部变量,(方法内,方法形参、构造器内 ,
成员变量跟局部变量的区别:(重要)
都有那些权限是修饰符:public 、 private(私有的) 、缺省。
属性的几个称谓:成员变量、属性、field(字段,域)
面向对象完成具体功能的操作的三步流程。(非常重要)
步骤1、创建类,并设计类的内部成员(属性,方法)
步骤2、创建类的对象,比如:phone p1 = new phone();
步骤3、通过对象,调用其内部的声明的属性或方法】
栈:方法中定义的变量。
堆:new出来的结构,数组的实体,对象的实体,包括对象的属性。
方法区:f
方法的重载(oberload)
1、定义,在同一个类中,允许在一个以上的同名方法,只要他们的参数不同即可,满足这样特征的多个方法,批次之间构成的方法重载。
2、总结为:“两同一不同”
两同:同一个类、相同过的方法名
一不同:参数列表不听,参数个数不同给,参数类型不同。
3、Arrysl类中的sort(xxx【】 )、binary S arch(xxx【】 arr,xxx)、equals(xxx【】,yyy【】)
4、如何判断连个方法是相同的的呐?(换句话说,编辑器是如何确定调用某个剧吐的方法呐?)
如何判断两个方法是相同的呐?方法名相同,且形参列表也相同。(形参列表相同指的是参数个数和类型都相同,
在一个类中允许性存在多个相同名字的方法,只要他们的形参列表不同即可。
编译器是如何确定调用某个具体的方法呐?
先通过确定方法名字确定了一波方法的重载,再通过参数,确定调用的是哪个方法。
注意:方法的重载与形参名、权限修饰符,返回值类型都没有关系。
两个方法允许同时存在
可变个数形参的方法(jdk5)
1、使用场景
在调用方法的时候可能出现方法形参的类型是确定的,但是参数的个数不确定,此时我么可以使用可变个数形参的方法。
2、格式 (参数类型 ...... 参数名)
3、说明
优先考虑确定的,在考虑兼容;
1)可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为 0 个,1个或多个。
2)可变个数形参的方法是同一种,同名的多个方法之间可以构成重载。
3)特例:可变个数形参的方法与同一个类中方法名相同,且与可变形参的类型相同的数组参数,不构成重载。
4)可变个数的形参必须声明在列表的最后。
5)可变个数的形参最多在一个形参列表中出现一次。
方法三:方法的值传递机制 值传递变量
基本数据变量没有地址值的说法,应用数据类型存储的额就是地址值,所以传的是地址值。
1、方法内声明的变量,
1)如果是基本数据类型的变量,则将此变量把保存的数值传递出去。
2)如果是引用类型的数据变量,则是将此变量的地址值传递出去。。
2、规则:实参给形参赋值的过程;
>如果是基本数据类型的变量,则将实参保存的数值赋值给形参;
>如过形参是应用数据类型的变量,则将实参保存的地址值传递给形参;
3、Java中的参数传递机制是什么? (值传递)
第一种方法是错误的:
递归方法:方法自己调用自己的现象称为递归;
递归方法的分类:直接递归,间接递归;
使用说明:
>递归方法包含了一种’隐式递归‘
>递归方法会’重复执行‘某段代码’,但这种重复执行无需循环控制;
>递归一定要向‘已知方向’递归,否则这种递归就变成 了无穷递归,停不下来,类似于‘死循环’,最终发生‘栈内存溢出’。
注意:
1、递归调用会占用大量的系统堆栈,内存耗用多,在递归调用层次多时要比循环慢的多,所以在使用递归时,要慎重;
2、再要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。考虑使用循环迭代。
使用递归调用求阶乘;
public int method2(int n) { if (n == 1) { return 1; } else { return n * method2(n - 1); } }
package关键字的使用
1、说明:包
>package用于指明文件中的类,接口等结构所在的包
-一个源文件之能有一个声明包的 package语句;(放在整个源文件之前)
- package 语句作为源文件的第一条语句出现,若出现缺省语句就视为无名包;
- 包名:属于标识符,满足标识符的命名规则,规范(全部小写),见名知i意;
- 取名的时候不要用 java xx 包
- 包对应于文件系统高中的目录,”.“来指明目录的层次,每.一次就说明有一个目录
-不能定义同名的类;不同的包下可以定义同名的类;
包的作用:
-包可以包含类的子包,,划分’项目层次‘,便于管理
-帮助’管理大型软件‘系统,将功能相近的类共划分到同一个包中,mvc设计模式;
-解决’类名‘冲突的问题
-控制访问权限;
3、JDK中主要的包
-java.lang ------string 、 math、integer 、system thread;
-java.net ---------包含执行于网络相关的类和接口;
-java.in-----------包含能提供多种输入/输出功能的类;
-java.util --------- 包含一些实用的工具类,例如,定义系统性,接口的集合;使用日期相关的而函数;
-java.text ------包含了一些Java的格式化相关的类;’
-java.sql--------包含了Java进行JDBC数据库编程的入口
-java.awt -------包含了构成抽象窗口工具(abstract windows toolkits)的多个类;
4、import关键字的使用
import:导入
import:语句 引入类,说明在哪里去照这个类;的使用;
import 包名 类名;
使用全类名的方式;
(了解)import static 组合使用,调用指定类或接口下的静态的属性或方法;
public int method2(int n) {
if (n == 1) {
return 1; } else {
return n * method2(n - 1); } }
3w
why 为什么要用
what 到底是什么
how到底怎么用
面向对象的------封装性
1、为什么需要封装性:
高内聚:类的内部数据操作细节自己完成,不允许外部干涉;
低耦合:尽保禄少量的方法给外部使用,尽量方便外部调用;
通俗来说就是,把该隐藏的隐藏起来,该暴露的暴露出来;
2、如何实现封装?
Java规定了4种权限修饰,分别是:private 、 缺省 、 protected 、 public
2.2作用
我们可以用4种修饰符类及类的内部成员,当这些成员调用时,体现可见性的大小;
4、四种修饰符的具体使用
>类:只能使用public、缺省等修饰
>类的内部成员:可以使用4种权限修饰符进行修饰;
开发中4种权限使用频率的情况;
比较高:public 、private
比较低:缺省、protected
封装i性的体现;
>场景一:私有化类的属性,体统公共的get喝set方法,对此属性进行获取或修改。
>场景二:将类中不需要对外暴露的方法,者只为private
>场景三:单例模式种构造器private的了,避免在类的外部创建实例。(放到static关键字之后)
构造器 constructor 构造方法
1、constructor 建设者,建造者
construct :v 建设建造创造
constructor: n建设、建造
2、构造器的作用
作用一:搭配new 关键字,创建类的对象;
作用二:在创建对象的同时可以给对象的相关属性赋值;(直接在造对象的时候直接赋值)
3、构造器的使用说明;
>构造器声明的格式,权限修饰符 类名(形参列表){}
>创建类之后,在么有显示提供任何构造器的同时,系统默认给提供的是空参构造器;且构造器的权限与类声明的权限相同‘
>一旦类中显示声明了构造器,系统不在提供莫仍的空参构造器
>一个类中可以声明多个构造器,构造器可以进行重载,
类中的属性(当前仅仅考试实例变量)赋值的过程;
1、在类的属性中,有哪些位置给属性赋值;
①默认赋值 、
②显示赋值、
③构造器赋值、
④通过’对象.方法’赋值;
⑥通过’对象.属性’赋值“
3、以上操作在对象创建过程中可以执行几次
面向对象的进阶课程;
this关键字:
thisi是什么
-在方法中(准确的说是实例方法或static方法)内部使用;表示调用该方法的对象;
- 在构造方法内部使用,表示该构造器正在初始化对象;
1、目前出现的问题 、解决方案
我们在声明一个属性对应的setXX方法时,通过形参给对应的属性赋值,如果形参名和属性名同名,那么如何区分变量那?
解决方案:使用this,具体来讲,使用this修饰变量,表示的是属性,没有this修饰的,表示的是形参;
2、this 可以调用的结构,成员变量;方法、构造器 、
3、this的理解:当前对象(在方法中调用时)当前正在创建的对象;
4、this 调用属性的和方法;
针对内部的使用情况,(准确说是非static修饰的方法)
一般情况通过对象a调用方法,可以在方法内调用当前对象啊的属性,或其他方法,此时,我们可以在属性和其他方法前使用”this“,表示当前属性或方法所属的对象,但是一般情况下,我们都选择省略此”this“结构;
特殊情况下,如果方法的新参与对象的属性同名了,我们必须使用,”this“进行区分,使用”this“修饰的变量即为属性,(或者成员变量),没有使用this,修饰变量,即为局部变量。
针对于构造器内部的情况;
- 我们可以使用this(空参形式)格式,调用给你当前类中指定的构造器
-我们可以在类的构造器中, 调用给你当前类中指定的构造器-
- 要求this(空参形式)必须声明在构造器的首行
-结论:this(空参形式)在构造器中最多声明一个:
-如果一个类中声明了n个构造器,则最多有 个n-1个构造器可以使用this(空参形式)的结构
这个是一般情况下的使用方法跟栈的问题;
面向对象的第二大特征:继承性(方法的重写)
1、继承性的理解:
-生活上:财产的继承,颜值的继承
-代码层面:
>自上而下,定义了以恶类A,在另一个类时,发现类的功能与A的功能相似时,考滤继承类A
>自下而上:定义类B,C,D,返现,有类似的属跟方法,则可以考虑将相同的属性跟方法进行抽取;
封装到A类当中,让其他类进行继承了,剩余B,C,D中的类就可以删除了
2、继承性的好处
- 继承的出现减少了代码的冗余,提高了代码的复用性i;
-继承的出现,有利于功能的扩展;
- 继承的出现让类与类之间产生了is - a的这种关系,为多态的使用提供了前提;
- 继承描述事物之间的所属关系,这种关系是 is - a 父类通用更一般,子类更具体;
3、继承的格式;
class A {
//属性方法
}
class extend A{
}
类A:父类,super class,超类 ,基类
类B:子类,subclass ,派生类
4、有继承性以后
-子类就获取到了父类中的声明跟方法
-但是由于封装性的印象,子类可不能直接调用父类中的属性跟方法;(get方法)
-子类在继承父类之后,还可以扩展自己的特有功能(体现,增加特有的属性,方法)
extend :延展,扩展,延伸
子类跟父类的理解,区别于集合跟子集的概念
-不要为了继承而继承,在继承之前 就判断一下is - a的这种关系。
5、默认的父类;
Java中声明的类,如果没有显示的声明其父类的手,则默认为Java.lang.boject
6、补充声明:
-Java支持多重继承
直接父类,间接父类
-Java中的子父类的概念是相对的
-Java中一个父类可以声明多个子类,反之,一个子类只能有一个父类;(Java的继承性)
异常捕获
两种方式:try-catch-finaly 、 throws方式
mysql 关系型数据库
关系型数据库:最古老的数据库是(二维表格的形式)。表与表之间的关系模型
优势:便于复杂数据查询
事物支持
非关系型数据库:性能特别高,舍去了一些功能;
键值型数据库:keyvalue 内存缓存,Redis典型的缓存型数据库
搜索引擎数据库:soir、elasticesacrh、spark
列式数据库:
DBMS数据库管理系统:
E-R模型:实体集、属性、联系集;
MySQL的基础的操作命令:
显示所有数据库:show databases
显示创建的数据库: show create database 数据库名称:
创建一个数据库: create database 数据库名称:
创建数据库前先判断是否存在: create database if not exists 数据库名称创建数据库并设置字符编码格式: create database 数据库名 character set gbk;修改数据库的字符集: alter database 数据库名称 character set 字符集名称(utf8);
删除一个数据库: drop database 数据库名;(drop database if exists 数据库名称先判断是否存在数据库)
切换数据库: use 数据库名称,
查询现在正在使用的数据库: select database();
字符集的配置文件在my.ini 文件夹当中;
查看当前的字符集
show variables like 'character_%';
查看
show variables like 'collation_%';