一、JAVA基础
1.1 面向过程与面向对象
面向过程POP: 面向过程就是分析出解决问题所需要的步骤,然后用函数将这些步骤一一实现,使用的时候在一个个调用这些函数即可。
举个例子:将大象装进冰箱。
面向过程就是按我们分析好的步骤进行解决。
优点:较为简单,适用于硬件联系紧密的东西
缺点:没有面向对象易维护、易复用、易扩展
面向对象OOP 面向对象就是将事物分成一个个对象,然后有对象之间进行分工与合作。
举个例子:还是将大象装进冰箱。
首先我们得有对象,找出对象,并写出这些对象的功能
1、把大象作为对象,功能是进入。
2、把冰箱作为对象。功能是开门和关门
3、使用大象和冰箱的功能,完成将大象装进冰箱。
优点:易维护、易扩展,由于面向对象有封装性、继承、多态性的特征。可以设计低耦合的系统,使系统更加灵活,更加易于维护
1.2 JVM、JDK、JRE
JVM: 也就是我们经常说的java虚拟机。JVM是运行java字节码的虚拟机,它的目的是使用相同的字节码文件,在不同的系统中,都会产生相同的结果。正是因为java虚拟机的存在,使得java程序可以在不同系统上运行,即”一次编译,随处可以运行“。
JDK: 是Java Development Kit缩写,它是功能齐全的Java SDK。他拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。
JRE: 是java运行时环境。它是运行已编译java程序所需的所有内容的集合,包括java虚拟机(JVM),Java类库,java命令和其他的一些基础构建。但是,他不能用于创建新程序。
1.3 JAVA中的数据类型
Java中有8种基本数据类型
这8种基本类型都有对应的包装类分别是:Byte、Short、Integer、Long、Float、Double、Character、Boolean
基本类型和包装类型的区别:
- 保证类型不赋值就是null,而基本数据类型有默认值且不为null。
- 包装类型可用于泛型,而基本类型不可以
- 基本数据类型的局部变量存放在java虚拟机栈中,基本数据类型的成员变量(未被static修饰)存放在Java虚拟机的堆中。包装类型属于对象类型,几乎都存在与堆中
包装类型的缓存机制了解吗?
Byte、Short、Integer、Long这四种包装类默认创建了数值[-128,127]的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False
记住: 所有整型包装类对象之间值得比较,全部使用equals方法比较
1.4 自动装箱与拆箱
- 装箱: 将基本数据类型用它们对用的引用类型包装起来
- 拆箱: 将包装类型转换为基本数据类型
1.5 equals与==的区别
== : 它的作用是判断两个对象的地址是不是相等。即:判断两个对象是不是同一个对象。(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址)
equals(): 它的作用也是判断两个对象是否相等。但它一般有两种使用情况。如下:
- 情况 1: 类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过”==“比较这两个对象 。
- 情况 2: 类覆盖了equals()方法,一般,我们都覆盖equals()方法来两个对象的内容相等;若他们的内容相等,则返回true。
1.6 String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?
- 可变性: String类中使用final关键字字符串数组保存字符串,private final char value[],所以String对象是不可变的。而StringBuffer和StringBuild都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符串数组保存字符串,但是没有用final关键字修饰,所以这两种对象都是可变的。
- 线程安全性 String中的对象是不可变的,也就可以理解为常量,线程安全。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
1.7 面向对象的特征
封装、继承、多态
封装性:
隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可扩展性、可维护性。通俗点说,把该隐藏的隐藏起来,该暴露的暴露出来。这便是封装性的设计思想。(高内聚、低耦合)
继承性
- 定义: 子类继承父类的特征和行为。提供继承信息的类被称为父类(基类),得到继承信息的类被称为子类(派生类)
- 特点: 1、一个类只能继承一个父类,构造方法不能被继承。 2、支持多层继承 3、父类private 的属性和方法不能继承
多态性
- 定义:
在java中,多态是指不同类的对象在调用同一个方法时所呈现出的多种不同行为。 - 分类:
多态分为编译时多态(重载)和运行时多态(程序中定义的对象引用所指向的具体类型在运行期间才确定) - 多态存在的必要条件:
继承、方法重写、父类引用指向子类对象 - 多态实现方式
方式一、重载与重写
重载: 在一个类中,同一个方法名称,不同的参数类型以及个数。
重写: 同一个方法名称,子类继承父类的方法,根据操作的子类不同,完成的功能也不同。
方式二、抽象类和抽象方法
抽象方法: 一个没有方法体的方法称为抽象方法,一般使用abstract关键字修饰
抽象类: 由abstract修饰的类被成为抽象类
特点:
1、抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
2、抽象类不可以实例化
3、抽象类的子类,可以时抽象类,也可以时具体类。如果子类时具体类,需要重写抽象类中所有的抽象方法
方式三、接口
定义: 是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
1.8 接口与类
接口与类的区别:
- 接口不能用于实例化对象
- 接口没有构造方法
- 接口中所有的方法必须是抽象方法
- 接口只能被类实现,不能被类继承
- 接口支持多继承
- 接口只能含static和final变量
接口与抽象的区别:
- 一个类只能继承一个抽象类,但是可以实现多个接口
- 抽象类中的方法可以有方法体,接口中的方法必须是抽象方法,没有方法体
- 抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final类型
- 抽象类可以有静态代码块和静态方法,接口中不能含静态static修饰的方法