开发测试题

寵の児 提交于 2020-02-18 12:48:19

要求:(答案自己写的,如有不对或者不足多多指教)
1、每题都要写出对应的基本概念,分数30%;
2、每题都要写出实际例子,用于说明如何应用,分数占70%。
一、举例描述什么是面向对象编程?(10分)
面向函数在编程过程中注重函数与数据,面向对象编程与面向函数编程不同,面向对象编程在编程过程中注重对象,每个事物都有他特定的属性,面型对象编程就是将一个事物的属性抽象化,赋给它属性和方法,再将这个对象封装成类。
举例 洗衣服
首先抽象出两个对象 人 洗衣机
人 加入方法:加洗衣液 加衣服 选择工作时间
洗衣机 加入属性:洗衣服的时间,方法:定时功能 洗衣服 甩干
执行
人.洗衣液方法
人.加衣服方法
洗衣机.定时功能(调用人.选择工作时间方法)
洗衣机.洗衣服方法
洗衣机.甩干方法
洗衣完成
对外我们将这个类的具体实现细节隐藏,就好比是为洗衣机套上个壳子,隐藏内部结构,也就是代码的模块化。洗衣机上的按键就是类中的方法。在向大了看,如果将洗衣机类比成一个平台,那么按键就可以看成是调用功能的接口。
二、举例描述面向对象的继承和多态。(10分)
编程时应当遵循开闭原则,即对扩展开放,对修改关闭,这样做是为了尽量少的修改或是影响其他的代码片段,也是为了增加代码的重用,因此面向对象的继承就显得尤为重要。首先继承这个词语,从字面意义理解上来讲就是 继续 承担 ,子辈继续承担父辈的遗产、责任,放在编程上就是子类继承父类的属性、方法,例如洗衣机 最开始的老式洗衣机只有洗衣服的功能,为了更加方便,或是为了满足部分人群需要,单单是洗衣服一个功能已经不够了,原有的老式洗衣机设计方案仍然要存在(仍有人群需要老式洗衣机),还要有新一代洗衣机设计方案,既要有能洗衣服,还要添加新功能,如甩干,老式洗衣机设计方案与新式洗衣机设计方案就是父类与子类的关系。我们需要甩干这个功能时,就将新式洗衣机设计方案实例化,再调用它的甩干方法。
多态,一种接口,多种形态,类的多态是为了实现接口重用。
重载:重载是一个类中多态性的表现形式,一个类中定义了多个同名方法,它们的参数个数不同或有参数类型不同,这样我们在调用方法时,调用的同一个方法名不变,但通过传递不同的参数可以类实现不同的方法。
重写:重写发生在父类与子类之间,如果在子类中的方法和父类方法的方法名、参数个数和类型一致,那么就说子类重写了父类的方法。
重写和重载都是同一方法有不同的形态。
向上转型和向下转型:向上转型和向下转型是同一个类有不同的形态,将父类引用指向子类对象。
设计一个父类或是接口,通过根据不同的业务需要继承这个父类或实现这个接口而实现不同的功能。
public class polymorphism {
public static void main(String[] args) {
WashingMachine oldWashingMachine= new OldWashingMachine(); // 向上转型
WashingMachine newWashingMachine= new NewWashingMachine();
oldWashingMachine.basicFunction(); // 洗衣服
newWashingMachine.basicFunction(); // 定时洗衣服
newWashingMachine.newFunction(); // 甩干
WashingMachine oldWashingMachine2= (OldWashingMachine )oldWashingMachine; /向下转型
}
}
abstract class WashingMachine{
abstract void basicFunction();
}
class OldWashingMachine extends WashingMachine{
public void basicFunction() {
System.out.println(“洗衣服”);
}
}
class NewWashingMachine extends WashingMachine {
public void basicFunction() {
System.out.println(“定时洗衣服”);
}
public void newFunction() {
System.out.println(“甩干”);
}
}
三、举例说明java中面向接口编程的优点。(10分)
面向接口编程就是先把客户的业务提取出来,作为接口,在接口的实现类中具体写业务的实现细节,这样做的好处是当用户的需求发生变化时,我们不需要修改原来的代码,而是在原有接口的基础上新增实现类,符合软件设计原则的开闭原则。
举例:
abstract class WashingMachine{ //设计一个洗衣机接口
abstract void basicFunction();
}
class OldWashingMachine extends WashingMachine{ // 老式洗衣机接口
public void basicFunction() {
System.out.println(“洗衣服”);
}
}
class NewWashingMachine extends WashingMachine { // 新式洗衣机接口
public void basicFunction() {
System.out.println(“定时洗衣服”);
}
public void newFunction() {
System.out.println(“甩干”);
}
}
class DrumWashingMachine extends WashingMachine { // 滚筒洗衣机
public void basicFunction() {
System.out.println(“滚筒洗衣服”);
}
public void newFunction() {
System.out.println(“甩干”);
}
}
}
四、举例说明java中HashMap和ArrayList的区别。(10分)
ArrayList实现的是list接口,底层是以list的方式存储,因此ArrayList存储是有序的,可以重复,HashMap实现的是map接口,底层是存储的键值对,故HashMap存储是无序的,不可以重复,如果出现多个相同key,后面的会将前面的覆盖掉。Arraylist用add方法添加元素,HashMap用push方法添加元素。
举例:
class ArrayListAndHashMap {
public static void main(String[] args) {
List arrayList = new ArrayList();
arrayList.add(“This”);
arrayList.add(“is”);
arrayList.add(“an”);
arrayList.add(“ArrayList”);
System.out.println(arrayList);
Map map = new HashMap();
map.put(“key2”,“value2”);
map.put(“key1”,“value1”);
map.put(“key3”,“value3”);
map.put(“key4”,“value4”);
map.put(“key4”,“value”);
System.out.println(map);
}
}
运行结果
[This, is, an, ArrayList]
{key1=value1, key2=value2, key3=value3, key4=value}
五、举例说明java servlet为什么是线程不安全,如何避免。(10分)
Servlet处于服务器进程,用多线程方式运行其service方法,一个实例可以服务于多个请求,故而线程不安全
解决方案
1.实现SingleThreadModel接口,表示当前的Servlet每次只能被一个线程去访问(修改)
2.给共享数据加锁
3.避免使用成员变量,推荐使用局部变量
举例

package com.css;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class Servlet extends HttpServlet {
String parameter;
private static final long serialVersionUID = 787553024399133588L;
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
parameter = request.getParameter(“parameter”);
PrintWriter printWriter = response.getWriter();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
printWriter.write(“

Hello World!
” + parameter);
printWriter.close();
}

}
当多个浏览器传参访问时,会出现页面参数与浏览器传入的参数不一致的情况,最简单的方法就是将parameter这个参数从共享变量变成局部变量。

六、举例说明java servlet 过滤器的用法。(10分)
过滤,生活中常用到,例如自来水过滤器,自来水过滤器通过物理拦截和化学转化来进行消毒净化,放在servlet 过滤器上也是同理,servlet过滤器是对浏览器请求进行“消毒净化”。登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等,由于一般的请求需要的过滤操作有很大部分是相同的,所以我们将需要的过滤操作抽出来,单独作为一个类,即过滤器。
Filter的创建和销毁由web服务器负责。 web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
使用方法举例:
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
String path=request.getRequestURI();
Integer uid=(Integer)session.getAttribute(“userid”);
if(path.indexOf("/login.jsp")>-1){//登录页面放行
filterChain.doFilter(request, response);
return;
}
if(path.indexOf("/register.jsp")>-1){//注册页面放行
filterChain.doFilter(request, response);
return;
}

    if(uid!=null){//已经登录
        filterChain.doFilter(request,response);//放行
    }else{
        response.sendRedirect("login.jsp");
    }
}
@Override
public void destroy() {}

}
七、举例说明Spring Ioc的原理。(10分)
首先,Java是面向对象编程,一个业务通常会拆分成很多对象,通过对象之间的相互协作来实现业务逻辑。当一个对象需要另一个对象的某个方法时,就要在自身代码中创建这个对象的实例,这种对象主动创建协作者的方式无疑会增加耦合。既然主动创建会造成耦合,那么我们就将创建这个过程交付出去,由其他人创建,再注入进来,从主动创建到被动接受,创建这个职责被反转了,也可以理解为对于对象实例的控制权被反转了。举例:
//自己通过new 获取对象
public class WashingMachineFactoryService {
PartDepartment partDepartment = new PartDepartment(); //零部件车间
BoxDepartment boxDepartment = new BoxDepartment(); //箱体加工车间
public void service() {
partDepartment .createEngine(); //生产引擎
boxDepartment .createFuselageCover(); //生产外壳
}
}
//IOC容器对象注入
public class WashingMachineFactoryService {
@Autowired
PartDepartment partDepartment; //零部件车间
@Autowired
BoxDepartment boxDepartment; //箱体加工车间
public void service() {
partDepartment .createEngine(); //生产引擎
boxDepartment .createFuselageCover(); //生产外壳
}
}
属性注入举例
新建user实体类
package com.css.sqlmanage.my;
public class User {
private String name;
private int age;
//get set 方法
@Override
public String toString() {
return “用户[姓名=” + name + “,年龄=” + age + “]”;
}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>






测试类
package com.css.sqlmanage.my;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IocConfig {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);
User user = (User) context.getBean(“user”);
System.out.println(user.toString());
}
}
运行结果

八、举例说明SpingMVC开发方式。(30分)
新建项目,选择maven项目 勾选webapp版本的
通过pom文件导入依赖

在web.xml 中

DispatcherServlet
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
classpath:spring.xml



DispatcherServlet
*.do

Springmvc.xml中
<context:component-scan base-package=“com.test”/>
<mvc:annotation-driven />






text/html;charset=UTF-8
















User类
@Component
public class User {
private String name;
private String age;
// get set 方法
@Override
public String toString() {
return “User [name=” + name + “, age=” + age + “]”;
}
}

@Controller
@RequestMapping("/TestInterface")
public class TestInterface {

@RequestMapping(params = "hello", consumes="application/json", method = RequestMethod.POST)

@ResponseBody
public Map<String,Object> testModel(HttpServletRequest request, HttpServletResponse response) throws Exception{
Map<String,Object> responseMap = new HashMap<String, Object>();//用来存接口返回信息
try{
String data= IOUtils.toString(request.getInputStream());//获取传入的json
Map<String, Object> requsetMap = new HashMap<String, Object>();//用来保存接口请求信息
requsetMap = JSON.parseObject(data);//把json转成map

        User user = new User();
        String  username = requsetMap.get("name").toString();
        String  age = requsetMap.get("age").toString();
        user.setAge(age);
        user.setName(username);
        responseMap.put("data", user);
        responseMap.put("code", "200");//状态码
        responseMap.put("msg", "操作成功");
    }catch(Exception e){
        responseMap.put("data", "");
        responseMap.put("code", "500");
        responseMap.put("msg", "请求失败,系统异常");
        e.printStackTrace();
    }
    System.out.println("接口返回的json:" + JSON.toJSONString(responseMap));
    return responseMap;
}

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!