java中的枚举问题中的变量

新人初学java,在学到枚举的时候遇到了问题,求教各位
枚举中有这样一段定义

public class WeekDay(){
private WeekDay(){}
public final static WeekDay SUN = new WeekDay()
......
}
后面就是这样得一些定义星期的代码
不明白的地方:
1.这里是枚举的问题:为什么创建对象可以在这个类的内部,一般来说,不是一般只有在另一个类里创建这个类的对象算是正确吗?
2. 这里有个new关键字,我的理解是new一般会和类搭配使用,用来分配一个空间来存放这个对象,这样对,吗?
3.我是不是可以把java中的类理解一个数据类型,相当于自己定义的,然后WeekDay SUN 相当于int a这个语句,可以这样理解吗?
在下先谢谢各位了

4个回答

1.首先你的类不是枚举类,枚举类的申明关键字是enum,而不是class
2.你的类构造方法是私有的,那么就只有在该类上申明实例,或者在该类的内部类中申明实例,外部和外部反射实例化是不同的。
3.new关键字就是把类实例化,在堆内存中为类实例分配空间,然后就是SUN持有该空间的引用地址。
4.类实例化的时候其初始空间大小需要计算的,每个变量之间拥有位偏移量,而基本类型可以准确计算出需要的内存空间。

u010775468
键盘手C 谢谢您
接近 4 年之前 回复
w172087242
little_how 回复键盘手C: 对的,可以这样理解,如果有帮助,希望选择我的答案。
接近 4 年之前 回复
u010775468
键盘手C 谢谢您,关于第二个问题,是不是可以这样理解:对于一个类,他的构造方法如果是private的话,那么他不会被外部的类实例化,只能在他的内部实例化,所以才会有这样的语句出现?
接近 4 年之前 回复
u010775468
键盘手C 谢谢您,关于第二个问题,是不是可以这样理解:对于一个类,他的构造方法如果是private的话,那么他不会被外部的类实例化,只能在他的内部实例化,所以才会有这样的语句出现?
接近 4 年之前 回复

对于第3条,我个人觉得把类理解为一个类型是正确的,但是WeekDay SUN 和 int a这两个语句是有区别的,WeekDay SUN只是声明了一个引用变量,而没有分配空间,但是int a是即声明了变量也为变量分配了空间。

u010775468
键盘手C Student st = Student();这是实例化一个对象是吧,那么如果只有 Sthdent st = new Student1()(这个student1是Student的子类)是不是相当于把st这个句柄指向student1这个子类,实际操作的也是子类?
接近 4 年之前 回复
u010775468
键盘手C 谢谢您。有个问题还想请教下您;
接近 4 年之前 回复
u010775468
键盘手C 谢谢您。有个问题还想请教下您;
接近 4 年之前 回复

1 首先,枚举类,本质也是类,只是它的实例对象有所限制,就是它定义的几个实例,通常构造函数是私有的,或者不提供构造函数。这样外界类就不能
new 枚举类类型了,只能通过枚举类类名.实例来访问各个实例对象。
2 其次,你给出的这段代码就是枚举类内部public final static WeekDay SUN = new WeekDay(),其实就是定义了一个成员,实例化一个对象。

