封装:使属性(特征)私有化,外部不能直接访问,需要访问属性,为外部提供公开的方法(行为)进行访问。
继承: 是一种是的关系,子类对父类进行扩展, 对父类的复用,java只允许单继承。
多态: 一种事物多种形态,对象的多态,把一个对象复制给不同的引用方法的多态,重写 重载。
2.Java是单继承多实现的理解抽象类和接口的区别,了解四个访问修饰符的访问范围(public protected default private)单继承:更明确,一个子类就应该是其父类代表的事物中的某个更具体的类别,不应该即是这种东西又是那种东西,而从实用角度上来说 单继承易读 易维护 语义清晰 逻辑清楚。
多实现:继承的拓展,接口只定义一些公共行为 比如有两个接口 一个定义了跑这个动作 另一个定义了走这个动作,人这个类就可以同时实现这两个接口所定义的行为。
抽象类 (abstarct class)
- 抽象类都表示的是现实的事物。
- 抽象类所有方法是public abstarct。
- 抽象类跟普通类差不多,比普通类多了一些抽象方法.
- 抽象类只能被继承,一个具体类继承(extends)一个抽象类,必须实现所有 的抽象方法。(单继承)
- 抽象类有构造方法 。
- 抽象类的构造方法给子类构造方法调用。
- 抽象类不能直接创建实例。
接口(interface)
- 接口表示的是规范。
- 接口里的所有属性是public static final。
- 接口没有普通方法。
- 接口只能被实现(implements),一个具体类实现接口,必须使用全部的抽象方法。 (多实现)
- 接口没有构造方法。
- 接口之间可以继承。
- 接口不能直接创建实例。
区别:
- 抽象类可以有构造方法,接口中不能有构造方法。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
- 抽象类中可以包含静态方法,接口中不能包含静态方法
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
- 一个类可以实现多个接口,但只能继承一个抽象类。
同类 同包 不同包子类 不同包非子类
public (公开的) √ √ √ √
protected(受保护的) √ √ √ x
default (默认的) √ √ x x
private (私有的) √ x x x
3.了解方法重载和方法重写的区别 重载和重写都能体现多态重载:
- 是在一个类中,方便了调用者
- 方法名相同,参数列表不同(参数类型不同,参数个数不同)
- 返回值可以相同,也可以不相同。
重写:
- 是父子类之间,如果创建的是子类对象,
- 调用重写的方法,执行的是子类的,
- 方法名相同,返回类型相同,参数列表相同,
- 抛出的异常不能更大,访问权限不能更小。
- 字符串转数组 .toCharArray()
- 字符串中取指定位置 .charAt()
- 字符串与btye数组转换 .getBytes()
- 计算字符串的长度 .length()
- 注意:数组中的length不带()是属性不是方法
- 查找指定字符串是否存在 .indexof()
- 去空格 .trim()
- 字符截取 .substring()
- 拆分字符串 .split()
- 小写转大写 .toUpperCase()
- 大写转小写 .toLowerCase()
- 常用的还有 .toString() .equals()
反射机制:
框架配置文件只读取类名就可以获取对应类中的方法即利用了反射。
垃圾回收机制:
- java程序员不需要关心,内存对象释放问题;
- 由jvm来负责释放内存,如果一个对象没有任何引用指向他;
- 这个对象被视为垃圾,jvm会在空闲时,释放这些空间;
- 而程序员不能控制,只能建议
- System.gc()Runtime.getRuntime().gc()
线程完整的生命周期有:
新建(New)、就绪(Runable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。
- new时为新建状态,
- 调用start()方法进入就绪状态,
- 当cpu分配了时间片进入运行状态,
- 时间片用完回到就绪状态,
- 直到运行结束进入销毁状态,
- 其中在运行状态遇到sleep()方法或等待io *** 作进入阻塞状态,
- 阻塞状态结束进入就绪状态,再有cpu分配时间片执行,
- 线程运行时如果代码被加了锁,当前线程没有获得锁,
- 当前对象进入锁池,当锁被释放,线程获得了到锁回到就绪状态,
- 当有锁的线程调用wait()方法,当前线程进入等待池,释放锁,
- 直到有其他线程调用notify()或notifyAll()方法时等待的线程被唤醒,进入锁池。
有几种方式实现多线程
- 实现Runnable接口,实现run()方法
- 继承Thread类,重写run()方法
怎么解决同步问题
加锁,synchronized,锁方法,锁代码块
7.熟记八大基本数据类型及其字节长度了解它们的包装类原始数据类型 大 小 包 装 类
boolean(布尔型) 1 Boolean
byte(字节型) 8 Byte
char(字符型) 16 Character
short(短整型) 16 Short
int(整型) 32 Integer
long(长整型) 64 Long
float(浮点型) 32 Float
double(双精度浮点型) 64 Double
8.了解值传递和引用传递的区别对于基本数据类型,传递的是数据的拷贝;对于引用数据类型,传递的是引用的拷贝。
9.了解static、final、finally、finalize等修饰词的意义static:
- 静态的
- 所有对象共享
- 属于类的
- 能修饰 属性,方法,内部类,静态代码块
final: 不可改变
- 类 这个类不能被继承
- 属性 创建完对象以后不能被修改
- 变量 初始化以后不能被修改
- 方法 方法不能被重写
finally:
是异常处理语句结构的一部分,表示总是执行。
try{ }catch(Exceptione){ }finally{ colse(); }
finalize:
是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
供垃圾收集时的其他资源回收,例如关闭文件等。
publicclass Test{ publicstatic void main(String[] args){ Testt = new Test(); ... System.gc(); } }10.了解io流的分类(字节流,字符流,缓冲流,桥梁等)并会简单的读写文件
IO流的分类
方向
输入流 输出流
类型
字节流 字符流 对象流
字节流:
- ByteArrayIn(Out)putStream 从内存数组中读取数据字节
- FileIn(Out)putStream 从本地文件中读取数据字节
- StringBufferIn(Out)putStream 从字符串中读取数据字节
- 所有读 *** 作都继承一个公共超类java.io.InputStream类。
- 所有写 *** 作都继承一个公共超类java.io.OutputStream类。
字符流:
- CharArrayReader(Writer) 从字符数组中读取数据
- FileReader(Writer) 从本地文件中读取数据
- StringReader(Writer) 从字符串中读取数数据
- 所有读 *** 作都继承一个公共超类java.io.Reader类。
- 所有写 *** 作都继承一个公共超类java.io.Writer类。
对象流:
ObjectIn(Out)putStream
11.熟练掌握list set map等三类集合以及各实现类异同List Set Map的区别:
- List 有放入顺序,可以重复
- Set 没有放入顺序,元素不可以重复
- Map 键值对形式存在
ArrayList linkedList Vector的区别:
- ArrayList,Vector底层都是数组
- linkedList底层是双向链表
- ArrayList线程不安全
- Vector线程安全
HashMap和Hashtable的区别:
- HashMap线程不安全,允许有一个key为null,value可以为空
- Hashtable线程安全,key和value都不允许为null
网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。程序员所作的事情就是把 数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴。在发送和接收数据时,大部分的程序设计语言都设计了专门的API实现这些功能,程序员只需要调用即可。
13.了解异常相关的知识和一些常见的异常名称,异常分类以及解决方法异常和错误的区别
- Exception 程序执行过程中程序员无法控制出现的问题
- Error 人可以解决,程序员不关心
Exception和RuntimeException的区别
- Exception 强制要求写程序时处理 检测异常/非运行时异常
- RuntimeException 只有在运行时才会产生异常,不要求强制处理 运行时异常非检测异常
处理异常有几种方式
捕获异常:
try{ }catch(Exceptione){ }
抛出异常:
- 在代码的方法体外用throws进行抛出声明。
- 在代码块用throw手动抛出一个异常对象。
如果抛出的异常对象是非运行时异常,此方法的调用者必须显示地用try..catch块进行捕获或者继续向上层抛出异常。
如果抛出的异常对象是运行时异常,此方法的调用者可以选择地进行异常捕获处理。
(如果最终将异常抛给main方法,则相当于交给jvm自动处理,此时jvm会简单地打印异常信息)
14.简略了解三种类型的statement以及jdbc连接数据库代码和数据库连接池的概念,优势以及一些参数的意义Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 、execute。
- 方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。
- 方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句。
- 方法 execute用于执行返回多个结果集、多个更新计数或二者组合的语句。
JDBC连接数据库:
1、加载JDBC驱动程序;
try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver"); }catch(ClassNotFoundExceptione){ System.out.println("找不到驱动程序类 ,加载驱动失败!"); e.printStackTrace(); }
2、创建数据库的连接;
Stringurl ="jdbc:mysql://jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&setCharacterEncoding=utf8"; String username ="root" ; String password ="root" ; try{ Connection con =DriverManager.getConnection(url , username , password ); }catch(SQLException e){ System.out.println("数据库连接失败!"); e.printStackTrace(); }
3、创建一个Statement;
Statementstmt = conn.createStatement(); //PreparedStatementps = conn.prepareStatement("select * from t_user");
4、执行SQL语句;
ResultSetrs = stmt.executeQuery("select * from t_user"); //ResultSetrs = ps.executeQuery();
5、处理结果;
while(rs.next()) { intid = rs.getInt("id"); Stringusername = rs.getString("username"); Stringpassword = rs.getString("password"); System.out.println(id+ "t" + username + "t" + password); }
6、关闭JDBC对象。
if(rs != null) { rs.close(); } if(ps != null) { ps.close(); } if(stmt != null) { stmt.close(); } if(conn != null) { conn.close(); }二、javeWeb阶段
1.了解html以及css样式的常用属性
文本对齐属性(text-align)
文本修饰属性(text-decoration) 多用于a链接 加上横线
文本缩进属性(text-indent)
行高属性(line-height)
颜色属性(color)
字体(font)
超链接 链接地的名称
贴图
display 默认
CSS符号属性:
list-style-type:none;
CSS背景样式:
background-color:#F5E2EC;
指定背景位置
background-position : top;
常用的3种样式:
1)最常用的,外部文件导入格式标签:
2)在Html头部用
*{ padding:0;margin: 0 }
3)javascript- 加载外部.js独立文件:
2.熟练jsp九大内置对象四大作用域以及jstl和el表达式
- out(JspWriter) 字符输出流
- request 请求对象、请求域(GET/POST)
- response 响应对象、重定向
- session 会话作用域
- application 全局作用域
- config 当前Servlet组件或者JSP页面的初始化参数引用
- pageContext(PageContext) 当前JSP页面的作用域
- page(this->HttpJspPage) 引用自己页面(是个Object)
- exception 它是页面中出现异
- page: 当前页面有效,跳转就结束。
- request: 可以跨越forward前后两个页面,刷新就结束。
- session: 存在当前浏览器,关闭浏览器结束。
- application: 从服务器启动开始,到停止后结束。
JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。
Java 中jsp中的EL用法如下:
1、语法结构
${expression}
2、[ ]与.运算符
EL 提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${user. My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量3、变量
EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。
4.了解include指令和动作的区别,session与cookie的异同,隔行变色的实现方法
【include指令和动作的区别】
- include指令合并静态文档或Jsp页面中的内容,可以用于包括动态生成的输出结果,因此可以包含一个Servlet 。
- include指令在编译期合并为一个文档 。 include动作在请求时进行包括处理。
- 共享局部变量
- include指令各文件中的声明的脚本变量在所有组成的页面中有效 。
- include动作在一个文件中声明的脚本变量不能用于其他页面,除非将变量放置在request,session,application作用域中。
修改的生效
- include指令被包含文件被修改,不会立即生效,除非修改主页面或删除主页面的类。
- include动作修改了被包含的文件立即生效。
- 变量的作用域
- include指令中的要注意变量命名冲突情况 。
- include动作不会出现变量命名冲突问题,因为他们实际上是局部变量。
【session与cookie的异同】
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器cookie当使用cookie。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 所以建议,将登陆信息等重要信息存放为session其他信息如果需要保留,可以放在cookie中。
- XML元素都须有关闭标签,
- XML 标签对大小写敏感,
- XML 必须正确地嵌套,
- XML 文档必须有根元素,
- XML 中的注释,
- XML 的属性值须加引号,
- 在 XML 中,空格会被保留,
- XML 以 LF 存储换行。
Servlet的生命周期由Servlet容器控制,该容器创建Servlet的实例。Servlet的生命周期就是指Servlet实例在创建之后响应客户请求直到至销毁的全过程。Servlet实例的创建取决于Servlet的首次调用。Servlet接口定义了Servlet生命周期的3个方法。
- init():创建Servlet的实例后对其进行初始化。
- service():响应客户端发出的请求。
- destroy():如果不需要处理的请求,则释放Servlet实例。
- 注意:Servlet关闭时才销毁。
JSP页面的执行过程:
1. 用户请求JSP页面(HTTP请求),
2. web server中的servlet容器发现URL中有JSP后缀, 就调用JSP容器来处理,
3. 如果此页面是第一次被请求, JSP容器要定位JSP页面文件并解释它,
解释的过程包括: 将JSP源文件处理成servlet代码(java), 以及编译java文件生成servlet的call文件.
说明: JSP解释器生成的servlet类是实现了java.servlet.jsp.HttpJspPate接口的类(由JSP容器提供)的一个子类, 这个servlet类叫做页面实现类(JSP页面实例);
4. JSP容器运行页JSP页面实例, 此时servlet(即JSP页面实例)就会出来HTTP请求, 生成对于的HTTP响应并传回给客户端.
如果此页面不是第一次被请求, 则跳过3, 直接跳到4.
Servlet监听器是给Web应用增加事件处理机制,以便更好地监视和控制Web应用的状态变化,从而在后台调用相应处理程序。
Web.xml 配置:监听器
pageage.listenerclass
解决乱码问题:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); chain.doFilter(request, response); response.setCharacterEncoding("utf-8"); }
Web.xml 配置:过滤器
7.了解ajax区分何时用局部刷新何时用iframe刷新并会写ajax的js代码(原始ajax和jquery版的)filter itany.filter.com.TestFilter filter /*
iframe是一个内联框架,你可以理解为在原有的HTML内多出的一个独立的框架,从刷新这个框架能做到类似“局部刷新”的效果。
而AJAX是一种局部刷新的技术,它本身而言可以针对这个页面所有的元素,而不像iframe那样,只能局部刷新其“圈起来”的部分。
从性能上来说,如果一个页面比较大,对局部刷新比较多的情况下,比如有太多地方都可能需要独立刷新,如果你用N个iframe的话,对系统的性能消耗就比较明显了,直接的结果就是页面加载起来会慢。
8.了解jquery理解其核心是取得页面元素对象及熟悉一些常用的方法明白其是对js的一种封装jquery 中动态绑定事件:
bind、live、delegate、on,对应的解除监听的函数分别是unbind、die、undelegate、off。
jquery中迭代的方法:each。
jsp和servlet的区别:
jsp适合前端显示数据,servlet适合接受数据、控制数据跳转流程。
三、数据库Oracle中的触发器的类型可划分为4种:
- 数据 *** 纵语言(DML)触发器
- 替代(INSTEAD OF)触发器
- 数据定义语言(DDL)触发器
- 数据库事件触发器
Oracle 关联查询的区别:
- 內连接:即最常见的等值连接。
- 左连接:是在等值连接的基础上加上主表中的未匹配数据。
- 右连接:是在等值连接的基础上加上被连接表的不匹配数据。
- 全外连接:是在等值连接的基础上将左表和右表的未匹配数据都加上,全外连接的等价写法,对同一表先做左连接,然后右连接。
数据库的存储过程:
其实存储过程和函数是相似的,或者干脆把存储过程理解为另一种经过优化的函数。
它的优点在于,存储过程在被编译后会被直接保存在数据库中,成为数据库的一部分,
以后就可以反复调用,运行速度快,效率高。。。
索引 :
索引是对数据库表中一列或多列的值进行排序的一种结构。
优点:
- 大大加快数据的检索速度;
- 创建唯一性索引,保证数据库表中每一行数据的唯一性;
- 加速表和表之间的连接;
- 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点:
- 索引需要占物理空间。
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
oracle中truncate和delete的区别:
1.truncate和 delete只删除数据不删除表的结构(定义)
2.delete语句是dml,这个 *** 作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发truncate,drop是ddl, *** 作立即生效,原数据不放到rollback segment中,不能回滚. *** 作不触发trigger。
3.速度,一般来说: drop> truncate> delete。
4.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。
5.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
数据库的优化:1.查询语句优化:
避免过多的表关联,注意where 中的字段顺序,先过滤有索引的,能尽量缩小数据范围的等。
2.索引优化:
合理分析并设置、调整索引。
3.表结构优化:
如果数据量过大,纵向或者横向拆分表。纵向拆,将前n个字段放在一个表,后面m个放另一个表。横向:满足一定条件的数据放一个表,比如公司员工特别多,男雇员放一个,女雇员放一个表,人妖放一个表。
4.存储方式优化:
通过不同的存储空间或者表分区,将数据存放在不同的存储区域,达到充分利用IO的目的
熟悉一些mysql的创库创表增删改查语句,oracle的权限赋予及各种函数的使用;
创库: create database 项目名 default charset utf8( 格式 ) collate utf8_general_ci;
熟悉oracle的图形化工具,熟练各种查询语句以及视图,序列,触发器,索引的概念和作用
熟练运用mysql的limit和oracle的rownum进行分页。
四、框架部份框架部分具体细化问题可能问的比较少,一般问的都是从大方面出发比如各个框架的优缺点,异同等等。
Hibnernate (冬眠)
持久层框架:
Hibernate是一个基于JDBC的主流持久层框架,对JDBC访问数据库的代码做了封装,简化DAO层的编码工作,对象关系映射的灵活性出色,它支持各种关系数据库,从一对一到多对多的各种复杂关系。
hibernate核心API
- Configuration 用于解析hibernate.cfg.xml和Xxx.hbm.xml,并创建SessionFactory对象。
- SessionFactory 用于创建Session,很消耗资源,线程安全,单例。
- Session 会话,持久化管理器,线程不安全,每次提供新的Session对象。
- Transaction 事务管理器。
Hibernate和Mybatis同为持久层框架 经常会拿来比较异同?
Mybatis优势:
- MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
- MyBatis容易掌握,而Hibernate门槛较高。
Hibernate优势:
- Hibernate对DAO层开发更简单,
- Hibernate 对数据库移植性要好。
- Hibernate有更好的二级缓存机制,可以使用第三方缓存。
Spring的核心是ioc和aop各自的含义和作用分别是什么?
Spring就是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。
AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。
Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便。
mvc模型的三层分别是指项目中的哪些类使用mvc的原因是什么?
- 三层架构是三层架构:三层架构是数据访问层,业务逻辑层,和表示层。
- 三层架构是为了体现高内聚和低耦合,但是还未完全体现这种思想。
MVC是由Model(模型)放置业务实体,表示 *** 作数据;View(视图)放置UI模板文件,负责展示输出结果;Controller(控制器)放置Controller类,处理URL请求 组成的。通常是和三成架构、工厂等一起使用,可以将高内聚和低耦合的概念体现得淋漓精致。
五、设计模式了解的越多越好目前我们接触过的可能不过就是单例模式,工厂模式以及一点代理模式 这三个模式要有一定的了解
单例模式:
程序运行期间,这个类有且只有一个实例。
简单工厂模式
创建对象,降低调用者和实现者的耦合度。
静态代理模式
不改变现有代码基础上增加新的功能。
适配器模式
底层 *** 作的数据时相同的数据,将某一一种类型转成另一种类型。
六、总结面试并不可怕如果大家面试多了就会发现其实很简单,问来问去不过就那么些问题,面试你的人或许也只有一两年开发经验并没有我们想象中那么厉害,需要注意的:
- 首先是面试尽量早到虽然有些公司不在意这些但是起码不要迟到
- 第二就是要注意礼貌给面试官留下一个好印象录用你的机会总是会比别人大一些的
- 第三面试过程中要自信不要支支吾吾这样就算答出来了印象也不会好,听完问题如果没理解就让面试官再具体问一下,确认理解了问题在脑子里组织好答案一气呵成即可,如果没学过的可以直接说毕竟我们都是刚入门的菜鸟大家都能理解的
- 第四面试结束之后回想起面试过程中答不出的问题 一定要及时找出答案以面对以后的面试 我当时用手机查出答案都会保存书签每天睡觉之前会浏览一遍
- 第五找到工作了不代表万事大吉 每个公司都有自己的框架和开发侧重点 才入门的时候总是最痛苦的 也许开发工具,数据库,框架,技术等等你都一无所知就开始有了任务,不要灰心菜鸟都是这样熬过来的,进公司之后百度就是你最好的老师,同事都在百度之后毕竟每个人都有自己的活,有些问题一时半会也不一定能解决好。要学会利用百度搜索有用信息,也要多问同事也许别人的一句话就能让你少走许多弯路。
最后祝大家都能找到一份满意的工作开启自己的JAVA之路。
文末福利
大家可以加老师vx领取最新资料哦
别忘了扫码领资料哦,获取【Java高清路线图】和【全套学习视频和配套资料】
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)