
计算机不管是内存还是硬盘,都是以二进制的形式存储。如同一张巨大的表格,里面都是由0和1组成。

数据在计算机底层是如何存储的?
如何快速算出一个数据的二进制形式?

数据在计算机底层存储的最小单位是什么?




…
将给定的安装包安装在电脑上,我们一起去官方网站看看(https://www.oracle.com/)


我们能看到目前java的版本已经更新到了java17,但是企业中常用的还是java8,原因是因为老的版本,更加稳定,不容易出现错误。我们可以根据实际需求自行选择安装版本。

系统会默认将jdk安装至"C:\Program Files\Java"目录下,(这里最好自己指定目录,目录中不要出现空格以及中文,避免后续产生不必要的麻烦)
接着我们需要配置环境变量,让其能够在任意窗口打开
path环境变量
我在最初学习时,也一直没弄懂环境变量是干嘛的,我们以QQ为例,再引入java的环境变量。帮助大家去直观的理解环境变量。
win+r 输入cmd 打开命令行窗口

我们此时输入qq是没有效果的
首先找到QQ程序的执行路径,通常在bin包,发现有qq程序

将这个路径复制
打开环境变量设置

用户变量只针对当前用户
系统变量针对所有用户
点击path

将qq环境变量加进去 点击确定
此时再次在命令行执行qq,你会发现

还是失败!!!
为什么呢?


接着我们引入正题,配置java环境变量
在最新版本,安装过程中会自动帮助我们配置好环境变量。
但是通常情况下,是需要我们手动添加环境变量

同样的 找到jdk的bin目录,复制路径,添加到环境变量中

图A

配置JAVA_HOME环境变量


复制这个路径

新建环境变量



将最开始图A的那个变量替换,通过%JAVA_HOME% 来固定位置

完成
java
java -version --查看jdk版本
有内容即可。


我们编写的java程序都是高级语言,计算机底层是不能够直接识别的,需要通过javac工具的编译才能驱动机器干活。


开发一个java程序,其中要经历三个步骤 编写代码,编译代码,运行代码
下面看一个简单的 Java 程序,它将输出字符串 Hello World
最初学习时,我们可以使用记事本编写代码。这样的好处是,能够更加熟悉Java的一个运行过程,以及对代码的熟练度。

新建一个文件,用记事本的方式打开


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!"); //这句话输出 Helllo world!
}
}
需要注意的是文件名要和类名完全一致,否则会报错。

编写好之后通过在文件所在目录执行 javac HelloWorld.java 进行编译,然后运行



## 变量
数据类型

1.自动类型转换机制:
2.我们为什么要进行类型转换?
3.什么是自动类型转换?

byte 的运算结果会转换为int,需要用int接收
有一个需求,某某学校招生了,有一百个学生报名,我想记录一下这一百个学生的年龄和姓名,或者计算一下学生的平均年龄,难道我们要定义一百个变量吗?
string a = "杨航"
...
算了不写了。
合理的做法一定是,在内存里找一个片空间,按顺序存起来。其实这个道理很简单,计算机中,我们有这样一种数据结构能帮助我们把想同类型的数据统一聚拢放在一起,他就是【数组】。
定义:
int[] nums;
初始化:
nums = new int[3];
赋值:
nums[0] = 1;
nums[1] = 4;
nums[2] = 3;
// 直接定义初始化并赋值
int[] nums = {1,2,3};
// 这样写也行
int nums[] = new int[5];
int nums[] = new int[]{1,2,4,5};
// 数组有一个属性,可以获得数组的长度
nums.length
类型[] 名字 = new 类型[长度];
数组在计算机中存储,主要是通过三个步骤


注意:数组变量名中存储的的是数组在内存当中的地址,数组是一种引用数据类型。
总结:

语法:数组名[索引]
System.out.println(ages[0]);
计算数组长度(存放了多少数据)
数组名.length
System.out.println(ages.length);
数组的最大索引:
数组名.length - 1
注意:如果访问数组时,使用的索引超过数组的最大索引,会越界,显示异常
什么是便历:?
所谓便历,就是说一个一个去访问属猪容器中的数据
for (int i = 0; i < ages.length; i++) { }
IDEA中的快捷便历
数组名.fori + 回车 直接生成

一个简单的小案例~

代码实现:
public class LiteralDemo {
public static void main(String[] args) {
//定义一个五个员工的销售额度数组
int[] money = {16,26,366,100};
//定义一个变量,用作最后计算总额
int total = 0;
//分别遍历累加
for (int i = 0; i < money.length; i++) {
total += money[i];
}
//输出
System.out.println(total);
}
}
先初试化int[] rar = new int[3]
后赋值
rar[0]=1


两种数组定义初始化方式各自适合什么模式?
案例1:

