第一章 JAVA程序设计概述
JAVA“白皮书”的关键术语
- 简单性
- 面向对象
面试题:面向过程和面向对象的区别?
两者的主要区别在于解决问题的方式不同:
- 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
- 面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
举例:完成小明洗衣服任务
面向过程:定义洗衣服工具类
将小明洗衣服的详细过程一步步定义方法,一步步输出即可。
面向对象:首先考虑分成几种类;小明对象对应person类;衣服对象对应clothes类;在主类实例化person对象,实例化衣服对象,人对象调用衣服对象的操作。
另外,面向对象开发的程序一般更易维护、易复用、易扩展。
- 分布式
- 健壮性
- 安全性
- 体系结构中立
- 可移植性
- 解释型
面试题:JAVA是⼀种半编译半解释型语⾔,为什么?
java是⼀种半编译半解释型语⾔。Java的执⾏过程主要为:.java源⽂件经过javac编译器编译为字节码⽂件.class,然后加载进JVM,在JVM中运⾏⼜经过解释器转化为计算机可以识别的计算机语⾔。
- 高性能
- 多线程
- 动态性
第三章 JAVA的基本程序设计结构
遍历数组:
-
当需要从头开始遍历数组时,可以使用增强的for进行遍历
-
格式:
for(数据类型 元素自定义名 : 数组){
//逻辑处理
}
数组拷贝:
第一种:直接引用拷贝数组的引用;(同一个数组)
第二种:Arrays.copyOf()方法;第一个参数为拷贝的数组,第二个参数为新数组的长度。(不同的数组)
数组排序:
- Arrays.sort():使用了优化的快速排序算法
数组常用的API:
- toString(数组a):对数组a进行字符串转换并输出
- copyOf(数组a):对数组a进行拷贝(不同的数组,即生成一个新数组)
- copyOfRange(数组a,start,end):对数组a从下标start到下标end进行拷贝(不同的数组,即生成一个新数组)
- sort(数组a):对数组a从小到大进行排序
- fill(数组a,充满的相同值b):为数组a的所有下标均赋值为b
- equals(数组a,数组b):比较两个数组是否相等;包括下标和下标对应的元素。
第四章 对象与类
1.类之间的关系
- 依赖:uses-a 类A实例化的对象a需要引用到类B实例化的对象b的行为。(应该尽量减少,降低耦合)
- 聚合:has-a 一个Order对象包含很多Item对象
- 继承:is-a 一个特殊类和一个一般类的关系
2.loaclDate、localDateTime
面试题:为什么建议使用 LocalDateTime ,而不是 Date?
- Date 如果不格式化,打印出的日期可读性差,Date 使用
SimpleDateFormat
对时间进行格式化,但SimpleDateFormat
是线程不安全的。 - Date 类的
getYear、getMonth
这些方法可以获取年月日,但都被弃用 - LocalDate已经格式化时间格式,不需要再进行处理;只返回年月日,线程安全,且LocalDate中的api方法完成可以取代Date的方法
- LocalDateTime返回年月日时分秒
localDate在项目中的应用:
Spring Boot`
中应用 `LocalDateTime将 `LocalDateTime`
字段以时间戳的方式返回给前端 添加日期转化类
3.隐式参数和显式参数
假设在一个类中有这样一个参数和方法:
double a;
public void abc( double b){
a=b/10;
}
也可以将代码改成这样:
double a;
public void abc( double b){
this.a=b/10; //多了一个this.
}
对于abc这个方法而言,参数a被称为隐式参数,参数b被称为显式参数。
对此做出如下总结:
1.出现在方法名外面的参数被称为隐式参数。
2.定义在方法名里面的被称为显示参数。
3.隐式参数称为方法调用的接收者。
4.关键字this表示隐式参数,可省略。
借鉴自https://blog.csdn.net/qq_43251032/article/details/100734368
4.static
被static修饰的字段(变量或常量)、方法,它属于类,不属于任何单个的对象
static修饰方法(静态的成员方法):
访问方式:
方式一:可以使用对象进行访问。
对象.静态的函数名();
方式二:可以使用类名进行访问。
类名.静态函数名字。
推荐使用是类名直接访问静态的成员。
静态的成员变量与非静态的成员变量的区别:
-
作用上的区别:
-
静态的成员变量的作用共享一个 数据给所有的对象使用。
-
非 静态的成员变量的作用是描述一类事物的公共属性。
-
-
数量与存储位置上的区别:
-
静态成员变量是存储方法 区内存中,而且只会存在一份数据。
-
非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。
-
-
生命周期的区别:
- 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
- 非静态的成员数据是随着对象的创建而存在,随着 对象被垃圾回收器回收而消失。
静态函数要注意的事项:
1. 静态函数是可以调用类名或者对象进行调用的,而非静态函数只能使用对象进行调用。
2. 静态的函数可以直接访问静态的成员,但是不能直接访问非静态的成员。
原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,
而非静态的 成员数据是随着对象 的存在而存在的。
3. 非静态的函数是可以直接访问静态与非静态的成员。
原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就已经存在了,而非静态
数据也随着对象的创建而存在了。
4. 静态函数不能出现this或者super关键字。
原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用这时候不存在对象,而this
关键字是代表了一个函数 的调用者对象,这时候产生了冲突。
静态的数据的生命周期:静态的成员变量数据是优先于对象存在的。
借鉴自 https://blog.csdn.net/qq_30764991/article/details/88782432
5.JAVA对方法参数能做什么和不能做什么
- 方法不能修改基本数据类型的参数(即数值型或布尔值)
- 方法可以改变对象参数的状态
- 方法不能让一个对象参数引用另一个新的对象
总结:方法参数是值传递,而不是引用传递。(可以修改对象参数的状态是因为其值保持不变,值指向对象,对指向的对象内部进行修改,后面方法参数仍指向该对象,故可以改变)
6.类设计技巧
- 一定要保证数据私有
- 一定要对数据进行初始化
- 不要在类中使用过多的基本类型
- 不是所有的字段都需要单独的字段访问器和字段更改器
- 分解有过多职责的类
- 类名和方法名要能够体现它们的职责
- 优先使用不可变的类
7.重写与重载
1. 重写(Override)
存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法。
为了满足里式替换原则,重写有以下三个限制:
- 子类方法的访问权限必须大于等于父类方法;
- 子类方法的返回类型必须是父类方法返回类型或为其子类型。
- 子类方法抛出的异常类型必须是父类抛出异常类型或为其子类型。
2. 重载(Overload)
存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。
应该注意的是,返回值不同,其它都相同不算是重载。