- Java基础部分
- 为什么要为JDK设置环境变量
- JDK、JRE、JVM
- Java的关键字和保留字
- Java的数据类型
- 强类型和弱类型
- 基本类型包括:
- 自动提升以及强制转换
- 自动提升
- 强制准换
- 有byte、short、char的混合运算时结果都为int类型
- 引用数据类型包括
- Java文件的执行过程
- Java的核心
- Java为什么能够跨平台
- JVM的组成
- 运算符
- 流程控制
- 数组
- 二维数组
- 算法中数组的应用
- oop--万物皆对象
- oop三大特性
- 封装
- 继承
- 对象的内存解析
- 对象数组的内存解析
- 成员变量(属性)和局部变量
- 对象数组
- Java中参数传递
- 匿名内部类
- 构造器constructor
- this关键字:指向本地的属性
- Java常用的方法解释
- compare()方法
Java是一种一次编译,到处运行的语言
Java是一种面向对象的编程语言
Java有一个很大的优势在于有自动回收垃圾的机制
在cmd中可以在任何地方调用JDK指令
JDK、JRE、JVMJDK是Java开发工具包
JRE是Java运行环境
JVM是Java虚拟机
JDK=JRE+java开发工具(javac.exe(编译)、java.exe(运行))
JRE=JVM+核心类库
Java中有很多关键字,保留字是指以后的版本可能会用到(goto和const)
在Java中变量的名字不能关键字或者保留字
Java是一种强类型语言
强类型和弱类型强类型语言:是指强制要求为变量设置类型,在编译前就把数据类型进行确定
弱类型语言:是指是在编译后确定数据类型,没有明显的类型,随着环境的不同,自动变换类型。var a=10;编译前无法确定它的类型。
一共有两种。一种是基本类型,另一种是引用类型
基本类型包括:byte、short、int、long、float、double、char、boolean
注意:
- Java中char的范围和c语言中char的范围有区别Java中char占用两个字节,范围是0–65535。
- 1byte=8bit;
- long a=12; float b=12;这两种情况不会报错,是因为自动提升的原因
基本类型中容量小的和容量大的一起运算时,会发生自动提升现象
注意:float的范围比long的还要大。是因为它们底层的存储结构不同。float/double使用科学计数法来存储,而long使用普通的二进制来存储,也就是说一个存的是多少次方,而一个是只有多少位。
是指在大容量向小容量转换时发生的,在强制转换时会有精度损失
注意:类型转换都是基本类型之间的,String不能和基本类型之间进行转换,但是包装类可以和String进行转换
有byte、short、char的混合运算时结果都为int类型 引用数据类型包括String、Array、Interface
Java文件的执行过程 Java的核心- JVM
- 垃圾回收机制:自动监测对象是否超过作用域(可达性分析和引用计数),进行回收
Java语言的运行依赖于JVM,不同的操作系统有不同的JVM
JVM的组成类加载子系统、运行数据区(内存)、执行引擎、本地接口库,本地方法库
运行时数据区包括:堆、JVM栈、程序计数器、方法区、本地方法栈
JVM栈:用来存储局部变量、对象引用
堆:存放对象实例,用来存储新创建的对象以及数组
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。有个静态域,用来存储被static修饰的静态方法属性或方法。
- 算术运算:+ - * /
- 赋值运算:
short s=2; s=s+2;//编译不通过,类型不一致 s+=2;//编译通过,运算时不会改变类型
- 比较运算
instanceof
System.out.println("hello" instanceof String);//true
- 逻辑运算
&:逻辑与 &&:短路与 |:逻辑或 ||:短路或 ^:异或。相同为0不同为1 !:非
- 位运算
<<左移,相当于*2 >>右移,相当于/2 &与运算,都1为1 |或运算,有1为1 ^异或运算 110^011=101==>5 ~取反运算 ~6=7 (补码)0110<==>(补码)1001==>0111(源码)==>7
- 三目运算符
举个栗子:
//如果a<60,将a的值置为0。 int a=a>60?a:0;
- 运算符优先级
- 顺序结构
- 分支结构 :if……else…… switch( ) case:
- 循环结构:for、where
数组是一种能存储相同数据类型,但是需要占用连续空间数据结构。需要注意的是:长度一旦确定,就不能再进行修改。
注意:数组的索引是从0开始的而数据库库的索引是1开始的,在连接数据库时需要注意。
二维数组就是两个一维数组组成的数组栈中的引用指向堆,堆中存的也是一个引用
- 数组元素的赋值(杨辉三角、回形数等)
- 求数值型数组中元素的最大值、最小值、平均数、总和等
- 数组的复制、反转、查找(线性查找、二分法查找)
- 数组元素的排序算法(稳定性)A和B相等排序后,A和B的次序不变(应用:商品首先根据销量排序,再根据价格排序,就需要排序的稳定性)
在Java中将功能结构封装在类中,通过类的实例化来调用具体功能结构
主流编程语言要么是面向过程(强调考虑怎么做),要么是面向对象(强调谁来做)。程序员从面向过程的执行者转化成了面向对象的指挥者
举个栗子:把大象装进并冰箱
类:是指对一类事物的概括。
对象:是指存在的一个真实个体
对象一般通过new来创建。类名 对象名 = new 类名();
如果创建了一个类的多个对象,对于类中定义的属性,每个对象都拥有各自的一套副本,且互不干扰
A a=new A(); A b=a;//a和b指向同一位置,修改b也在修改aoop三大特性
- 封装:将属性或方法封装起来,给外界流出访问他的接口,不展现具体细节
- 继承:一个子类继承一个父类,能够直接调用父类的非私有属性和方法,通过set、get也能访问私有属性。
- 多态:分为运行时多态(overload)和编译时多态(override),多态的三个必要条件 :1.要有继承(实现implements) 2.要有重写(overWrite&overRide) 3.父类引用指向子类对象
将方法和属性进行私有化,对实现细节进行隐藏,只暴露出供外界使用的接口
封装的体现:将属性进行私有化,然后通过set和get对属性进行设置和获取
继承Java是单根继承,一个子类只能继承一个类。但是可以实现很多个接口
说明:所有的子类都会直接或间接继承Object类
对象的内存解析 对象数组的内存解析 成员变量(属性)和局部变量形同点:
- 定义变量的格式相同
- 都是先声明后使用
- 都有相应的作用域
不同点:
- 属性定义在类下,局部变量定义在方法,构造器等内部
- 属性可以用权限修饰符,局部变量不可以用权限修饰符
- 属性加载到堆中,局部变量加载到栈中
- 属性有默认初始值,局部变量没有初始值
引用类型:无论是系统提供的还是用户自定义的,在调用时都需要进行实例化来使用
Students []stu=new Students[20]; int n=sc.nextInt(); for(int i=0;iJava中参数传递stu[i]=new Student();//存在数组里的对象进行实例化 }
Java只有值传递
- 当传递类型是基本类型时,传递的就是参数真实的值,在方法中对值进行修改,不影响本身的值
- 当传递类型时引用类型时,传递的就是地址的值,在方法中进行修改数据时,会影响本身的值
不是说只要传递的参数是引用类型的就会修改数据的值,他的大前提是传递前后两个引用指向的是同一块内存。
举个栗子:
String s="hello";
Test test=new Test();
test.change(s);
// change(String s){
// s="hi";
// }
System.out.println(s);
匿名内部类
就是没有名字的一种嵌套类,一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。
假设当前有一个接口,接口中只有一个方法
public interface Interface01 {
void show();
}
为了使用该接口的show方法,我们需要去创建一个实现类,同时书写show方法的具体实现方式
public class Interface01Impl implements Interface01{
@Override
public void show() {
System.out.println("I'm a impl class...");
}
}
如果实现类Interface01Impl全程只使用一次,那么为了这一次的使用去创建一个类,未免太过麻烦。我们需要一个方式来帮助我们摆脱这个困境。匿名内部类则可以很好的解决这个问题。
我们使用匿名内部类
public static void main(String[] args) {
Interface01 interface01 = new Interface01() {
@Override
public void show() {
System.out.println("这里使用了匿名内部类");
}
};
//调用接口方法
interface01.show();
}
构造器constructor
构造器非为默认构造器和默认构造器,系统会提供一个默认构造器。
构造器与非构造器之间是重载关系
想要调用另一个类的方法,就需要将类实例化成对象然后调用类里面的方法和属性
this关键字:指向本地的属性- 在类的构造器中,可以使用this()调用本类的其他构造器,在用this进行调用构造器时必须放在第一行
//boy类的marry方法
marry(Girl girl){
System.out.println("I Love girlA");
}
//girl类的marry方法
marry(Boy boy){
System.out.println("I Love boyA");
boy.marry(this);//谁调用marry,this就是谁。boyA回应 I Love girlA
}
Java常用的方法解释
compare()方法
- 当前对象和传入对象相同,返回0
- 当前对象大于传入对象,返回正数
- 当前对象小于传入对象,返回负数



