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";
}
}
//下篇再见…谢谢