Java創建對象的四種方式
- new一個對象
- clone方法
- 反射
- 對象反序列化
我們先創建一個Students類:
public class Students implements Cloneable{
private int sid; //學號
private String sname; //姓名
private String gender; //性別
private String birthday; //出生日期
private String major; //專業
public Students() {
}
public Students(int 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 int getSid() {
return sid;
}
public void setSid(int 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;
}
@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 class Demo {
public static void main(String[] args) throws Exception {
//1.new一個對象
Students s1 = new Students(100,"張三","男","1999-10-10","電路專業");
System.out.println(s1);
//2.使用clone來創建對象
Students s2 = (Students) s1.clone();
System.out.println(s2);
//3.反射創建對象
Class clazz = s1.getClass();
Constructor constructor = clazz.getConstructor(int.class,String.class,String.class,String.class,String.class);
Students s3 = (Students) constructor.newInstance(new Object[]{200,"李四","女","1999-10-10","金融專業"});
System.out.println(s3);
//4.反序列化創建對象
File file = new File("test.data");//把s1對象寫入到文件中
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(s1);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Students s4 = (Students) in.readObject();
System.out.println(s4);
}
}
打印結果:
/*
Students{sid=100, sname='張三', gender='男', birthday='1999-10-10', major='電路專業'}
Students{sid=100, sname='張三', gender='男', birthday='1999-10-10', major='電路專業'}
Students{sid=200, sname='李四', gender='女', birthday='1999-10-10', major='金融專業'}
Students{sid=100, sname='張三', gender='男', birthday='1999-10-10', major='電路專業'}
*/
maven
- 概述 :Maven 翻譯爲"專家"、“內行”,是 Apache 下的一個純 Java 開發的開源項目。基於項目對象模型(縮寫:POM)概念,Maven利用一箇中央信息片斷能管理一個項目的構建、報告和文檔等步驟。Maven 是一個項目管理工具,可以對 Java 項目進行構建、依賴管理。Maven 也可被用於構建和管理各種項目,例如 C#,Ruby,Scala 和其他語言編寫的項目。
- maven的核心功能:
1)依賴管理
2)模塊管理
3)插件管理
4)部署管理
面向對象編程與面向接口編程的區別
- 面向對象編程:java就是面向對象編程,所謂在java中萬事萬物皆對象,這是因爲java中所有類的調用都是new出來,面向對象用到三大特性,即封裝、多態、繼承。
- 面向接口編程:編碼時使用接口而不是具體的對象,一個接口可以從三方面去考察:制定者(或者叫協調者)、實現者(或者叫生產者)、調用者(或者叫消費者),接口本質上就是由制定者來協調實現者和調用者之間的關係。所以通常說的"面向接口編程"可以理解爲:只有實現者和調用者都遵循"面向接口編程"這個準則,制定者的協調目的才能達到。
反射是如何應用到spring框架上
- 反射:反射(Reflection)是Java被視爲動態語言的關鍵,反射機制允許程序在執行期藉助於Reflection API取得任何類的內部信息,並能直接操作任意對象的內部屬性及方法。加載完類之後,在堆內存的方法區中就產生了一個Class類型的對象(一個類只有 一個Class對象),這個對象就包含了完整的類的結構信息;我們可以通過這個對象看到類的結構;這個對象就像一面鏡子,透過這個鏡子看到類的結構,所以,我們形象的稱之爲:反射。
- 如何應用到spring框架?
//解析<bean .../>元素的id屬性得到該字符串值爲"sqlSessionFactory"
String idStr = "sqlSessionFactory";
//解析<bean .../>元素的class屬性得到該字符串值
爲"org.mybatis.spring.SqlSessionFactoryBean"
String classStr = "org.mybatis.spring.SqlSessionFactoryBean";
//利用反射知識,通過classStr獲取Class類對象
Class cls = Class.forName(classStr);
//實例化對象
Object obj = cls.newInstance();
//container表示Spring容器
container.put(idStr, obj);
//當一個類裏面需要用另一類的對象時,我們繼續下面的操作
//解析<property .../>元素的name屬性得到該字符串值爲“dataSource”
String nameStr = "dataSource";
//解析<property .../>元素的ref屬性得到該字符串值爲“dataSource”
String refStr = "dataSource";
//生成將要調用setter方法名
String setterName = "set" + nameStr.substring(0, 1).toUpperCase()
+ nameStr.substring(1);
//獲取spring容器中名爲refStr的Bean,該Bean將會作爲傳入參數
Object paramBean = container.get(refStr);
//獲取setter方法的Method類,此處的cls是剛纔反射代碼得到的Class對象
Method setter = cls.getMethod(setterName, paramBean.getClass());
//調用invoke()方法,此處的obj是剛纔反射代碼得到的Object對象
setter.invoke(obj, paramBean);
java 解析xml有哪些技術?
- 基於樹的DOM
DOM是html和xml的應用程序接口(API),將整個文檔解析成一顆樹型結構,通過API可以在各節點上任意訪問,優點就是操作方便,缺點是因爲要完整解析文檔,所以在解析超大文檔時內存佔用較大。 - 基於事件模型的SAX(Simple API for XML)
是一種流式解析,順序讀取並解析文檔,在解析到特定元素的時候通過用戶定義的解析事件句柄來執行操作,可以看作一種“推送”的形式。與DOM相反,SAX的優點就是內存佔用低,因爲不需要完全解析文檔,速度更快,但是由於是基於事件模型,所以用戶在編程時會有一種“被動”的不適感。 - JDOM(Java-based Document Object Model)
Java特定的文檔對象模型。自身不包含解析器,使用SAX
優點是使用具體類而不是接口,簡化了DOM的API、大量使用了Java集合類,方便了Java開發;其缺點是沒有較好的靈活性、性能較差。 - DOM4J(Document Object Model for Java)
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP
優點是使用了大量的Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法、有很好的性能;其缺點是大量使用了接口,API較爲複雜。
抽象類與接口的區別
- 抽象類要被子類繼承,接口要被類實現。
- 接口只能做方法聲明,抽象類中可以作方法聲明,也可以做方法實現。
- 接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
- 接口是設計的結果,抽象類是重構的結果。
- 抽象類和接口都是用來抽象具體對象的,但是接口的抽象級別最高。
- 抽象類可以有具體的方法和屬性,接口只能有抽象方法和不可變常量。
- 抽象類主要用來抽象類別,接口主要用來抽象功能。
表單的同步提交與異步提交的區別
- 同步提交:直接在form表單的開始標籤裏添加action和method屬性實現
<form id="form" method='"post" action="${ctx}/user/saveUser">
<input type="text" id="name" name="name" value="${user.name}"/>
<input type="text" id="age" name="age" value="${user.age}"/>
</form>
<input id="save-btn" type="submit" value="保存"/>
@RequestMapping(value = "/saveUser",method = RequestMethod.POST)
public String saveUser(User user,HttpServletRequest request, HttpServletResponse response) throws Exception {
try{
userService.save(user);
}catch (Exception e){
e.printStackTrace();
}
return "redirect:/user/userList";
}
- 異步提交:form標籤去掉method和action屬性,保存按鈕input標籤類型變爲button,Java中返回String,則ajax中dataType類型爲’text’。
<form id="form">
<input type="text" id="name" name="name" value="${user.name}"/>
<input type="text" id="age" name="age" value="${user.age}"/>
</form>
<input id="save-btn" type="button" value="保存"/>
<script>
$(document).ready(function() {
//表單異步提交
$("#save-btn").on("click",function(){
$.ajax({
type: 'post',
data: $('#form').serialize(),
url: '${ctx}/user/saveUser',
cache:false,
dataType:'text',
success: function (data) {
if("fail"!=data){
layer.msg('保存成功');
window.location.href = "${ctx}/user/userList?userId="+data;
}else{
layer.msg('保存失敗');
}
}
})
})
</script>
@RequestMapping(value = "/saveUser",method = RequestMethod.POST)
public String saveUser(User user,HttpServletRequest request, HttpServletResponse response) throws Exception {
try{
User user = userService.save(user);
return user.getUserId();
}catch (Exception e){
e.printStackTrace();
return "fail";
}
}
//下篇再見…謝謝