代码实现:
import java.util.Scanner;
public class LiteralDemo {
public static void main(String[] args) {
double[] scores = new double[6];
Scanner sc = new Scanner(System.in);
//遍历数组 输入6个评委的打分
for (int i = 0; i < scores.length; i++) {
System.out.println("请您输入当前第"+(i+1)+"个评委的分数");
scores[i] = sc.nextDouble();
}
double sum = 0;
// 遍历数组中每个元素值进行求和
for (int i = 0; i < scores.length; i++) {
sum +=scores[i];
}
System.out.println("选手最终得分" + (sum / scores.length));
}

java内存分配介绍

数组在计算机的执行原理

小思考:


注意:如果某个数组变量存储的地址是null,那么变量将不再指向任何数组对象。
多个数组变量,指向同一个数组对象的原因,注意事项
数组求最值

代码实现:
public class LiteralDemo {
public static void main(String[] args) {
int[] faceScores = {15,9000,29993,3242,4242,5242,4345,543,534,543,543};
//定义一个最大值
int max = faceScores[0];
for (int i = 0; i < faceScores.length; i++) {
if(faceScores[i] > max) max = faceScores[i];
}
System.out.println("当前妹纸中,颜值得分最高的是" + max +"分");
}
}
数组反转

public class LiteralDemo {
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
//临时变量
int temp;
for (int i = 0,j = a.length-1; i < j; i++,j--) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
}
随机排名

代码实现:
import java.util.Random;
import java.util.Scanner;
public class LiteralDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//初始化数组
int[] codes = new int[5];
//遍历录入
for (int i = 0; i < codes.length; i++) {
System.out.println("请您输入第" + (i+1) + "个工号");
int code = sc.nextInt();
codes[i] = code;
}
Random r = new Random();
//打乱顺序
for (int i = 0; i < codes.length; i++) {
//随机索引
int index = r.nextInt(codes.length);//0 1 2 3 4
//定义临时变量
int temp = codes[index];
codes[index] = codes[i];
codes[i] = temp;
}
for (int i = 0; i < codes.length; i++) {
System.out.print(i+" ");
}
}
}
debug工具的使用-断点调试

方法是一种语法结构,它可以把一段代码封装成一个功能,以便于复用。
方法定义方式
public static int sum(int a,int b){
int c = a+b;
return c;
}
调用
sum(10,20)


使用方法的好处



方法被调用的时候,是进入到栈内存中运行。
栈:先进后出,类似于手枪弹夹,先进去的后出,后进、去先出。打出去就没了。



java的传递机制都是:值传递
所谓值传递:指的是传输实参给方法的形参的时候,传递的是实参变量中存储值的副本。


总结:

案例1:

代码:

案例2

代码:

思维:层层拦截,不通过就返回false
什么是方法重载?
方法重载的的注意事项:
方法重载的应用场景:
JDBC 本质:
官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商去实现这套接口,提供数据库驱动jar包
我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
JDBC 好处:
各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
可随时替换底层数据库,访问数据库的Java代码基本不变

步骤:

/*
JDBC快速入门
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql:///db1";
String username = "root";
String password = "***";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义syl语句
String sql = "update stu set name=\"小八\" where id =2";
//4. 执行sql的对象
Statement statement = conn.createStatement();
//5.执行sql
int count = statement.executeUpdate(sql);
//6.处理结果
System.out.println(count);
// 7.释放资源
statement.close();
conn.close();
}
}
DriverManager
注册驱动
Class.forName("com.mysql.jdbc.Driver");
Diver类原码

获取连接
Connection conn = DriverManager.getConnection(url, username, password);
参数
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
示例:jdbc:mysql://127.0.0.1:3306/db1
细节:
如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对
配置 useSSL=false 参数,禁用安全连接方式,解决警告提示
Connection
1.
//执行sql的对象
Statement statement = conn.createStatement();
//5.执行sql
int count = statement.executeUpdate(sql);
2.事务管理
代码演示
public class JDBCDemo {
public static void main(String[] args) throws Exception {
//1. 注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2. 获取连接
String url = "jdbc:mysql:///db1";
String username = "root";
String password = "***";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义syl语句
String sql = "update stu set name=\"小八\" where id =2";
//4. 执行sql的对象
Statement statement = conn.createStatement();
//5.执行sql
int count = statement.executeUpdate(sql);
//6.处理结果
System.out.println(count);
// 7.释放资源
statement.close();
conn.close();
}
}
Statement
作用:执行sql语句
int executeUpdate(sql):执行DML、DDL语句
返回值:(1) DML语句影响的行数 (2) DDL语句执行后,执行成功也可能返回 0
ResultSet executeQuery(sql):执行DQL 语句
返回值: ResultSet 结果集对象
ResultSet

