java--分析简单java类与反射的联系
package com.hbsi.domain;
public class Student {
public Student() {
System.out.println("构造方法执行了,对象实例化");
}
private String name;
private Integer age;
private String sex;
public String getName() {
System.out.println("getName被调用");
return name;
}
public void setName(String name) {
System.out.println("setName被调用");
this.name = name;
}
public Integer getAge() {
System.out.println("getAge被调用");
return age;
}
public void setAge(Integer age) {
System.out.println("setAge被调用");
this.age = age;
}
public String getSex() {
System.out.println("getSex被调用");
return sex;
}
public void setSex(String sex) {
System.out.println("setSex被调用");
this.sex = sex;
}
}
在web项目中所建立的每个java类最终都会保存在WEB-INF/classes目录下,所以classes就是一个CLASSPATH。但是要求是:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>student_insert.jsp</title>
</head>
<body>
<h1>纯菜鸟</h1>
<form action="student_insert_do.jsp" method="post">
姓名:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
性别:<input type="text" name="sex"><br/>
<input type="submit" value="确定">
<input type="reset"><br/>
</form>
</body>
</html>
此时Student类已经生成了对应的setter 和 getter方法,同时表单中的参数名与Student中的属性名一致,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.hbsi.domain.Student"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
Student stu = new Student();
stu.setName(request.getParameter("name"));
stu.setAge(Integer.parseInt(request.getParameter("age")));
stu.setSex(request.getParameter("sex"));
%>
<h1>Name:<%=stu.getName()%></h1>
<h1>Age :<%=stu.getAge() %></h1>
<h1>Sex :<%=stu.getSex() %></h1>
</body>
</html>
将此项目放到Tomcat中并且运行项目并输入,“懒蛋,18,男”执行结果如下

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.hbsi.domain.Student"%>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="stu" class="com.hbsi.domain.Student" scope="page"/>
<jsp:setProperty property="*" name="stu"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
<h1>Name:<jsp:getProperty property="name" name="stu"/></h1>
<h1>Age :<jsp:getProperty property="age" name="stu"/></h1>
<h1>Sex :<jsp:getProperty property="sex" name="stu"/></h1>
</body>
</html>
执行程序并输入“懒蛋,19,jj” 运行结果如下