1.枚举类的声明关键字是enum,而不是class,public enum VoEnum {}
2.若类构造方法是私有的,那么就只能在该类上声明实例,或者在该类的内部类中声明实例,外部和外部反射实例化是不同的。
3.new关键字就是把类实例化,在堆内存中为类实例分配空间,然后就是SUN持有该空间的引用地址,并不分配空间。.类实例化的时候其初始空间大小需要计算的,每个变量之间拥有位偏移量,而基本类型可以准确计算出需要的内存空间。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java枚举类型有关的问题
请问一下 枚举类型可以定义成员变量和方法吗? 还有这段话应该如何理解啊 ![图片](https://img-ask.csdn.net/upload/201610/28/1477643863_411418.jpg)
java中的类的方法的调用的问题
新人初学java,有些概念不是很懂,还望各位能帮帮忙,谢谢 在java中,我知道静态方法(变量)可以直接类名.调用,而不用再创建对象, 但是我在学习枚举时遇到这样一个问题: public enum WeekDay{ MON,TUE,WEB,THU,FIR,SAT } public class TestEnum{ public void static main(String [] ,args){ WeekDay today = WeekDay.SAT; sysout(WeekDay.valueof("SAT")); } } 这里的WeekDay.valueof方法我用today代替了下,然后eclipse警告说这个方法是静态的,但是这个方法我在WeekDay这个枚举(可以看做是一个类吧)并没有定义,这里有点糊涂,既然这个类是我自己定义的,我没有定义这样一个静态方法,为什么提示说是个静态方法,那么又是哪个类里面的呢,求解答,谢谢各位
新手,c++操作mysql数据库怎么在sql语句中加入变量或者说有没有像java一样的预编译方法
新手,c++操作mysql数据库怎么在sql语句中加入变量或者说有没有像java一样的预编译方法,把数据放入sql语句中执行? 还有像如下的错误表达式为整数或者未区分范围的枚举类型是怎么回事,那错了?求大神解答 ![图片说明](https://img-ask.csdn.net/upload/201801/18/1516241868_679685.png)
Java中数组的类型转换问题
向上转型自不用说,对向下转型原理也知道,主要看父类的引用:如果父类变量引用的是正确的子类类型(即父类对象引用的是子类型的内存空间,然后赋给子类对象),则赋值将执行;如果父类变量引用的不是相关的子类型,将产生ClassCastException异常。 通过下属代码测试,符合原理。 ``` Object[] o={"qw","we","rt"}; Object[] oo=new String[]{"qw","we","rt"}; String[] s=new String[3]; s=(String[]) o; String[]ss=(String[]) oo; ``` 但在实际运用时出现的情况令我不解,如: ``` Enum[] en=Util.parse("SurCode", element, SurCode.A);//SurCode为枚举类型,该函数返回的数组引用该枚举类型,通过下边的代码可验证 System.out.println( (en[0].getClass())); moreSurCode=new SurCode[en.length]; for(int i=0;i<en.length;i++){ moreSurCode[i]=(SurCode) en[i];//可以正常转换 } SurCode[] moreSurCode1= (SurCode[]) en;//此句话就会报 java.lang.ClassCastException: [Ljava.lang.Enum; cannot be cast to SurCode ``` 异常正如注解中所述,为什么会出现该问题,请各位赐教!
proguard只对方法体进行混淆应该怎么配置,不混淆成员变量,类名,注解,方法名,实体,枚举。仅混淆方法体的内容。
proguard只对方法体进行混淆应该怎么配置,不混淆成员变量,类名,注解,方法名,实体,枚举。仅混淆方法体的内容。下面是我的配置,求大神指导。![图片说明](https://img-ask.csdn.net/upload/201909/20/1568947932_171831.png) ![图片说明](https://img-ask.csdn.net/upload/201909/20/1568948033_613625.png)![图片说明](https://img-ask.csdn.net/upload/201909/20/1568948101_676195.png)
java中能将字符串赋给枚举类型吗?怎样用switch代替if-else?
想简化下面的代码,用switch语句代替if语句来提高效率,但是不知道switch()括号中的判别式怎么写,请各位帮忙,谢谢! public void Text_identify(File f) { HashMap<String, String> GlobalMode = new HashMap<String, String>(); String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); for (int i = 0; i < input.length; i++) { String re = input[i].replace(",", " ").trim(); if (re.startsWith("Book Title")) { booktitle = input[i].substring(input[i].indexOf("-") + 2); GlobalMode.put("booktitle", booktitle); contiue; } if (re.startsWith("Chapter Title")) { title = input[i].substring(input[i].indexOf("-") + 2); GlobalMode.put("title", title); contiue; } // 多个作者识别 if (re.startsWith("Author")) { StringBuffer au = new StringBuffer(); author = au.append(input[i].substring(input[i].indexOf("-") + 2)).toString(); String authorNames = GlobalMode.get("author"); authorNames = (authorNames == null) ? author : (authorNames + "," + author); GlobalMode.put("author", authorNames); contiue; } if (re.startsWith("Copyright")) { year = input[i].substring(input[i].indexOf("-") + 2); GlobalMode.put("year", year); contiue; } if (re.startsWith("isbn")) { isbn = input[i].substring(input[i].indexOf("-") + 2); GlobalMode.put("isbn", isbn); contiue; } } 补充:目的是处理这样的文本: Book Series - Book Title - Graph Drawing Chapter Title - VGJ: Visualizing Graphs Through Java First Page - 454 Last Page - 455 Copyright - 1998 Author - Carolyn McCreary Author - Larry Barowski 识别BookTitle = 对应值;author=对应值;.. [b]问题补充:[/b] 不能用switch,那有没有其他简单高效的方法来代替如此多重复的if-else呢? [b]问题补充:[/b] 我试着用enum了,但是不知道怎么把字符串赋给enum,还有就是switch中的判别式不知道如何写,能否详细说一下呢?谢谢! [b]问题补充:[/b] 1. 代码里变量booktitle, title, author, year, isbn是用来存放他们的对应值,在其他方法里也用到了 2. Java代码 String[] input = readAllFile(f).replaceAll(" ", ";").split(";"); 这里replace完再split确实没必要,我已经按你的方法修改了。 3. globalMode最后要返回给方法调用者,我最后想要的是:可以自己定义booktitle, title, author, year, isbn对应值的显示顺序。像参考文献那样的格式。
jsp上传文件页面报无法解析的编译问题
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <html> <head> <title>带进度条的文件上传</title> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <link href="CSS/style.css" rel="stylesheet"> <script language="javascript" src="JS/AjaxRequest.js"></script> <script language="javascript"> //此处需要加&nocache="+new Date().getTime(),否则将出现进度不更新的情况 function getProgress(){ var loader=new net.AjaxRequest("showProgress.jsp?nocache="+new Date().getTime(),deal_p,onerror,"GET"); } function onerror(){ alert("上传文件出错!"); } function deal_p(){ var h=this.req.responseText; h=h.replace(/\s/g,""); //去除字符串中的Unicode空白符 document.getElementById("progressPercent").style.display=""; //显示百分比 progressPercent.innerHTML=h+"%"; //显示完成的百分比 document.getElementById("progressBar").style.display="block"; //显示进度条 document.getElementById("imgProgress").width=h*(255/100); //显示完成的进度 } function deal(form){ form.submit(); //提交表单 timer=window.setInterval("getProgress()",500); //每隔500毫秒获取一次上传进度 } </script> </head> <body> <form name="form1" enctype="multipart/form-data" method="post" action="UpLoad?action=uploadFile"> <table width="500" height="289" border="0" align="center" cellpadding="0" cellspacing="0" background="images/bg.jpg"> <tr> <td width="61" rowspan="2">&nbsp;</td> <td width="439" align="center"> <table width="80%" height="190" border="0" cellpadding="0" cellspacing="0"> <tr> <td align="center">&nbsp;</td> </tr> <tr> <td height="34" style="color:#FFFFFF">请选择上传的文件:</td> </tr> <tr> <td height="42"><input name="file" type="file" size="42"></td> </tr> <tr> <td height="50" style="color:#FFFFFF"> 注:文件大小请控制在50M以内。</td> </tr> <tr> <td height="29" align="center" style="color:#FFFFFF"><div id="progressBar" class="prog_border" align="left"><img src="images/progressBar.jpg" width="0" height="13" id="imgProgress"></div>  <span id="progressPercent" style="width:40px;display:none">0%</span></td> </tr> <tr> <td height="29" align="center"><img src="images/shangchuan.gif" width="61" height="23" onClick="deal(form1)"> <img src="images/chongzhi.gif" width="61" height="23" onClick="form1.reset();">&nbsp; </td></tr> </table> </td> </tr> </table> </form> </body> </html> upload.java package com.wgh.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * * @author administrator */ public class UpLoad extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getParameter("action"); if ("uploadFile".equals(action)) { this.uploadFile(request, response); // 上传文件 } } public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=GBK"); request.setCharacterEncoding("GBK"); HttpSession session = request.getSession(); session.setAttribute("progressBar", 0); // 定义指定上传进度的Session变量 String error = ""; int maxSize = 50 * 1024 * 1024; // 单个上传文件大小的上限 DiskFileItemFactory factory = new DiskFileItemFactory(); // 基于磁盘文件项目创建一个工厂对象 ServletFileUpload upload = new ServletFileUpload(factory); // 创建一个新的文件上传对象 try { List items = upload.parseRequest(request);// 解析上传请求 Iterator itr = items.iterator();// 枚举方法 while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); // 获取FileItem对象 if (!item.isFormField()) {// 判断是否为文件域 if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件 long upFileSize = item.getSize(); // 上传文件的大小 String fileName = item.getName(); // 获取文件名 // System.out.println("上传文件的大小:" + item.getSize()); if (upFileSize > maxSize) { error = "您上传的文件太大,请选择不超过50M的文件"; break; } // 此时文件暂存在服务器的内存中 File tempFile = new File(fileName);// 构造临时对象 // String savePath=tempFile.getName(); // //返回上传文件在客户端的完整路径名称 // request.setAttribute("filename", savePath); File file = new File(request.getRealPath("/upload"), tempFile.getName()); // 获取根目录对应的真实物理路径 InputStream is = item.getInputStream(); int buffer = 1024; // 定义缓冲区的大小 int length = 0; byte[] b = new byte[buffer]; double percent = 0; FileOutputStream fos = new FileOutputStream(file); while ((length = is.read(b)) != -1) { percent += length / (double) upFileSize * 100D; // 计算上传文件的百分比 fos.write(b, 0, length); // 向文件输出流写读取的数据 session.setAttribute("progressBar", Math .round(percent)); // 将上传百分比保存到Session中 } fos.close(); Thread.sleep(1000); // 线程休眠1秒 } else { error = "没有选择上传文件!"; } } } } catch (Exception e) { e.printStackTrace(); error = "上传文件出现错误:" + e.getMessage(); } if (!"".equals(error)) { request.setAttribute("error", error); request.getRequestDispatcher("error.jsp") .forward(request, response); } else { request.setAttribute("result", "文件上传成功!"); request.getRequestDispatcher("upFile_deal.jsp").forward(request, response); } } } 问题 java.lang.Error: 无法解析的编译问题: 无法解析导入 org.apache.commons.fileupload.disk 无法解析导入 org.apache.commons.fileupload.servlet DiskFileItemFactory 无法解析为类型 DiskFileItemFactory 无法解析为类型 ServletFileUpload 无法解析为类型 ServletFileUpload 无法解析为类型 com.wgh.servlet.UpLoad.<init>(UpLoad.java:15) sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.lang.reflect.Constructor.newInstance(Constructor.java:423) java.lang.Class.newInstance(Class.java:442) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879) org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:610) org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1777) java.lang.Thread.run(Thread.java:745) 求救
Java编译能通过,但是运行的时候提示有错误
<p>Java编译能通过,但是运行的时候提示有错误。</p> <p>提示出现这样的错误:</p> <p> </p> <pre name="code" class="java">Exception in thread "main" java.lang.ExceptionInInitializerError at org.idea.ok.Person.main(Person.java:32) Caused by: java.lang.NullPointerException at org.idea.ok.Gender1.&lt;init&gt;(Gender1.java:28) at org.idea.ok.Gender1.&lt;clinit&gt;(Gender1.java:17) ... 1 more</pre> <p> 原程序如下:</p> <pre name="code" class="Gender1">package org.idea.ok; /* *枚举类 *既可以通过public访问权限的静态常量来访问实例; *也可以通过Gender1类的getInstance静态方法来访问实例变量。 */ import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.NoSuchElementException; import java.util.Map; import java.util.HashMap; public class Gender1 implements Serializable { public static final Gender1 FEMALE = new Gender1(new Character('F'), "FEMALE"); public static final Gender1 MALE = new Gender1(new Character('M'), "MALE"); private final Character sex; private final transient String description; private static Map&lt;Character, Gender1&gt; instancesBySex = new HashMap&lt;Character, Gender1&gt;(); private Gender1(Character sex, String description) { this.sex = sex; this.description = description; instancesBySex.put(sex, this); } public Character getSex() { return sex; } public String getDescription() { return description; } public static Collection getAllValues() { return Collections.unmodifiableCollection(instancesBySex.values()); } public static Gender1 getInstance(Character sex) { /*按照参数指定的性别缩写查找Gender1实例*/ Gender1 result = (Gender1)instancesBySex.get(sex); if (result == null) { throw new NoSuchElementException(sex.toString()); } return result; } public String toString() { return description; } private Object readResolve() { /*保证反序列化时直接返回Gender1类包含的静态实例*/ return getInstance(sex); } }</pre>   <pre name="code" class="java">package org.idea.ok; /* */ public class Person { private String name; private Gender1 gender; public Person(String name, Gender1 gender) { this.name = name; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Gender1 getGender() { return gender; } public void setGender(Gender1 gender) { this.gender = gender; } public static void main(String[] args) { Person mary = new Person("Mary", Gender1.FEMALE); System.out.println("name = " + mary.getName() + "\t" + "gender = " + mary.getGender()); } }</pre> <p> 程序异常提示是:初始化的时候错误;但是造成这种异常的根源是Gender1中的代码的问题。这个我还真是找不出来了,麻烦谁能找出来的,小弟不胜感谢。</p>
多人聊天器,求大神发源代码!初来乍到,小弟实在不是很懂,望大神指教!在线等大神!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
多人聊天器求大神代码!
1. 对功能的规定 分必选项和任选项,其中,必选项是必须完成的,属于项目答辩的入口条件,所有人都要做,未完成者取消答辩资格; 任选项不是入口条件,但每完成一项都会加分,对于完成了必选项的同学,尽可能地多完成一些任选项,以期获得更高的答辩成绩。 如果所有项(包括必选和任选)都完成,那么功能分就是满分。 如果设计思路、界面效果、代码组织等方面有个性(或和别人的不同),则获得附加分。 1.1 服务器功能 1.1.1配置文件 属性:任选 描述:服务器的配置从配置文件中获取,内容包括服务器地址(服务器IP 和 port),具体格式如下: SERVER_IP = 192.168.1.11 PORT = 12012 注意:具体IP和port以本地为准 1.1.2账户文件 属性:必选 描述:客户端注册的用户名和密码需要服务器保存。必须完成下列所有情况: ●内容为用户名和用户密码列表; ●必须用文本形式; ●用户注册用户名重复,需要提示重新选择用户名 ●用户登录时用户名重复,需要提示重新选择用户名 ●用户名密码输入错误,应该提示。给3次连续错误机会,超过3次退出。 1.1.3支持多客户端 属性:必选 描述:基于tcp协议的客户端服务器通讯,服务器采用多线程支持多个客户端连接。 1.1.4业务功能 属性:必选 描述:群聊,单聊 1.1.5链表记录会话连接 属性:必选 描述:服务端使用链表记录当前客户端的会话连接,多个线程访问同一个链表,采用互斥锁来控制。 链表包含下列信息:客户端的ip地址、连接时间,用户名。 1.1.6链表记录动态维护 属性:任选 描述:服务端能够动态维护链表记录;服务器有命令供查询显示。 1.1 客户端功能 1.2.1注册 属性:必选 描述:客户端提供注册用户名,密码功能,用户名密码通过网络传输到服务器认证(用户名不可重复),认证通过后写入账户文件。 1.2.2登陆(认证) 属性:必选 描述:服务器和客户端增加用户密码登陆机制,包含如下流程: ●客户端把接受的用户名密码发送至服务器; ●服务器启动后从配置文件中读取用户信息形成数据表,根据此来验证密码。验证后返回认证结果给客户端(不可一个用户名同时登录) ●如果认证正确,服务器开始接受客户端的命令;认证错误重新认证(3次登陆错误退出) 1.3心跳机制 属性:必选 描述:客户端与服务端之间使用心跳机制,必须完成下列所有情况: ●客户端定时向服务端发送一个数据包(心跳包,内容不限,3秒间隔),证明自己活着; ●服务端显示来自某个IP地址客户端的心跳包; 1.4心跳异常 属性:任选 描述:服务器超过一定的时间没有收到客户端的心跳包(3秒间隔),连续5个包没有接收到则说明客户端出现问题,必须做出如下的处理: ●记录状况; ●断开连接; 1.5聊天功能 属性:必选 描述:两客户端之间能够直接文字通信(类似于QQ聊天), ●能够查询在线列表,具体信息从服务器的链表记录获得; ●可以和别的客户端聊天,发数据采用“用户名后面加数据”方式; 1.6日志文件 属性:任选 描述:服务端通过一个日志文件记录所有客户端连接、命令执行、断开信息(时间,IP地址,执行的命令,心跳包超时等)。 例如:“客户端连接时间 客户端IP地址 客户端的命令 数据包类型(就是上面1.6的data_type) 客户端发送的信息 ”。 2.对性能的规定 本系统在设计方面本着方便、实用的宗旨,性能方面应遵循如下原则: ●执行效率(时间): 软件运行应该尽量高效;避免没有必要的循环处理、重复处理; ●资源损耗(空间):设计尽量节约资源(内存、数组、链表等);不用的资源要及时释放; ●初始化: 变量、数组、内存块、链表节点(其next要置NULL)等都要初始化; ●健壮性:不能出现野指针、内存泄露、数组越界访问等等: ◎申请内存之后,应该立即检查指针值是否为NULL;动态内存的申请与释放必须配对,防止内存泄漏。释放了内存之后,立即将指针设置为NULL,防止产生“野指针”; ◎函数的入参必须进行有效性判断;用户输入、函数返回值(如果用到的话)都要判断; ◎switch-case一定要有default;if-else if等后要有else,除非if满足后返回或退出; ◎数组的下标不要发生“多1”或者“少1”操作。 3.对排版的规定 ●缩进要对齐; ●长行拆分; ●二元操作符的前后应当加空格,包括如下操作符: 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如"="、"+=" ">="、"<="、"+"、"*"、"%"、"&&"、"||"、"<<", "^" 等; ●空行: ◎结构体 声明之后、每个函数定义结束之后都要加1行空行; ◎逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔; ◎一行代码只做一件事情; ◎"if"、"for"、"while"、"do"等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 "{ }"; 4.对可维护性的规定 对可维护性的最终要求:别人能够轻松上手你的代码。 ●结构清晰: ◎模块化:对界面(显示)、菜单管理、逻辑管理、文件操作等等代码要独立,必须多个.java文件; ◎封装:一个函数只做一件事,函数功能要单一;一个函数不能超过50行; 避免重复、冗余代码; ◎代码块清晰。 ●变量命名规范,变量名应该具有自明性: ◎常量,枚举和宏定义命名 常量名,宏和枚举值由全大写字母组成,单词间通过下划线来界定; ◎函数的命名: 使用"动词"或者"动词+名词"(动宾词组)的形式,由一个或多个单词组成且以小写字母开头,以后每个单词的首字母必须大写 ◎变量的命名与定义 应当使用"名词"或者"形容词+名词",由一个或多个单词组成且以小写字母开头,以后每个单词之间用下划线隔开。 ●注释充分:变量、函数(包括参数、返回值)、代码功能块、一些复杂算法……等都需要 清晰明了地说明; 5.对个性的规定 把项目做出个性出来。下列各项中有和比人不同之处、或很有创意,即可认为有个性。独立设计的软件,一般都会出现一些个性。参考、抄袭不会出现个性。 ●设计思路:包括软件的整体架构、功能块的设计思路、函数封装等等; ●功能实现:从用户的角度,使用上发现与众不同的地方; ●其它方面;
混淆代码问题,反编译
我proguard-rules加的混淆代码: ``` -optimizationpasses 5 # 指定代码的压缩级别 -dontusemixedcaseclassnames # 是否使用大小写混合 -dontpreverify # 混淆时是否做预校验 -verbose # 混淆时是否记录日志 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法 -keep public class * extends android.app.Activity # 保持哪些类不被混淆 -keep public class * extends android.app.Application # 保持哪些类不被混淆 -keep public class * extends android.app.Service # 保持哪些类不被混淆 -keep public class * extends android.content.BroadcastReceiver # 保持哪些类不被混淆 -keep public class * extends android.content.ContentProvider # 保持哪些类不被混淆 -keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆 -keep public class * extends android.preference.Preference # 保持哪些类不被混淆 -keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆 -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * {# 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆 public void *(android.view.View); } -keepclassmembers enum * { # 保持枚举 enum 类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; } #Jpush -dontoptimize -dontpreverify -dontwarn cn.jpush.** -keep class cn.jpush.** { *;} #==================gson========================== -dontwarn com.google.** -keep class com.google.gson.** {*;} #==================protobuf====================== -dontwarn com.google.** -keep class com.google.protobuf.** {*;} ``` build.gradle ``` buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ``` 然后APK能导出,也能安装运行,但是我去反编译APK,显示的是 ![图片说明](https://img-ask.csdn.net/upload/201602/23/1456215826_300270.png) ![图片说明](https://img-ask.csdn.net/upload/201602/23/1456215838_121583.png) 而不是别人那种aa,bb,c用字母表示的类和变量什么的,我就不清楚我的是不是正确的,还是没设置好 ![图片说明](https://img-ask.csdn.net/upload/201602/23/1456215875_240126.png)
键盘无法控制对象的移动
在做坦克大战的小程序,坦克无法被键盘控制,程序运行后,依然还是贴了第一张,想知道具体原因。 代码如下: TankJFrame类: ``` import java.awt.*; import javax.swing.*; /** * 坦克主体框架,继承JFrame类 * * **/ public class TankFrame extends JFrame{ private static final long serialVersionUID = 1L; //设置窗口的宽和高 public static int window_width = 1500; public static int window_hight = 1000; //新建tankPanel TanksPanel t_panel = new TanksPanel(); //启动框架 public void lunchFrame() { setTitle("坦克大战"); setSize(window_width, window_hight); setLocation(200, 10); //add各个组件 add(t_panel); //添加键盘控制 addKeyListener(t_panel.p_tanks.k_contral); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); setVisible(true); //窗口大小不可变 setResizable(false); //启动线程 new Thread(t_panel).start(); } //主函数 public static void main(String args[]) { new TankFrame().lunchFrame(); } } ``` TankPanel类: ``` import java.awt.*; import javax.swing.*; /** * 坦克主面板函数,继承JPanel类 * **/ public class TanksPanel extends JPanel implements Runnable{ private static final long serialVersionUID = 1L; //新建玩家坦克 PlayerTanks p_tanks = new PlayerTanks(100, 100, false); //重载paintComponent方法 protected void paintComponent(Graphics g) { super.paintComponent(g); //绘制背景 g.fillRect(0, 0, TankFrame.window_width, TankFrame.window_hight); //绘制玩家坦克 p_tanks.drawTanks(); g.drawImage(p_tanks.getTankImage(), p_tanks.getLocal_x(), p_tanks.getLocal_y(), p_tanks.getTanks_width(), p_tanks.getTanks_hight(), this); p_tanks.move(); } @Override //实现Runnable接口抽象方法run public void run() { while(true) { this.repaint(); //实现线程,使坦克每隔100毫秒重新绘制一次 try { Thread.sleep(100); }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` Tanks类: ``` import java.awt.*; /** * 坦克抽象父类,定义敌方与玩家坦克的共有属性和抽象方法 * * **/ public abstract class Tanks { //坦克初始位置坐标,x值和y值 int local_x; int local_y; //坦克的大小,即贴图的宽高 int tanks_width = 300; int tanks_hight = 300; //坦克的速度 int speed = 100; //坦克的移动方向 Orientation oriTanks; //坦克炮塔的移动方向 Orientation oriTurret; //声明坦克贴图 Image tankImage; //判断坦克是否存活 boolean isAlive = true; //判断坦克是否为玩家坦克 boolean isEnemy = false; //将变量进行封装 public int getLocal_x() { return local_x; } public void setLocal_x(int local_x) { this.local_x = local_x; } public int getLocal_y() { return local_y; } public void setLocal_y(int local_y) { this.local_y = local_y; } public int getTanks_width() { return tanks_width; } public void setTanks_width(int tanks_width) { this.tanks_width = tanks_width; } public int getTanks_hight() { return tanks_hight; } public void setTanks_hight(int tanks_hight) { this.tanks_hight = tanks_hight; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public Orientation getOriTanks() { return oriTanks; } public void setOriTanks(Orientation oriTanks) { this.oriTanks = oriTanks; } public Orientation getOriTurret() { return oriTurret; } public void setOriTurret(Orientation oriTurret) { this.oriTurret = oriTurret; } public Image getTankImage() { return tankImage; } public void setTankImage(Image tankImage) { this.tankImage = tankImage; } public boolean isAlive() { return isAlive; } public void setAlive(boolean isAlive) { this.isAlive = isAlive; } public boolean isEnemy() { return isEnemy; } public void setEnemy(boolean isEnemy) { this.isEnemy = isEnemy; } //构造方法 public Tanks(int local_x, int local_y, boolean isEnemy) { super(); this.local_x = local_x; this.local_y = local_y; this.isEnemy = isEnemy; } //获取图片绘制坦克抽象函数 public abstract void drawTanks(); //移动函数 public abstract void move(); //获取当前位置,返回整张矩形(坦克) public abstract Rectangle getRect(); //获取下一个矩形的位置,返回整个下一个矩形 public abstract Rectangle getNextRect(); } ``` PlayerTanks类: ``` import java.awt.*; import java.awt.event.*; /** * 玩家坦克类,继承坦克父类Tanks * **/ public class PlayerTanks extends Tanks{ //坦克移动方向 Orientation oriTanks = Orientation.Stop; //坦克炮塔方向 Orientation oriTurret = Orientation.U; public KeyContral k_contral = new KeyContral(); //构造函数 public PlayerTanks(int local_x, int local_y, boolean isEnemy) { super(local_x, local_y, isEnemy); } @Override //绘制坦克函数 public void drawTanks() { switch(oriTurret) { //炮塔向上图片 case U: oriTurret = Orientation.U; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_shang.png")); break; //炮塔向左图片 case L: oriTurret = Orientation.L; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_zuo.png")); break; //炮塔向下图片 case D: oriTurret = Orientation.D; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_xia.png")); break; //炮塔向上图片 case R: oriTurret = Orientation.R; setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_you.png")); break; default: setTankImage(Toolkit.getDefaultToolkit().getImage("image/t1_shang.png")); break; } } @Override //判断坦克是否越界 public void move() { //用户按“W”,坦克向上走时 if(oriTanks == Orientation.U) { //坐标减每一次移动,每一次都大于0(不越界) if(local_y - speed >= 0) //向上移动,使用方法,更加安全 setLocal_y(local_y -= speed); }else if(oriTanks == Orientation.L) {//用户按“A”, 坦克向左走 if(local_x - speed >= 0) setLocal_x(local_y -= speed); }else if(oriTanks == Orientation.D) {//用户按“S”, 坦克向下走 if(local_y + speed <= TankFrame.window_hight) setLocal_y(local_y += speed); }else if(oriTanks == Orientation.R) {//用户按“D”, 坦克向右走 if(local_x + speed <= TankFrame.window_width) setLocal_x(local_x += speed); }else {} } @Override public Rectangle getRect() { // TODO 自动生成的方法存根 return null; } @Override public Rectangle getNextRect() { // TODO 自动生成的方法存根 return null; } //内部类,继承KeyAdapter public class KeyContral extends KeyAdapter{ //重写KeyPressed函数来实现对键盘按压事件的收集,做出坦克的移动 public void KeyPressed(KeyEvent e) { super.keyPressed(e); //判断用户按下的按键 if(e.getKeyCode() == KeyEvent.VK_W) {//用户按“W”,坦克向上走 oriTanks = oriTurret = Orientation.U; }else if(e.getKeyCode() == KeyEvent.VK_A) {//用户按“A”, 坦克向左走 oriTanks = oriTurret = Orientation.D; }else if(e.getKeyCode() == KeyEvent.VK_S) {//用户按“S”,坦克向下走 oriTanks = oriTurret = Orientation.L; }else if(e.getKeyCode() == KeyEvent.VK_D) {//用户按“D”,坦克向右走 oriTanks = oriTurret = Orientation.R; }else {//用户按其他按键,坦克不移动 oriTanks = oriTurret = Orientation.Stop; } } //重写KeyReleased,判断用户松开KeyPressed定义的按键后,坦克停止移动 public void KeyReleased(KeyEvent e) { super.keyReleased(e); //判断用户释放的是否是所定义好的按键 if(e.getKeyCode() == KeyEvent.VK_W ||e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_D) { oriTanks = Orientation.Stop; } } } } ``` 枚举: ``` public enum Orientation { U, D, L, R, Stop; } ``` 运行结果: ![图片说明](https://img-ask.csdn.net/upload/201901/26/1548517947_104675.png)
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
Java 14 都快来了,为什么还有这么多人固守Java 8?
从Java 9开始,Java版本的发布就让人眼花缭乱了。每隔6个月,都会冒出一个新版本出来,Java 10 , Java 11, Java 12, Java 13, 到2020年3月份,...
达摩院十大科技趋势发布:2020 非同小可!
【CSDN编者按】1月2日,阿里巴巴发布《达摩院2020十大科技趋势》,十大科技趋势分别是:人工智能从感知智能向认知智能演进;计算存储一体化突破AI算力瓶颈;工业互联网的超融合;机器间大规模协作成为可能;模块化降低芯片设计门槛;规模化生产级区块链应用将走入大众;量子计算进入攻坚期;新材料推动半导体器件革新;保护数据隐私的AI技术将加速落地;云成为IT技术创新的中心 。 新的画卷,正在徐徐展开。...
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
立即提问