文章目录
Java基础篇
1、java的基本认识
JDK:jre +开发工具(javac、java)=JVM+核心类库+开发工具。
API(应用程序编程接口),就是java写好的功能代码程序,可供直接调用。
一个java文件的编译执行过程:
.java – 编译 -->.class – 执行 -->JVM(java 虚拟机)
java的跨平台、工作原理:一次编译,处处可用。
实质上,是有多个对应系统版本的jvm虚拟机,致使可在不同系统上运行。
面向过程(如C语言):
它注重过程,当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。
面向对象(如C++,JAVA等语言):
它注重对象,当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
面向对象更注重于代码的可重用性、灵活性、扩展性。
用生活中洗衣机洗衣服的例子:
面向过程:
- 执行丢衣服方法
- 执行加洗衣粉方法
- 执行加水方法
- 执行清洗方法
面向对象: 抽出“人”对象,“洗衣机”对象
- 人丢衣服
- 人加洗衣粉
- 洗衣机加水
- 洗衣机清洗
对于可重用性,当面对相似问题时,面向过程语言是将所有方法复制粘贴根据具体情况增删改;面向对象语言可以通过调用对象实现。
2、基本知识
基本数据类型 | 关键字 | 字节数 | 包装类 |
---|---|---|---|
整数 | byte | 1 | Byte |
整数 | short | 2 | Short |
整数 | int | 4 | Integer |
整数 | long | 8 | Long |
浮点数 | float | 4 | Float |
浮点数 | double | 8 | Double |
字符 | char | 2 | Character |
布尔 | boolean | 1 | Boolean |
以上都是基本数据类型,变量名对应的内存空间存储的是数值。java为了实现一切皆对象,为8种基本数据类型提供了对应的引用类型。
String:字符串 引用数据类型,变量名存储的是内存地址,可理解为一个指针指向一个内存空间。
自动类型转换: 可以把数值范围小的数据赋值给数值范围大的数据;
强制类型转换: 把数值范围大的数据赋值给数值范围小的数据,可能造成数据丢失(有些情况不能强制转换)
成员变量和局部变量的区别
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中,方法外 | 常见于方法中 |
初始化值不同 | 有默认初始化值 | 没有,使用之前需要完成赋值 |
内存位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的创建而存在、消失而消失 | 随着方法的调用而存在,运行结束而消失 |
作用域 | 在所归属的大括号 |
常量是使用了public final static修饰的成员变量,必须有初始化值,且执行过程中值不能被改变。
权限修饰符: 是用来控制一个成员能够被访问的范围
修饰符 | 同一个类中 | 同一个包中的其他类 | 不同包下的子类 | 不同包下的无关类 |
---|---|---|---|---|
private | ✔ | |||
default | ✔ | ✔ | ||
protected | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
final关键字
final是最终的意思,可以修饰方法、变量、类
修饰方法:表明该方法是最终方法,不能被重写;
修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)
修饰类:表明该类是最终类,不能被继承。
enum枚举是java中的一种特殊类型;
枚举类的特征:
- 枚举类都是继承了枚举类型;
- 枚举都是最终类,不可以被继承;
- 构造器都是私有的,对外不能创建对象
定义枚举类的格式:
修饰符 enum 枚举名称{
第一行都是罗列枚举类实例的名称
}
eg:
enum Season{
SPRING,SUMMER,AUTUMN,WINTER;
}
Lambda表达式作用是简化匿名内部类的写法;
简化格式:
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
注:-> 是语法形式,无实际含义
注意: Lambda表达式只能简化函数式接口的匿名内部类的写法形式。
3、随机数Random类
用于在程序中获取随机数的技术。
nextInt(int bound)生成随机数,功能是生成0-(bound-1)的随机数;若bound为10,返回0-9的随机整数。
若要1-10的随机,可以通过加减法来实现,即nextInt(10)+1;
代码例子:随机排序数组
/*具体分析:依次遍历数组中的每个元素,随机一个索引数据,让当前遍历的元素与该索引位置处的元素进行交换*/
int codes = {1,2,3};
Random rand = new Random();
for(int i = 0; i < codes.length; i++){
//当前遍历值为codes[i]
int j = rand.nextInt(code.length);//随机索引位置
swap(codes[i],code[j])//交换
}
4、数组排序
4.1 冒泡排序
对升序:从头开始两两比较,把较大的元素与较小的元素进行交换;每轮把当前最大的一个元素存入到数组当前的末尾。
共进行数组的长度-1轮比较,每轮比较次数为数组的长度-当前轮数。
for(int i = 1; i < 数组.长度; i++){
for(int j = 0; j < 数组.长度-i; j++){
if(交换不符合情况)
元素j与元素j+1交换;
}
}
4.2 选择排序
思想:每次选择当前位置,开始找出后面的较小值与该位置交换。
for(int i = 0 ;i < 数组.长度-1; i++){
for(int j = i+1; j < 数组.长度; j++){
if(arr[i] > arr[j])
swap(arr[i],arr[j]);
}
}
5、java内存分配
这里先讨论堆内存、栈内存、方法区,实际上还含有
栈内存: 方法运行时所进入的内存,变量也是在这里;
堆内存: new出来的东西会在这块内存中开辟空间并产生地址;
方法区: 字节码文件(.class文件)加载时进入的内存。
同一个数组变量同时指向同一个数组对象时,即是指向同一片堆内存地址空间。
5.1 方法的内存图解
- 方法没有被调用的时候,在方法区中的字节码文件中存放;
- 方法被调用的时候,需要进入到栈内存中运行。
java的参数传递机制:值传递
在传输实参给方法的形参,并不是传输实参变量本身,而是传输实参变量中存储的值。值传递时,方法的形参的改变不会影响实参变量的值。
引用传递
传输的引用类型变量存储的地址值,因而与值传递不同,若在方法中对应的内存空间如数组元素发生变化,实参也会受到影响。
5.2 对象的内存图解
5.3 静态变量/方法的内存图解
静态变量:在加载class文件时,会将静态成员变量加载至堆内存,而后再进行main方法的执行(在栈内存开辟栈空间)
静态方法:加载class文件时,将静态成员方法加载至方法区,而后再进行main方法的执行(在栈内存开辟栈空间)
垃圾回收
当堆内存中的类对象或数组对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。java存在自动垃圾回收器,会定期进行清理。