package com.hbsi.servlet;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
/*
by:wzq
time:2017年11月12日
*/
@WebServlet(name = "studentServlet", urlPatterns = { "/studentServlet" })
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
Class<?> cls = null;
Object object = null;
try {
cls = Class.forName("com.hbsi.domain.Student");
object = cls.getDeclaredConstructor().newInstance();//获取实例化对象
Enumeration<String> parameterNames = request.getParameterNames();//获得全部参数名称
//判断是否有下一个参数
while(parameterNames.hasMoreElements()) {
//获取下一个参数
String parameterName = parameterNames.nextElement();
//根据参数名得到参数值
String parameterValue = request.getParameter(parameterName);
// System.out.println(parameterName+" "+parameterValue);//这里会显示输出前页面中参数名以及输入的参数值
//参数名就是对应的实体类Student中的属性名,所以根据这个参数名得到其类型
Field field = cls.getDeclaredField(parameterName);
// System.out.println(field);
String simpleName = field.getType().getSimpleName();
//取得setter方法。
Method setterMethod = cls.getMethod("set"+toUpperCaseOne(parameterName), field.getType());
//根据类型来选择的进行转换并赋值
switch (simpleName.toLowerCase()) {
case "string":
//设置值
setterMethod.invoke(object, parameterValue);
break;
case "int":
case "integer":
//设置值
setterMethod.invoke(object, Integer.parseInt(parameterValue));
break;
case "date": break;
case "double": break;
case "char": break;
case "character": break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("student", object);
request.getRequestDispatcher("student_insert_do.jsp").forward(request, response);
}
//将字符串转换成大写开头的字母
public String toUpperCaseOne(String str) {
return str.substring(0,1).toUpperCase().concat(str.substring(1).toLowerCase());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
this.doGet(request, response);
}
}
页面代码范例:输出数据

package com.hbsi.BeanTools; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import javax.servlet.ServletRequest;
import com.hbsi.stringUtils.StringTools;
/*
by:wzq
time:2017年11月12日
*/
public class BeanTools {
/**
* 这个方法只限制在WEB项目中使用,
* 利用反射进行所有请求参数的设置,要求参数名称要与属性名称保持一致
* @param obj 要操作的实例化对象
* @param request HttpServletRequeat接口对象实例,目的是为了获得页面的输入参数
* @throws Exception
*/
public static void setValue(Object obj,ServletRequest request) throws Exception {
Enumeration<String> parameterNames = request.getParameterNames();//获得全部参数名称
//判断是否有下一个参数
while(parameterNames.hasMoreElements()) {
//获取下一个参数
String parameterName = parameterNames.nextElement();
//根据参数名得到参数值
String parameterValue = request.getParameter(parameterName);
// System.out.println(parameterName+" "+parameterValue);//这里会显示输出前页面中参数名以及输入的参数值
//参数名就是对应的实体类Student中的属性名,所以根据这个参数名得到其类型
Field field = obj.getClass().getDeclaredField(parameterName);
// System.out.println(field);
String simpleName = field.getType().getSimpleName();
//取得setter方法。
Method setterMethod = obj.getClass().getMethod("set"+StringTools.toUpperCaseOne(parameterName), field.getType());
//根据类型来选择的进行转换并赋值
switch (simpleName.toLowerCase()) {
case "string":
//设置值
setterMethod.invoke(obj, parameterValue);
break;
case "int":
case "integer":
//设置值
setterMethod.invoke(obj, Integer.parseInt(parameterValue));
break;
case "date": break;
case "double": break;
case "char": break;
case "character": break;
}
}
}
}
package com.hbsi.stringUtils;
/*
by:wzq
time:2017年11月12日 */
public class StringTools {
//将字符串转换成大写开头的字母
public static String toUpperCaseOne(String str) {
return str.substring(0,1).toUpperCase().concat(str.substring(1).toLowerCase());
}
}
package com.hbsi.servlet;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.hbsi.BeanTools.BeanTools; import javax.servlet.annotation.WebServlet;
/*
by:wzq
time:2017年11月12日
*/
@WebServlet(name = "studentServlet", urlPatterns = { "/studentServlet" })
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
try {
Class<?> cls = cls = Class.forName("com.hbsi.domain.Student");
Object object = cls.getDeclaredConstructor().newInstance();//获取实例化对象
BeanTools.setValue(object, request);
request.setAttribute("student", object);
request.getRequestDispatcher("student_insert_do.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
this.doGet(request, response);
}
}

package com.hbsi.servlet;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.hbsi.BeanTools.BeanTools; import javax.servlet.annotation.WebServlet;
/*
by:wzq
time:2017年11月12日
*/
@WebServlet(name = "employeeServlet", urlPatterns = { "/EmployeeServlet/*" })
public class EmployeeServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String requestURI = request.getRequestURI();
System.out.println(requestURI);//请求全路径
int lastIndexOf = requestURI.lastIndexOf("/");//取得最后一个/的位置
String substring = requestURI.substring(lastIndexOf+1);
System.out.println(substring);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doGet(request, response);
}
}
请求路径:http://localhost:8080/tes/EmployeeServlet/update
package com.hbsi.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
/*
by:wzq
time:2017年11月13日
*/
@WebServlet(name = "dispatchaerServlet", urlPatterns = { "/DispatchaerServlet/*" })
public class DispatchaerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String requestURI = request.getRequestURI();
//取得最后一个/的位置
int lastIndexOf = requestURI.lastIndexOf("/");
//状态信息
String status = requestURI.substring(lastIndexOf+1);
System.out.println(status);//输出状态信息
//得到本类的所有方法
Method[] declaredMethods = this.getClass().getDeclaredMethods();
//循环判断状态信息与本类的方法名是否一致
for (int i = 0; i < declaredMethods.length; i++) {
if(declaredMethods[i].getName().equals(status)) {
//如果一直获得参数类型
Class<?>[] parameterTypes = declaredMethods[i].getParameterTypes();
try {
//根据参数类型得到其方法
Method method = this.getClass().getMethod(status, parameterTypes);
//调用方法
method.invoke(this, request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public void insert(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("执行插入方法");
}
public void delete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("执行删除方法");
}
public void update(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("执行更新方法");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doGet(request, response);
}
}
package com.hbsi.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
/*
by:wzq
time:2017年11月13日
*/
@WebServlet(name = "dispatchaerServlet", urlPatterns = { "/DispatchaerServlet/*" })
public class DispatchaerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String uri = "/errors.jsp";
String requestURI = request.getRequestURI();
//取得最后一个/的位置
int lastIndexOf = requestURI.lastIndexOf("/");
//状态信息
String status = requestURI.substring(lastIndexOf+1);
try {
Method method = this.getClass().getMethod(status);
uri = method.invoke(this).toString();
} catch (Exception e) {
e.printStackTrace();
}
request.getRequestDispatcher(uri).forward(request, response);
}
public String insert(){
System.out.println("执行插入方法");
return "/insert.jsp";
}
public String delete() {
System.out.println("执行删除方法");
return "/delete.jsp";
}
public String update() {
System.out.println("执行更新方法");
return "/update.jsp";
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doGet(request, response);
}
}
执行结果:执行插入方法
private Integer empid;
private String empname;
private Dept dept = new Dept();
Dept属性:
private Integer deptid;
private String deptname;
private Company company = new Company();
private Integer companyid;
private String companyname;
工具类StringFirstUPTools:
//作用就是将制定字符串的首字母大写处理
public static String stringFirstUP(String str) {
return str.substring(0, 1).toUpperCase()+str.substring(1,str.length());
}
核心代码实现:注意不适用于自身赋值
package com.hbsi.servlet;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.hbsi.domain.Emp;
/*
by:wzq
time:2017年11月18日
*/
public class Servlet {
//emp属性操作需要当前类对象完成
//emp.dept属性需要由emp类对象完成
private String requestParamName = "emp.dept.deptid";//模拟多级赋值的操作的参数
private String value = "6666";
private Emp emp = new Emp();//必须有实例化对象
public Emp getEmp() {
return emp;
}
public void handleParam(String paramName,String value) throws Exception {
String[] split = paramName.split("\\.");
Object currentObj = this;
for (int i = 0; i < split.length; i++) {
//根据拆分后的字符串得到相应的getter方法
Method method = currentObj.getClass().getMethod("get"+StringFirstUPTools.stringFirstUP(split[i]));
if(i<split.length-1) {//判断是否为最后一个对象而非属性
currentObj = method.invoke(currentObj);//将得到的下一个对象赋值到currentObj
}
}
//根据属性名称得到属性对象
Field declaredField = currentObj.getClass().getDeclaredField(split[split.length-1]);
Class<?> type = declaredField.getType();//属性类型
String typeName = type.getSimpleName();//属性类型简单名称
//根据属性名及类型得到对应的setter方法
Method declaredMethod = currentObj.getClass().getDeclaredMethod("set"+StringFirstUPTools.stringFirstUP(split[split.length-1]), type);
//根据类型来选择的进行转换并赋值
switch (typeName.toLowerCase()) {
case "string": declaredMethod.invoke(currentObj, String.valueOf(value)); break;
case "int":
case "integer": declaredMethod.invoke(currentObj, Integer.parseInt(value)); break;
case "double": declaredMethod.invoke(currentObj, Double.valueOf(value)); break;
}
}
public void get() {//模拟请求
try {
this.handleParam(this.requestParamName,this.value);
} catch (Exception e) {
e.printStackTrace();
}
//验证
Integer companyid = this.getEmp().getDept().getDeptid();
System.out.println(companyid);
}
public static void main(String[] args) {
new Servlet().get();
}
}
public class ClassLoderDemo {
public static void main(String[] args) {
ClassLoderDemo classLoderDemo = new ClassLoderDemo();
System.out.println(classLoderDemo.getClass().getClassLoader());
System.out.println(classLoderDemo.getClass().getClassLoader().getParent());
System.out.println(classLoderDemo.getClass().getClassLoader().getParent().getParent());
}
}
执行结果
jdk.internal.loader.ClassLoaders$AppClassLoader@7960847b //系统类加载器
jdk.internal.loader.ClassLoaders$PlatformClassLoader@2f333739 //系统类加载器的父类加载器
null
public class MyClassLoader extends ClassLoader{
@Override
public Class<?> loadClass(String arg0) throws ClassNotFoundException {
return super.loadClass(arg0);//直接调用父类的loadClass()方法
}
public static void main(String[] args) throws Exception {
MyClassLoader myClassLoader = new MyClassLoader();
Class<?> loadClass = myClassLoader.loadClass("java.util.Date");//与Class.forName()作用几乎一样
Object newInstance = loadClass.getDeclaredConstructor().newInstance();
System.out.println(newInstance);//Sun Nov 19 11:51:29 CST 2017
}
}
package com.hbsi.domain;
public class Student {
public Student() {
System.out.println("student 实例化");
}
@Override
public String toString() {
return "Student 学生信息 toString()";
}
}
package com.hbsi.servlet;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class ClassLoderDemo extends ClassLoader{
public static void main(String[] args) {
try {
ClassLoderDemo classLoderDemo = new ClassLoderDemo();
classLoderDemo.loadClassFile("com.hbsi.domain.Student");//参数必须是包点类名
} catch (Exception e) {
e.printStackTrace();
}
}
public void loadClassFile(String className) {
try {
byte[] loadFile = this.loadFile(className);
//defineClass() 将字节数组转换为类别 Class的实例
Class<?> defineClass = super.defineClass(className, loadFile, 0, loadFile.length);
Object newInstance = defineClass.getDeclaredConstructor().newInstance();//实例化
System.out.println(newInstance);//输出调用toString
} catch (Exception e) {
e.printStackTrace();
}
}
public byte[] loadFile(String className) throws Exception{
String[] split = className.split("\\.");//拆分
String name = split[split.length-1];//取的Class类名
File file = new File("D:/"+name+".class");//拼接路径
//内存输出流
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
//字节流
InputStream inputStream = new FileInputStream(file);
byte date[] = new byte[1024];//缓冲区
int len = 0;
while((len = inputStream.read(date))!=-1) {
arrayOutputStream.write(date, 0, len);
}
//将内存中的数据取出
byte[] byteArray = arrayOutputStream.toByteArray();
arrayOutputStream.close();
inputStream.close();
return byteArray;
}
}
执行结果: student 实例化
package com.hbsi.BeanTools;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
public class ClassLoderDemo extends ClassLoader{
public static void main(String[] args) {
try {
ClassLoderDemo classLoderDemo = new ClassLoderDemo();
classLoderDemo.loadClassFile("com.hbsi.domain.Student");//参数必须是包点类名
} catch (Exception e) {
e.printStackTrace();
}
}
public void loadClassFile(String className) {
try {
byte[] loadFile = this.loadFile(className);
//defineClass() 将字节数组转换为类别 Class的实例
Class<?> defineClass = super.defineClass(className, loadFile, 0, loadFile.length);
Object newInstance = defineClass.getDeclaredConstructor().newInstance();//实例化
System.out.println(newInstance);//输出调用toString
} catch (Exception e) {
e.printStackTrace();
}
}
public byte[] loadFile(String className) throws Exception{
String[] split = className.split("\\.");//拆分
String name = split[split.length-1];//取的Class类名
URL url = new URL("http://localhost:8080/tes/"+name+".class");
URLConnection openConnection = url.openConnection();
//内存输出流
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
//字节流
InputStream inputStream = openConnection.getInputStream();
byte date[] = new byte[1024];//缓冲区
int len = 0;
while((len = inputStream.read(date))!=-1) {
arrayOutputStream.write(date, 0, len);
}
//将内存中的数据取出
byte[] byteArray = arrayOutputStream.toByteArray();
arrayOutputStream.close();
inputStream.close();
return byteArray;
}
}
java--分析简单java类与反射的联系的更多相关文章
- 使用Java封装一个DBUtils类(反射)
刚开始学JavaWeb时,我是调用N个setter方法将从数据库中查询出的数据封装成JavaBean的,极其繁琐. 后来了解SpringJDBC后,发现它提供的接口非常简单,然后就想自己封装一个简单的 ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
- Java 数据库简单操作类
数据库操作类,将所有连接数据库的配置信息以及基本的CRUD操作封装在一个类里,方便项目里使用,将连接数据库的基本信息放在配置文件 "dbinfo.properties" 中,通过类 ...
- JAVA异常处理、常用类、反射、集合
异常 异常:在Java中是指被一个方法抛出的对象. 分类:检查异常.运行时异常.错误 运行时异常(uncheckd):RuntimeException和其子类 检查异常(checkd/搜检异常):指E ...
- Java学习之Java中常用对象
java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- java反射(四)--反射与简单java类
一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...
- ref:Java安全之反序列化漏洞分析(简单-朴实)
ref:https://mp.weixin.qq.com/s?__biz=MzIzMzgxOTQ5NA==&mid=2247484200&idx=1&sn=8f3201f44e ...
- 记一次多个Java Agent同时使用的类增强冲突问题及分析
摘要:Java Agent技术常被用于加载class文件之前进行拦截并修改字节码,以实现对Java应用的无侵入式增强. 本文分享自华为云社区<记一次多个JavaAgent同时使用的类增强冲突问题 ...
随机推荐
- Django自定义用户认证系统之自定义用户模型
参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...
- [转]jkeyll的安装步骤
链接地址:https://nxjniexiao.github.io/2018/08/17/jkeyll-install/
- python 多线程模板简单实现
#-*- encoding: UTF-8 -*- #编码声明 import threading,Queue,os import time #导入方法模块 def main(inargs): work_ ...
- 【HTML5校企公益课】第二天
1.上午讲昨天的作业. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- java抽象类及接口
Java抽象类: 抽象类特点:抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量.成员方法和构造方法的访问方式和普通类一样. 由于抽象类不能实例化对象,所以抽象类必须被extends [抽象 ...
- 学习makefile 的网址
http://www.ruanyifeng.com/blog/2015/02/make.html http://blog.csdn.net/ruglcc/article/details/7814546 ...
- 2019.10.16&17小结
话说也蛮久没写小结了,主要这两次考试失分严重,还是总结下吧. 10.16 T1 小奇挖矿2 100/0 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市 ...
- 人机交互技术 Week 11_Data gathering
Summary: Different Kinds of Requirements Functional requirements Data requirements Environmental req ...
- vector 使用pair对
pair是一种序偶结构<x,y> 如果我们希望使用pair但又不需要map对其排序,可以在vector中使用pair对 插入pair对使用make_pair<typename,typ ...
- csdn博客整理
@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页.如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown ...