文章目錄
1.Java創建對象有哪些方式
-
使用new關鍵字
-
使用clone()方法
實體類實現Cloneable接口,重寫clone()方法,調用clone()方法,克隆得到的對象與原來的對象不是一個對象
-
使用反射
得到Students類的Class對象,根據Class對象得到構造器,再根據構造器得到對象
-
使用對象的反序列化
西安序列化將對象寫入文件中,再反序列化從文件中得到對象,記得關閉流
-
使用spring獲得對象
先在xml配置文檔裏配置好對象的屬性與id值,得到與配置文檔的連接,根據配置文檔裏id屬性的值,得到對象
Java代碼:
//Students類
package org.westos.domain;
import java.io.Serializable;
public class Students implements Cloneable, Serializable {
private String sid;
private String sname;
private String gender;
private String birthday;
private String major;
//實現Cloneable接口,重寫父類的clone()方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Students{" +
"sid='" + sid + '\'' +
", sname='" + sname + '\'' +
", gender='" + gender + '\'' +
", birthday='" + birthday + '\'' +
", major='" + major + '\'' +
'}';
}
public Students() {
}
public Students(String sid, String sname, String gender, String birthday, String major) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.major = major;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
}
//測試類
package org.westos.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.westos.domain.Students;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException, InvocationTargetException {
//1.使用new關鍵字創建對象
Students s1 = new Students("001", "張三", "男", "1993-02-03", "古文");
System.out.println("s1:" + s1);
//2.使用clone()方法創建對象
Students s2 = (Students) s1.clone();
System.out.println("s2:" + s2);
System.out.println(s1 == s2);//s1與s2不相等
//3.使用反射得到對象
Class aClass = Class.forName("org.westos.domain.Students");//使用類名得到類的Class對象
//使用構造器的參數得到構造器
Constructor constructor = aClass.getConstructor(String.class, String.class, String.class, String.class, String.class);
//使用構造器得到對象
Students s3 = (Students) constructor.newInstance(new Object[]{"002", "李四", "男", "1994-02-04", "高數"});
System.out.println("s3:" + s3);
//4.使用反序列化得到對象
//得到對象輸出流
File file = new File("studentLists.text");
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
//將對象序列化寫到文件studentLists.txt中
out.writeObject(s2);
//得到對象輸入流
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
//反序列化讀取對象
Students s4 = (Students) in.readObject();
System.out.println("s4:" + s4);
//關閉流資源
in.close();
out.close();
//5.使用spring中的IOC獲取對象
//與配置文檔applicationContext.xml建立連接
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//根據配置文檔裏的id屬性的值,獲得對象
Students s5 = (Students) context.getBean("s2");
System.out.println("s5:" + s5);
}
}
applicationContext.xml配置文檔:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義學生對象-->
<bean id="s1" class="org.westos.domain.Students">
<property name="sid" value="003"/>
<property name="sname" value="張三丰"/>
<property name="gender" value="男"/>
<property name="birthday" value="1998-10-10"/>
<property name="major" value="太極拳"/>
</bean>
<!--定義學生對象-->
<bean id="s2" class="org.westos.domain.Students">
<property name="sid" value="004"/>
<property name="sname" value="王五"/>
<property name="gender" value="男"/>
<property name="birthday" value="1999-10-10"/>
<property name="major" value="乒乓球"/>
</bean>
</beans>
2.什麼是maven?maven的核心功能有哪些
-
什麼是maven
管理項目的構建,報告和文檔的項目管理工具軟件。將程序中要使用的jar包存在放在maven倉庫中,只需要在pom.xml文檔中進行配置,就可以聯網獲得對應的jar包,而且會將所導入的jar包的所有依賴的jar包一起導入進去
-
核心功能
- 依賴管理
- 模塊管理
- 插件管理
- 部署管理
-
生命週期
maven將工程的構建過程理解爲不同的生命週期和階段, 一個工程的構建過程中,存在着不同的生命週期,生命週期間互相獨立,沒有一定的順序關係。 每個生命週期又劃分爲不同的階段,不同的階段之間有明確的順序關係, 同一生命週期內的階段必須按順序依次執行。
-
clear(清除)
- pre-clean:執行清理的準備工作
- clean:執行清理工作
- post-clean:執行清理後的後續工作
-
default(核心)
- validate:驗證項目的正確性及項目所必需的信息是否可用
- compile:編譯項目中代碼
- test:用相關的單元測試框架測試編譯後的代碼,測試代碼並不會隨項目打包和佈署
- package:將編譯後的代碼打包成相應的格式文件,如jar包
- integration-test: 如果需要在一個綜合環境中運行我們的測試,這個階段將會運行和佈署項目到該環境中
- verify: 檢查項目中的包是否正確與符合要求
- install:將包安裝到本地maven倉庫,其他項目也可以使用該包作爲依賴
- deploy:將包發佈到遠程的maven倉庫,並提供給其他開發者使用
-
site(建立發佈項目站點)
- pre-site:準備生成
- site:生成項目站點和文檔
- post-site:執行生成文檔後的後續工作
- site-deploy:發佈項目文檔
-
3.什麼是MVC?說說分層的好處
-
什麼是MVC
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計創建 Web 應用程序的模式。
- Model(模型):表示應用程序核心,應用程序中用於處理應用程序數據邏輯的部分,通常模型對象負責在數據庫中存取數據
- View(視圖):顯示數據,應用程序中處理數據顯示的部分,通常視圖是依據模型數據創建的
- Controller(控制器):處理輸入,應用程序中處理用戶交互的部分,通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據
-
優點
- 開發人員可以只用管理結構中的某一層
- 容易使用新的層實替換原有的層
- 降低層間依賴、也就是解耦,降低程序耦合度
- 有利於各層邏輯的複用
-
缺點
- 降低了系統的性能,必須通過中間層才能訪問數據庫
- 有時會倒是級聯的修改,尤其是在上層做出修改後,下層的結構也要做出對應的修改
4.Spring的兩大核心技術是什麼?
- IOC(控制反轉)/DI(依賴注入)
- 一般來說在Java中創建對象是使用new關鍵字創建的,而使用IOC,只需要在配置文檔中進行配置,使用配置文檔中的數據進行對象的創建。不用再使用new關鍵字創建
- IOC創建對象的過程是使用類的默認無參構造創建對象,然後使用類的set方法進行屬性的賦值
- IOC創建對象的本質是反射
- AOP面向切面編程
- 可以簡單的理解爲在不改變原有程序的基礎上爲代碼增加新的功能
- 分爲前置增強、後置增強、最終增強、異常增強、環繞增強
- 需要在原有的類上定義一個切口(方法),然後定義一個用於增強的AOP類,可以在類中定義增強的方法。最後在xml配置文檔中進行配置
5.談談面向對象編程與面向接口編程的區別
-
什麼是面向接口編程
面向對象編程中不同的對象協作完成系統的各個功能,對象內部的實現由各個類自己實現。但是隨着系統愈發複雜,對象內部功能的實現已經不那麼重要了(類自己內部實現),反之對象間的協作能力更爲重要,這就是面向接口編程的思想
面向接口編程就是先將業務的邏輯線先提取出來,作爲接口,而將具體的代碼實現作爲實現類來完成。當客戶需求變化時,只用更改接口下的實現類就可以
-
面向接口編程優點
- 降低耦合性,能極大限度解耦
- 易於程序擴展
- 易於程序維護
-
抽象類和接口的選擇
在於使用動機,使用抽象類是爲了代碼的複用,而使用接口的動機是爲了實現多態性與協作關係
-
經典的面向接口編程例子-JDBC
SUN公司提供了JDBC接口的規範,而不同的數據庫廠商開發不同的數據庫驅動
6.什麼是反射?說說反射是如何應用到spring框架上
-
什麼是反射
反射是Java中一個非常重要的特性,它允許程序在運行時進行自我檢查,同時也允許對其內部成員進行操作。主要有:得到一個對象所屬的類、獲取一個類的所有成員變量和方法、在運行時創建對象、在運行時調用對象的方法等
-
反射的優點
可以動態創建對象和編譯,體現出很大的靈活性,通過反射機制可以獲得類的各種內容,對於JAVA這種先編譯再運行的語言來說,反射機制可以使代碼更加靈活
-
反射機制的缺點
對性能有影響,使用反射基本上是一種解釋操作,這類操作總是慢於只直接執行相同的操作
破壞了類的封裝性,不安全
-
反射機制應用到spring框架中
- 加載resourse資源目錄下的配置文件
- 解析配置文件
- 從配置文件中找到對應id屬性值的對象
- 通過反射調用默認的無參構造創建對象
- 使用set方法對屬性賦值
- 返回創建的對象
7.說說java解析xml有哪些技術?
-
DOM解析
是html和xml的應用程序接口(API),DOM文檔對象模型,採用樹形結構來完成對文檔的解析,在解析時,會將整個文檔加載到內存中然後形成"節點數",當文檔內容過多或者需要解析的文檔過多時,會造成服務器內存緊張
-
SAX解析
流模型中的"推"模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法完成解析工作,解析XML文檔的邏輯需要應用程序完成
-
JDOM解析
Java特定的文檔對象模型。自身不包含解析器,使用SAX
-
DOM4J解析
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP,提供了一套完整的針對DOM和SAX的解析技術,目前使用較爲廣泛
-
STAX解析
流模型中的拉模型分析方式。提供基於指針和基於迭代器兩種方式的支持,JDK1.6新特性
8.抽象類與接口的區別
- 語法區別
- 抽象類可以有構造方法,接口中不能有構造方法
- 抽象類中可以有普通成員變量,接口中沒有普通成員變量
- 抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法
- 抽象類中的抽象方法的訪問類型可以是public,protected,但接口中的抽象方法只能是public類型的,並且默認即爲public abstract類型。
- 抽象類中可以包含靜態方法,接口中不能包含靜態方法
- 抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是默認public static final類型
- 一個類可以實現多個接口,但只能繼承一個抽象類
- 應用區別
- 接口更多的是在系統架構設計方法發揮作用,主要用於定義模塊之間的聯繫
- 抽象類主要在代碼實現方面發揮作用,來實現代碼的重用
9.談談表單的同步提交與異步提交的區別
-
處理步驟
- 同步:提交請求->等待服務器處理->處理完畢返回,在此期間瀏覽器不能做別的事情
- 異步:請求通過事件觸發->服務器處理(服務器任然可以做別的事情)->處理完畢
-
區別
同步提交的時候客戶端瀏覽器不能做別的事情,只能等待服務器處理;而異步提交的時候客戶端瀏覽器任然可以做別的
可以理解爲喫飯,同步就是我叫你去喫飯,你沒聽見,我繼續叫你,知道你回答我了,一起去喫飯。
異步就是我給你發消息說我去喫飯了,然後我就先走了,你後面自己來
-
具體應用
同步表單使用submit按鈕提交,執行表單的action動作會出現頁面假死的現象,用戶體驗不好異步表單使用ajax異步提交,通過普通按鈕提交實現頁面局部刷新,用戶體驗好,大多數使用