文章目录
1. Java 创建对象有哪四种方式?
1.1 使用 new 创建对象
使用 new 关键字创建对象是最常见的方式,但是使用 new 创建对象会增加耦合度。无论使用什么框架,都要减少 new 的使用以降低耦合度。
学生类:
package com.su.homework;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void say(){
System.out.println("你好");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
使用 new 关键创建对象
package com.su.homework;
public class creatMethod1 {
public static void main(String[] args) {
Student st01 = new Student();
st01.say();
}
}
1.2 使用反射机制创建对象
学生类的代码如上不变;
使用 Class 类的 newInstance 方法
package com.su.homework;
public class creatMethod02 {
public static void main(String[] args) {
try {
Class aClass = Class.forName("com.su.homework.Student");
Student st02 = (Student) aClass.newInstance();
st02.say();
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.3 采用 clone
clone 时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间;由于 Object 对象有个 clone() 方法,实现了对象中各个属性的复制,但是它的可见范围时 protected 的,所以实体类使用克隆的前提是:需要实现 Cloneable
接口,并且覆盖 clone() 方法,可见性提升为 public;
学生类
package com.su.homework;
public class Student implements Cloneable{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void say(){
System.out.println("你好");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
使用 clone 方法实现创建对象
package com.su.homework;
public class createMethod03 {
public static void main(String[] args) {
Student st = new Student("张三",11);
try {
Student st03 = (Student) st.clone();
st03.say();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
1.4 采用序列化机制
使用序列化时,要实现实现 Serializable
接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。
package com.su.homework;
import java.io.*;
public class createMthod04 {
public static void main(String[] args) {
Student st = new Student();
// 准备一个文件存储该对象的信息
File f = new File("student.txt");
try {
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
//序列化对象,写入磁盘
oos.writeObject(st);
// 反序列化对象
Student st04 = (Student) ois.readObject();
st04.say();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.什么是 maven ? maven 的核心功能有哪些?
-
什么是 Maven:
- 百度百科:Maven,是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
- 在说 maven 之前,我们需要一个例子,加如有两个 Java 项目,A,B,其中项目 A中的一些功能依赖于项目 B 中的某些类,以往的操作就是将 B 打成 jar 包,然后在项目 A 的 library 下导入 B 的 jar 包,这样项目 A 就可以使用项目 B 的某些类,但是这样做很有缺陷 ,如果 B 中有 bug,还得将项目 B 重新修改,在导入到 A 中,非常麻烦。
- Maven 的功能便是合理叙述项目间的依赖关系,通过 pom.xml 文件的配置获取 jar 包,而不用你手动去添加 jar 包,所谓的 maven 项目,就是在 java 和 web 项目上面包裹一层 maven,本质上 java 项目还是 java 项目,web 项目还是 web 项目,但是因为包裹在 maven 内,所以可以使用 maven 的一些功能了,比如通过 pom.xml 添加 jar 包,而不用手动去添加。
-
核心功能:
- 构建工具:打项目包;
- 依赖管理工具:集成资源;
- 项目信息聚合工具:
3.什么是 MVC ?说说分层的好处。
-
MVC:
-
MVC 是一种软件设计模式,也可以说为一个架构,它就是强制性使应用程序的输入,处理和输出分开,将一个应用程序分为三个不浮粉:Model(模型)、View(视图)、Controller(控制器);
-
用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查的操作,完成之后,根据业务的逻辑选择响应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。
-
-
MVC 的优势:
- 耦合性低:视图层和业务层分离,这样允许更改视图层代码而不用重新编译模型和控制器代码。
- 重用性高:MVC 模式,允许使用各种不同央视的视图来访问同一个服务器端的代码,比如,可以在手机和电脑上购物,虽然订购方式不同,但是处理订购产品的方式是一样的。
- 部署快,生命周期成本低:开发人员和维护人员分别将精力分在自己岗位就行。
- 可维护性高:分离视图层和业务逻辑层也使得 web 应用更易维护和修改。
4. Spring 的两大核心技术是什么?
-
IOC(Inversion of Control)
控制反转,在 Spring 里的实现是 Dependency Injection(依赖注入),就是说对象之间的依赖关系在后期哦通过配置文件 pom.xml 生成,优势在于,前期只需要关注单个对象的功能实现,具体的业务实现是后期配置完成的,不同的配置可以产生不同的功能;
-
AOP(Aspect oriented programming)
面向方面的编程,用来降低对象之间的耦合程度,在 Spring 中,AOP 不需要借助专门的 AOP 定义语言,只需要普通的 Java 对象和 XML 配置文件即可。
5.什么是 IOC/DI ?
- IOC:
- IOC 中文简称为控制反转,是用来降低耦合度的,问题在于,谁控制谁,控制了什么,如何反转;
- 谁控制谁:若将 IOC 当作一个存储对象的容器,那么开发中的所有对象都可以交给 IOC 容器去做一个统一的规范管理;
- 控制了什么:既然开发中的对象已经交给了 IOC 管理,那么当我们在获取对象的时候就需要由 IOC 容器来给我们提供,那么 IOC 容器也就是控制了对象的获取权;
- 如何反转:假如我们需要的 A 类需要 B 类的一个实例,一般情况就是在 A 类中直接 new 一个 B 的实例来使用,但是现在 A 需要告诉 IOC 容器,它需要 B 的实例,然后 IOC 容器将 B 的实例给 A 类,就是对实例对象的控制权力发生了一个反转;
- IOC 就是一种设计思想,帮助哦我们实现程序之间的解耦,设计出耦合性更低的程序,相对于传统的 new 对象来说,有了 IOC 容器之后,我们把对象的控制权交给容器,让容器去管理对象,会降低对象之间的耦合性。
- IOC 中文简称为控制反转,是用来降低耦合度的,问题在于,谁控制谁,控制了什么,如何反转;
- DI:
- DI中文是依赖注入,在容器运行的时候,扫描所有的依赖关系,并为之冬天的注入对应的依赖关系,比如,我们去借书,告诉管理员我们需要唐朝的历史书,然后管理员把书给我们,我们拿书的过程就是依赖注入;其中也有三个问题:谁依赖谁,谁注入了谁,注入了什么;
- 谁依赖谁:程序依赖于 IOC 容器,上例中,就是我们依赖于管理员;
- 谁注入了谁:IOC 容器把对象注入了程序中,上例中,就是管理员将书给我们;
- 注入了什么:IOC 容器把依赖的对象注入了程序,上例中,就是我们请求的书,管理员给了我们。
- DI中文是依赖注入,在容器运行的时候,扫描所有的依赖关系,并为之冬天的注入对应的依赖关系,比如,我们去借书,告诉管理员我们需要唐朝的历史书,然后管理员把书给我们,我们拿书的过程就是依赖注入;其中也有三个问题:谁依赖谁,谁注入了谁,注入了什么;
- 其实,IOC 和 DI 就是同一个问题的不同描述,总的来说, IOC/DI 就是一个公共的管理平台,管理对象之间的依赖关系,需要什么对象,就直接拿来用,而不用考虑什么时候去创建,什么时候销毁,只管用就行了。
6.谈谈面向对象编程与面向接口编程的区别。
- 都是设计模式的一种体现;
- 面向对象编程就是一堆对象,通过封装、继承、多态等更加有效的组织程序。
- 面向接口编程就是一堆接口,通过接口规约对象的属性和方法,是面向对象的一部分。不过面向接口的好处就是低耦合。
7.什么是反射?说说反射是如何应用到 spring 框架上。
-
反射:
-
在运行时期,动态地去获取类中的信息(类的信息,方法的信息,构造器信息,字段等信息的操做)
-
正常方式:通过完整的类名->通过 new 实例化->取得实例化对象;
-
反射方式:实例化对象-> getClass() 方法->通过完整的类名;
-
反射优点:提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力;允许程序创建和控制任何类的对象,无需提前硬编码目标类;
-
-
Spring:
- Spring 的目的就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的。
-
通过 Java 的反射机制,将属性配置参数转化为相应的类型,然后再调用规定的方法设置参数。
8.说说 java 解析 xml 有哪些技术?
-
DOM:
- DOM 是 W3C 处理 XML 的标准 API,处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改;
- 优点:操作简单快捷,
- 缺点:但是由于其需要处理开始时将整个 XML 文件读入内存中去分析,因此其在解析大量的 XML 文件时会遇到内存泄漏以及程序崩溃的风险;
- 适用范围:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型
-
SAX:
- SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。
- 优点:由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。
- 缺点:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。
- 适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求。
-
Digester:
- 是在上述两者的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求;
- 适用范围:有将 XML 文档直接转换为 JavaBean 需求。
9.抽象类与接口的区别。
- 抽象类:用来捕捉子类的通用特性,它不能被实例化,只能被用作子类的超类;
- 接口:接口是抽象方法的集合,如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
- 对比:
参数 | 抽象类 | 接口 |
---|---|---|
默认的实现方法 | 可以有默认的实现方法 | 接口完全是抽象的,不存在方法的实现 |
实现 | 子类使用 extends 继承抽象类,如果子类不是抽象类,那么需要提供抽象类中所有声明的方法的实现 | 子类使用 implements 来实现接口,它需要提供接口中所有声明的方法实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
与正常 Java的区别 | 处理不能实例化抽象类之外没有区别 | 接口是完全不同的类型 |
访问修饰符 | 抽象方法可以有 public、protected 和 default 这些修饰符 | 接口方法默认修饰符是 public ,也可以不使用其他修饰符 |
main() 方法 | 抽象方法可以有 main 方法并且可以运行 | 接口没有 main 方法,因此不可以运行 |
多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口只能继承一个或多个其他接口 |
速度 | 它比接口速度快 | 接口时稍微有点慢,因为它需要时间去寻找在类中实现的方法 |
添加新方法 | 如果往抽象类中添加新的方法,可以提供默认的实现,不需要改变现在的代码 | 如果往接口中添加方法,那么必须改变实现该接口的类 |
- 适用:
- 如果拥有一些方法,并且想让它们中的一些有默认实现,那么使用抽象类;
- 如果想实现多继承,那么必须使用接口;
- 如果基本功能在不断改变,那么就需要使用抽象类;
10.谈谈表单的同步提交与异步提交的区别。
-
同步:
<form id="register_form" method="post" action="/register"> <div class="form-group"> <label for="email">邮箱</label> <input type="email" class="form-control" id="email" name="email" placeholder="Email" autofocus> </div> <div class="form-group"> <label for="password">密码</label> <input type="password" class="form-control" id="password" name="password" placeholder="Password"> </div> <button type="submit" class="btn btn-success btn-block">注册</button> </form>
表单具有默认的提交行为,默认是同步的,同步表单提交,浏览器会锁死(转圈儿)等待服务端的响应结果。
表单的同步提交之后,无论服务端响应的是什么,都会直接把响应的结果覆盖掉当前页面。(服务器重定向只针对同步提交有效)