【Java基础系列】
【Java基础01】基础概述
【Java基础02】常用类
【Java基础03】时间类
【Java基础04】异常
【Java基础05】枚举类
【Java基础06】泛型
【Java基础07】注解
【Java基础08】反射
【Java基础09】代理
【Java基础10】IO流
基础概述
文章概述:总结和描述Java基础中的对象关系、语言特性、基本类型、流程控制、依赖环境等。
一、JDK和JRE
总结概述:JDK用于开发,是给开发人员用的,JRE 用于运行java程序,和JVM是给普通用户使用的。如果只是运行Java程序,可以只安装JRE,无序安装JDK。也就是说:使用JDK开发完成的java程序,交给JRE去运行。
JDK包含了JRE,JDK和JRE中都包含了JVM。JDK是JRE+Java的开发工具。JRE包含了JVM+Java语言的核心类库。
1.1 JDK
JDK(Java Development Kit):Java开发工具包,普通用户只需要安装 JRE来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序)。它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行环境JRE,以及常用的Java基础类库等,是整个JAVA的核心。
下图是Java8中JDK的安装目录
db文件是一个先进的全事务处理的基于Java技术的数据库(jdk自带数据库db的使用)
include文件里面是Java和jvm交互用的头文件
jre为java运行环境
lib文件存放的是JDK工具命令的实际执行程序
1.2 JRE
JRE(Java Runtime Environment):Java运行环境,运行基于Java语言编写的程序所不可缺少的运行环境,用于解释执行Java的字节码文件。
JRE中包含了Java virtual machine(JVM),runtime class libraries(运行时类库)和Java application launcher(Java应用启动器),这些是运行Java程序的必要组件。与大家熟知的JDK不同,JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。
下图是Java8中JRE的安装目录,里面有两个文件夹bin和lib。你可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和lib和起来就称为JRE。
从JDK11开始,JDK和JRE都是在一起的,安装后默认是没有JRE的。如果需要JRE这个单独目录,可以在JDK目录下面去打开命令窗口,然后执行如下命令(win10执行这个生成JRE需要目录权限):
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre
执行完之后就会生成JRE,但无论使用tomcat 还是eclipse,没有JRE文件夹实际上并不影响你的使用。
1.3 JVM
JVM(Java Virtual Machine):Java虚拟机,是JRE的一部分。它是整个java实现跨平台的最核心的部分,负责解释执行字节码文件,是可运行java字节码文件的虚拟计算机。
所有平台的上的JVM向编译器提供相同的接口,而编译器只需要面向虚拟机,生成虚拟机能识别的代码,然后由虚拟机来解释执行。
1.4 Java跨平台的原因
使用Java开发开发程序会被编译器编译成统一的与平台无关的字节码文件(.class),这些字节码文件只面向JVM。不同平台的JVM是不同的,但是他们向编译器提供了相同的接口,屏蔽了与具体操作系统相关的信息。
JVM是Java程序跨平台最核心的部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。其屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
1.5 JVM执行程序的过程
1、加载.class文件
所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。只有JVM还不能成功执行.class的类文件,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
运行class文件,可以在命令行中输入 java 字节码文件名 ,此时启动了一个jvm,加载字节码文件名.class字节码文件到内存,然后jvm运行内存中的字节码指令。在IDE上就类似于点击运行按钮。
2、分配管理内存
3、执行垃圾回收
调用垃圾收集器进行垃圾回收
二、对象的四种关系
2.1 依赖
依赖关系:表示一个类依赖于另外的类的定义,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。
举例:Person类可以进行Car和House的购买,Person的购买,引用了Car,但是Person类中并没有Car的属性,只是通过buy()方法进行实现的。
依赖关系在Java语言中体现为局域变量,方法的形参或对静态方法的调用。
2.2 关联
关联关系:某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,被关联的对象还可以再被别的对象关联,所以关联是可以共享的。
关联关系一般使用成员变量来实现。
2.3 聚合
聚合关系:是关联关系中的一种,是强关联关系。聚合是整体和个体的关系,也是通过实例的变量实现。
举例:汽车类和引擎、车窗类,表示整体和部分的关系
关联关系中两个类处于同一层次上,在聚合关系中,两个类处于不平等层次上,一个代表整体、另一个代表部分。
2.4 组合
组合关系:是比聚合关系更强的关联关系。组合是整体和个体的关系,部分属于整体,整体不存在,则部分一定不存在;部分不存在整体依然可以生存。整体对象负责部分对象的生命周期管理。
三、三大特性
3.1 封装
封装:一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作
- 封装是实现面向对象的第一步,封装就是将数据或函数等集合在一个单元中
- 类具有封装性,类能够把数据和算法(操作数据的函数)组合在一起,构成一个不可分割的整体;
- 类具有信息隐藏的能力,它能够有效地把类的内部数据(即私有和受保护成员)隐藏起来,使外部函数只能通过类的公有成员才能访问类的内部数据,并且控制访问级别。
封装意义:
- 保护类中的成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问(数据封装)
- 隐藏方法(实现)细节,只要接口不变,内容的修改不会影响到外部的调用者(方法封装)
- 用类实现封装,用封装来实现高内聚,低耦合
访问级别:
public:public设置公有成员,让本类之外的其他函数能够通过公有成员,按照类允许的方法访问类的私有数据,起到数据保护的目的。
protected:通过protected设置保护成员,在封装中没什么用,通常在继承中使用,对于继承此类的子类或者位于同一个包的类而言,它是可以访问的。
private:使用private把不想让其他程序访问的数据或者函数设置成私有成员,可禁止其他程序对这些数据随意修改。
3.2 继承
继承:继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。主要实现重用代码,提高开发效率。
- 继承是在已有类的基础上创建新类的过程,已有类称为基类(父类),新类称为派生类(子类);
- 派生类继承了基类的功能,且能够对基类的功能进行扩充、修改或重定义。
- 派生类复用了基类的全体数据和成员函数,具有从基类复制而来的数据成员和成员函数(基类私有成员可被继承,但是无法被访问)
- 派生类可以从一个或多个基类派生;有单继承,多重继承
- 继承可传递 如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
- 基类中的构造函数、析构函数、友元函数、静态数据成员、静态成员函数都不能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
构造器:基类中的构造函数、析构函数、友元函数、静态数据成员、静态成员函数都不能被继承。调用父类的构造方法使用super()。
编译器会默认给子类调用父类的构造器,此调用存在前提:父类有默认构造器。如果父类没有默认构造器,我们就要必须显示的使用super()来调用父类构造器,否则编译器会报错:无法找到符合父类形式的构造器。
注意:
1、父类变,子类就必须变。
2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
3、继承是强耦合关系。
3.3 多态
多态:指不同对象接收到同一消息时会产生不同的行为(一个接口,多种方法)
多态的三个条件:
- 继承的存在(继承是多态的基础,没有继承就没有多态)
- 子类重写父类的方法(多态下调用子类重写的方法)
- 父类引用变量指向子类对象
实现多态方式:
- 接口多态性
- 继承多态性(普通类、抽象类)
多态意义:
- 可替换性:多态对已存在的代码具有可替换性
- 可扩充性:多态对代码具有可扩充性。新增子类不会影响已存在类的各种性质。
- 灵活性:多态在程序中体现了灵活多样的操作,提高了使用效率(重载函数,重写函数)
- 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要
四、八种基本类型
八种基本类型为:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、boolean、char
精度:-2^(n-1) — 2^(n-1) - 1
对应的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character
五、流程控制
5.1 if esle
int a = 1;
if(a == 1) {
System.out.println(1);
} else if (a == 2) {
System.out.println(2);
} else {
System.out.println("no");
}
5.2 switch
选择判断,每个判断需要使用break进行跳出,否则会继续向下内部执行,可以设置default进行默认匹配操作。
int a = 1;
switch (a) {
case 1 :
System.out.println(1);
break;
case 2 :
System.out.println(2);
break;
default:
System.out.println(-1);
break;
}
5.3 while
while(条件),条件成立则进入循环,条件为true一直循环,条件为false或遇到break则跳出
Integer a = 10;
Boolean flag = Boolean.TRUE;
while (flag) {
if (a<0) {
flag = Boolean.FALSE;
//break;
}
System.out.println(a);
a--;
}
5.4 do while
do while,与while相似但是会首先进入执行体,后在进行判断。
Boolean flag = Boolean.FALSE;
do {
System.out.println(1);
} while (flag);
5.5 for
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
``
5.4 do while
do while,与while相似但是会首先进入执行体,后在进行判断。
Boolean flag = Boolean.FALSE;
do {
System.out.println(1);
} while (flag);
5.5 for
for (int i = 0; i < 5; i++) {
System.out.println(i);
}