学习了c#4.5高级编程这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的c#编程知识。让你一个demo掌握c#编程,如果有问题可以留言。

此demo主要包括五个文件:Students.cs和Moniter.cs文件,包含了自定义空间、空间函数、空间变量、空间自定义类;Interface1.cs文件和Interface2.cs文件为接口文件;index.cs文件为主程序运算。

Students.cs和Moniter.cs文件包含了自定义基、继承类、模板类的定义及实现。涉及到自定义类的构造函数、重载构造函数、函数默认值、析构函数、复制构造函数、重载运算符(赋值函数、加法函数)、虚函数、常值函数、静态函数、静态变量、常值变量、枚举变量、内部类、访问修饰符、继承、重写虚函数、基类引用、不定参数函数、友函数、友类、类型引用、终态函数、终态类、模板变量等内容。

Students.cs文件内容如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace csharpdemo
  7. {
  8. //自定义结构体,值类型
  9. struct People
  10. {
  11. string name;
  12. int id;
  13. }
  14. //static int vartemp=10; //禁止使用脱离类的全局数据
  15. //自定义类,引用类型。一个文件可以包含多个类,类默认为修饰符为私有
  16. public class Student : IComparable<Student>
  17. {
  18. public static void main(String[] args) { } //每个类中都可以有一个main函数,用于调试
  19. static Student() { default_name = "student"; } //静态构造函数,在第一次调用类的任何成员之前,仅执行一次,不能有参数,不用访问修饰符,且只有有一个
  20. public Student() //自定义无参构造器,没有自定义构造器时,编译器会生成默认无参构造器,
  21. : this("student", 12) //通过this仅能调用一个构造器,必须将构造器调用置于起始处
  22. {
  23. getname();
  24. Console.WriteLine("基类无参构造器创建了一个对象");
  25. }
  26. public Student(string name,int age){ //有参构造器,设置int age=12为默认值,可单参数调用
  27. this.age = age; this.name = name;
  28. Console.WriteLine("基类有参构造器创建了一个对象");
  29. }
  30. public Student(string name,params object[] args) //可变参数列表,args是一个参数列表,重载方法中应该只有一个使用可变参数列表,且位于参数的最后面,编译器会自动调用最符合的重载函数执行
  31. {
  32. this.name = name; Console.WriteLine("基类变参构造器开辟了一个对象"); //args[0]为变参中的第一个参数
  33. }
  34. ~Student() { Console.WriteLine("基类析构函数"); } //析构函数
  35. public static Student operator +(Student student1, Student student2) //运算符重载 +号运算 可以重载多种运算。
  36. {
  37. Student student = new Student(student1.name+student2.name);
  38. return student;
  39. }
  40. public static Student operator +(Student student1, string name2) //运算符重载,为避免重载时的隐式转化,+必须位于student变量的后面
  41. {
  42. Student student = new Student(student1.name + name2);
  43. return student;
  44. }
  45. public void setname(string name) { Console.WriteLine("基类设置名称" + name); this.name = name; } //this表示对当前对象的引用
  46. public virtual string getname() { Console.WriteLine("基类获取名称" + name); return name; } //使用public方法实现对private数据的控制,保证类内数据安全
  47. public string tast { get; private set; } //自动实现属性访问设置器
  48. internal void setage (ref int age){Console.WriteLine("基类设置年龄"+age);this.age=age;} //ref传递引用
  49. public virtual void getage(out int age){age=this.age;} //out对未初始化的变量进行保留改变,virtual虚函数不能私有
  50. internal static long time = 10; //数据均可在定义时初始化,internal引用当前类的所有类可见
  51. private int age = 0; //private外部不可以访问
  52. public string name = "student";
  53. static string default_name;
  54. public const int default_age = 12; //const定义常量,定义时赋值,不能是static
  55. public Sextype sextype = new Sextype(); //访问内部类,编译器自动生成构造器
  56. public enum allsex { man, woman } //枚举类型,等价于类内组合class allsex{man,woman}
  57. public class Sextype //内部类,无法通过内部类返回外部类的引用,当内部类声明为static时为嵌套类,嵌套类不属于对象,而属于类名
  58. {
  59. public void setsex(allsex sextype)
  60. {
  61. switch (sextype)
  62. {
  63. case allsex.man: sexstring = "man"; break;
  64. case allsex.woman: sexstring = "woman"; break;
  65. default:break;
  66. }
  67. }
  68. private string sexstring;
  69. }
  70. //重写equals虚函数,重写equals必须重写gethashcode否则发生警告
  71. public override bool Equals(object another)
  72. {
  73. Console.WriteLine("比较了两个基类");
  74. if (this.age == ((Student)another).age && this.name == ((Student)another).name)
  75. return true;
  76. return false;
  77. }
  78. //重写散列函数
  79. public override int GetHashCode()
  80. {
  81. return base.GetHashCode(); //调用基类的散列函数
  82. }
  83. //实现比较函数
  84. public int CompareTo(Student arg0) //要实现排序,必须要实现比较接口
  85. {
  86. return age < arg0.age ? -1 : (age == arg0.age ? 0 : 1); //返回-1表示小于,0表示等于,1表示大于
  87. }
  88. }
  89. //一个文件可以包含多个类,
  90. abstract class Teacher //abstract声明抽象类或抽象函数
  91. {
  92. public abstract void setname(); //abstract抽象方法
  93. public string getname() { return name;} //使用public方法实现对private数据的控制
  94. string name = "teacher"; //不加修饰符默认为?
  95. }
  96. sealed class president<T> : Teacher //派生类如果不是抽象,必须重写全部抽象函数,sealed终态,不能再被继承
  97. {
  98. public sealed override void setname() { } //sealed函数不能重写,重写必须要添加override
  99. private T tt; //设置泛型,也可以使用基本原型object
  100. public T getT() { return tt; } //设置泛型函数,泛型会自动擦除传递过来的对象的类信息
  101. public void setT(T tt) { tt = default(T); this.tt = tt; } //default获取默认值,引用为null,值类型为0
  102. }
  103. }

Moniter.cs文件内容如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace csharpdemo
  7. {
  8. public class Moniter:Student,Interface2<String> //可以包含多个接口,实现泛型接口
  9. {
  10. public Moniter():base("monitor"){ //派生类构造器,关键字base显示调用基类构造器
  11. Console.WriteLine("派生类无参构造器创建了对象" + name);
  12. }
  13. public Moniter(int age){ //派生类单参数构造器
  14. Console.WriteLine("派生类有参构造器创建了对象"+name);
  15. }
  16. static Student mystudent = new Student("moniter",12); //静态对象初始化只在使用时刻在进行,在第一个创建类对象或者第一次访问静态数据时才初始化
  17. //重写函数的返回类型可以是基类此方法的返回类型的派生类型
  18. public override string getname() //重写虚函数需要override关键字
  19. {
  20. Console.WriteLine("派生类获取名称" + name);
  21. //name = base.name + "的派生";
  22. return name;
  23. }
  24. public int getage() { return 11; } //private不能重写,派生类重名,覆盖基类私有方法
  25. new string name = "moniter"; //同名变量和静态变量,不动态绑定到基类引用上,和基类数据存储在不同的区域,new关键字隐藏基类成员
  26. string task = "帮助老师管理班级";
  27. public void init1() //实现接口函数不叫重写,所以不加override。多接口时应避免接口函数同名
  28. {
  29. Console.WriteLine("实现接口1初始化函数,或接口2初始化函数");
  30. }
  31. public void init2(String name) //泛型接口
  32. {
  33. Console.WriteLine("实现接口2初始化函数");
  34. }
  35. }
  36. }

Interface1.cs文件内容如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace csharpdemo
  7. {
  8. public interface Interface1 //interface接口,完全抽象类,接口中不能包含字段
  9. {
  10. void init1(); //abstract抽象方法,接口自动是public的,接口中,不能有函数定义体,abstract可以不写
  11. }
  12. }

Interface2.cs文件内容如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace csharpdemo
  7. {
  8. //in抗变泛型,不能使用向上转型来实现泛型方法,接口也支持继承,接口可以多继承,extends后可以有多个子接口,接口可以嵌套在类中<A>泛型接口
  9. interface Interface2<in T>:Interface1
  10. {
  11. void init2(T name); //abstract抽象方法,接口自动是public
  12. new void init1(); //接口隐藏了基接口的函数
  13. }
  14. }

Index.cs主程序文件内容如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Threading;
  7. namespace csharpdemo
  8. {
  9. using System.Text.RegularExpressions; //using为已有类型声明提供一个新民称
  10. using myint = System.IntPtr;
  11. class index //自定义类可以添加static,静态类不能实例化
  12. {
  13. static String stringtemp = "栾鹏调试";
  14. static void Main(string[] args)
  15. {
  16. var default_age = -2 * -6; //var类型推断,局部变量必须显示初始化,基本类型也通过对象object兑现,只不过只存储值,是值类型,一元减号用于转变数据的符号
  17. const string default_name = "student"; //const常量,编译时用于计算,不能使用变量对其赋值
  18. var students=new {name="students",age=12}; //匿名类型(在实例化时定义)var类型推断
  19. Student.time+=Student.time<<2+0x21^26; //静态数据,可以直接通过类名访问,<<位左移动,低位补零,^按位异或,0x表示16进制数
  20. Student student1 = new Student(); //所有的对象都必须通过new来创建,基本数据类型可以定义创建
  21. student1.name = student1.getname()+1; //访问类内数据,字符串+重载
  22. student1.setage(ref default_age); //通过类内函数访问数据
  23. Student.Sextype student1_sextype = new Student.Sextype(); //创建内部类,必须通过外部类变量new构造
  24. student1_sextype.setsex(Student.allsex.man); //调用枚举类型
  25. Student student2 = student1; //仅复制引用,两个变量名指向同一块内存,可通过实现浅拷贝IShallowCopy和深拷贝IDeepCopy实现全面复制
  26. if (student1==student2) //==和!=只是比较对象的引用,不比较对象内容
  27. if(student1.Equals(student2)) //对象的比较使用equals,但是默认的equals还是比较引用,要在自定义类中重写equals
  28. if(default_age is object) //非布尔值不能用在逻辑表达式中,is检测对象是否与类型兼容,int数据也是object继承来的
  29. printf("创建了两个相同的类");
  30. Random random=new Random(); //随机数
  31. int[,] farray = new int[2,3]; //锯齿数组[2][3],二维数组[2,3]
  32. farray[0,0]=random.Next(10,100); //读取伪随机序列
  33. Moniter sub1 = new Moniter(); //基类构造函数(绑定后函数),派生类成员,派生类构造函数,接口中的域相当于枚举常量
  34. sprintf(sub1,null); //可变参数,null为空参数
  35. sprintf(sub1); //传递实现接口的类,向上转化为接口,实现函数回调
  36. Student student3 = new Moniter(); //基类引用,派生类对象
  37. student3.getname(); //调用引用动态绑定的方法
  38. ((Moniter)student3).getage(); //向下转型成功
  39. Interface1 interface1 = new Moniter(); //向上转型,interface1是基类,接口,无所谓,实现接口的类(包含内部类),都可以向上转化为接口
  40. interface1.init1(); //调用动态绑定的函数
  41. List<String> allname=new List<String>(){"小明","晓刚","小红","晓刚","小刘"};
  42. allname[allname.IndexOf(allname[3])]="小刚"; //[]读取元素,indexof搜索,没有返回-1,
  43. if(!allname.Contains("小王")) //包含元素
  44. allname.Add("小王"); //添加元素
  45. allname.RemoveAt(4); //删除下标元素
  46. allname.Insert(1,"小韩"); //插入元素
  47. allname.Sort(); //排序
  48. //link查询,类似于数据查询语句,查询操作本地数据集(数据集类似于二维表)查询语句就是单个元素的判断
  49. var query = from names in allname where names.StartsWith("小") && names.Length==2 orderby names.Length select names;
  50. foreach(String item in query) //foreach遍历时,link语句才执行
  51. Console.WriteLine(item);
  52. //list,set,dictionary
  53. Queue<String> allname0=new Queue<String>(); //队列count元素个数,Enqueue入队,Dequeue出队,Peek读取头,trimexcess重设容量
  54. Stack<String> allname1= new Stack<String>(); //stack先入后出 堆栈 各种队列和栈基于linked链表实现,count元素个数,push栈顶添加元素,pop栈顶删除元素,contains是否存在
  55. LinkedList<String> allname2 = new LinkedList<String>(); //双端队列,队列,双向链表
  56. HashSet<String> allname3 = new HashSet<String>(); //包含不重复元素的无序列表
  57. SortedSet<String> allname4 = new SortedSet<String>(); //包含不重复的有序集合
  58. var allstudent1 = new SortedList<int,string>(); //有序列表
  59. //sorteddictionary有序字典,键通过gethashcode映射到索引(数组),索引关连值。多个键可以映射到一个索引,一个索引可以关联多个值
  60. Dictionary<int,string> allstudent2=new Dictionary<int,string>();
  61. try //尝试执行
  62. {
  63. StringBuilder sb = new StringBuilder(); //stringbuilder包括insert、replace、substring、reverse、append、tostring、delete
  64. sb.Append(String.Format("这里%s字符串相关操作类","shi")); //string.format() 格式化函数,内部创建formatter类设置字符串格式
  65. String outstr = sb.ToString().Replace("shi","是"); //string是不可变量,取值变化是生成新的类,replace替换,replaceall,replacefirst
  66. outstr+=outstr.Substring(3)+outstr.Length; //substring取子字符串,length字符串长度字段,+重载
  67. if(outstr.IndexOf("shi")<0) //indexof查询子字符串的位置,不存在范围-1,其他字符串相关操作较多
  68. printf("字符串不存在子字符串");
  69. outstr="luanpeng luanpeng";
  70. outstr = Regex.Split(outstr," ",RegexOptions.IgnoreCase)[0]; //split字符串分割,返回数组,IgnoreCase忽略大小写
  71. string patter = "l.an"; //创建正则表达式
  72. MatchCollection matcher = Regex.Matches(outstr,patter,RegexOptions.IgnoreCase|RegexOptions.ExplicitCapture); //创建匹配器
  73. foreach(Match nextmatch in matcher) //依次查询是否存在匹配
  74. printf(nextmatch.Index); //匹配位置
  75. //int aa=0/0;
  76. }
  77. catch (System.Exception ex) //catch函数在try出错时调用,exception为所有异常的基类,异常可以捕获派生类异常
  78. {
  79. printf("错误内容:"+ex.ToString());
  80. Console.WriteLine(ex.StackTrace);
  81. }
  82. finally //finally函数总要执行
  83. {
  84. printf("finally函数总要执行");
  85. }
  86. Student[] all1 = new Student[7]; //
  87. Student[] all2 = new Student[10];
  88. all2=(Student[])all1.Clone(); //复制数组,数组元素为引用,则辅助数组的每一个引用项,引用对象数据不复制
  89. Array.Sort(all2); //调用重写的排序函数执行数组排序
  90. int location = Array.BinarySearch(all2,student1); //在数组中查询,不存在范围-1
  91. president<Student> sub2 = new president<Student>(); //包含泛型的类型调用,也可以不使用泛型创建对象
  92. sub2.setT(student1); //将使用类型替换泛型
  93. //注解
  94. //数据流
  95. //序列化
  96. //Task为后台线程,线程池线程适合运行短时间程序,均为后台线程,不能设置优先级
  97. run(); //在主线程中调用run函数
  98. Parallel.For(2,4,i=>{num=i;run();}); //Parallel.For并行for循环,没有顺序,参数i从2到4(不包括4),可以设置提前终止条件
  99. Parallel.ForEach<string>(allname,str=>{stringtemp=str;run();}); //Parallel.ForEach并行遍历,没有顺序,可以设置提前终止条件
  100. Parallel.Invoke(run,run); //并行运行多个委托
  101. Task t1 = new Task(run); //可以创建时向函数传递参数,新任务,使用线程池中的线程
  102. t1 = new TaskFactory().StartNew(run); //创建任务工厂,并创建启动新线程,使用线程池中的线程
  103. t1 = Task.Factory.StartNew(run); //静态属性factory创建,使用线程池中的线程
  104. t1=Task.Run(()=>{run();}); //lambda表达式为参数重写task的run函数,使用线程池中的线程
  105. //t1.RunSynchronously(); //在当前线程(主线程),启动任务
  106. t1=new Task(run,TaskCreationOptions.LongRunning); //新线程,不使用线程池中的线程
  107. t1.Start();
  108. t1.Wait(); //等待执行完成
  109. //ThreadPool.QueueUserWorkItem(run); //选择线程池中的线程执行函数,没有创建线程池会先创建再执行
  110. //thread默认是前台线程,适合运行长时间函数
  111. Thread thread =new Thread(run); //调用子线程,执行run函数
  112. thread=new Thread(()=>Console.WriteLine("lambda线程函数")); //调用lambda表达式线程函数
  113. thread.IsBackground=true; //设置为后台线程
  114. thread.Priority = ThreadPriority.Highest; //设置线程优先级
  115. thread.Start(); //启动线程Start()括号中可以包含一个参数
  116. thread.Join(); //等待线程结束
  117. thread.Abort(); //线程中断,会在线程运行至阻塞时中断
  118. new Thread(run).Start(); //新建线程执行函数
  119. //lock(锁定资源)、Interlocked(提供线程安全的递增递减交换和读取值)、Monitor(设置超时,释放锁)、waitHandle(等待信号的出现)
  120. //mutex(多个进程间同步-通过名称)、semaphore(信号量可以由多个线程使用)、event(事件通知)
  121. bool locktaken=false;
  122. Monitor.TryEnter(stringtemp,500,ref locktaken);
  123. if (locktaken){
  124. printf("同步控制块执行");
  125. Monitor.Exit(stringtemp); //释放锁
  126. }
  127. //在threading、timers、forms、web ui、windows.threading中都有timer,设置重复执行的函数
  128. //System.Timers.Timer mytime= new System.Timers.Timer(1000);
  129. //mytime.AutoReset = true;
  130. //mytime.Elapsed+=run; //回调函数参数受到限制的(object sender,system.timers.elapsedeventargs e)
  131. //mytime.Start();
  132. //mytime.Stop();
  133. Showdata datashowfun = new Showdata(printf); //以函数为参数实例化委托,作为回调函数
  134. datashowfun = delegate(string str){Console.WriteLine(str);}; //使用匿名方法实现委托
  135. datashowfun = str=>{Console.WriteLine(str+stringtemp);}; //使用lambda表达式实现委托,lambda表达式可以访问外部变量,这成为闭包。=>左边列出参数,右边复制实现函数
  136. print(datashowfun,"结束"); //委托为参数,调用函数
  137. Console.ReadLine();
  138. }
  139. public static void sprintf(Student student, object[] args) //基类参数允许传递派生类为参数,object[]用于可变参数列表,可以无参调用
  140. {
  141. student.setname("student"); //调用动态绑定的基类函数,修改基类成员
  142. printf(student.getname()); //调用引用动态绑定的派生类重写的函数
  143. }
  144. public static void sprintf(Interface1 interface1) //接口参数允许传递接口类为参数,sprintf函数名相同实现重载
  145. {
  146. if (interface1 is Moniter) //is判断,指向对象的具体判断,不是引用的判断
  147. {
  148. Student student = interface1 as Student; //先向下转型为Moniter,在向上转型为student,as向上转型,在指定派生类对象的基类引用,可以强制转化为派生类引用
  149. printf("接口类型:" + interface1.GetType()); //获取引用指向的对象的类型
  150. student.getname(); //动态调用绑定的方法
  151. }
  152. interface1.init1(); //接口相当于纯抽象类,动态绑定方法
  153. }
  154. public static void printf<T>(T str) //泛型方法,
  155. {
  156. Console.WriteLine(str.ToString());
  157. }
  158. public delegate void Showdata(string str); //delegate定义委托,委托名为函数类型名,而不是函数变量名。这是一个输入为字符串,返回为空的函数引用,
  159. public static void print(Showdata action, string str)
  160. {
  161. action(str);
  162. }
  163. static int num = 0;
  164. public static void run()
  165. {
  166. num++; //自增自减不是线程安全的
  167. Thread.Sleep(1000); //多线程,睡眠,不释放锁,自动回复
  168. //await Task.Delay(10); //await一旦完成立即执行,Task.Delay异步方法,释放线程供其他任务使用,所以此句后面的是新线程
  169. printf(num + stringtemp + DateTime.Now);
  170. }
  171. }
  172. }

[置顶] 一个demo学会c#的更多相关文章

  1. [置顶] 一个demo学会css

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 学习了css权威指南这本书,自己喜欢边学边总结边写demo,所以写了这篇文章,包含了大部分的css编程 ...

  2. 置顶菜单demo

    一朋友需要置顶菜单的功能,给了个网站,让弄下来.看了下,就把样式及效果拔了下来.去掉了复杂的东西,只保留了其基本实现.有需要的朋友可以拿去用用. <style> #navigation{ ...

  3. 一个demo学会js

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  4. [置顶] 一个懦弱的IT人

    对自己近来的学习和工作做一个总结,规划一下未来. 还是从大三暑假说起,稀里糊涂的被拉去参加电子设计大赛,熬过了一段痛苦的时间.原本我是学计算机的,对硬件不太熟悉.不过经过一段时间痛苦的断断续续的学习, ...

  5. [置顶] 一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间

    最近,在开发和优化一个报表型的Web项目,底层是Hibernate和MySQL. 当报表数据量大的时候,一个图表要花4秒以上的时间. 以下是我的分析和体会.  1.我首先需要知道哪些函数执行了多少时间 ...

  6. [置顶] 一个简单好用的zabbix告警信息发送工具

    之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...

  7. 【转】 [置顶] Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

    在Android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...

  8. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  9. [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁

    [置顶]Win2012R2的一个Bug安装群集后可能引发的软件崩溃问题及相应补丁 如标题,笔者查阅资料发现微软声称安装故障转角色后就可能发生上述描述问题,但不止于SSMS崩溃.建议使用win2012R ...

随机推荐

  1. 201521123060《Java程序设计》第1周学习总结

    1. 本章学习总结 认识和了解了Java的发展进程: 了解了相关开发工具: 认识了JVM,JRE,JDK: 2. 书面作业 Q1.为什么java程序可以跨平台运行?执行java程序的步骤是什么?(请用 ...

  2. Java中如何引入结对编程

    引自微信: 很多同学说: 我程序写得好,ACM比赛能得分, 就好了,软件工程讲的那些有用么? 有些学校的 <软件工程>课,由于要求太简单,反而不能说明软件工程的价值. 其实好办, 让学生结 ...

  3. 201521123049 《JAVA程序设计》 第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  4. 201521123115《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...

  5. Junit4学习(一)新建Junit4工程

    一,学习Junit4,学以致用 二,熟悉编写流程 工具:Eclipse,Junit包,hamcrest.core包 1,打开Eclipse开发工具,新建工程:file->Java Project ...

  6. jsp+servlet对于单选按钮和复选框取值并且存放到数据库中

    index.jsp <form action="index.gj?method=toradio" method="post"> <div al ...

  7. linux防火墙简单的使用

    Centos升级到7之后,内置的防火墙已经从iptables变成了firewalld.所以,端口的开启还是要从两种情况来说明的,那就是iptables和firewalld.本文章参考官网教程基础 一. ...

  8. JVM菜鸟进阶高手之路十二(jdk9、JVM方面变化, 蹭热度)

    转载请注明原创出处,谢谢! 经过 4 次跳票,历经曲折的 Java 9 正式版终于发布了!今天看着到处都是jdk9发布了,新特性说明,心想这么好的蹭热度计划能错过嘛,哈哈,所以就发了这篇文章. 目前j ...

  9. Tomcat启动一闪而过

    问题: 在下载tomcat7纯净版之后,配置完环境变量.运行startup.bat,一闪而过tomcat没有启动成功. 解决办法: 设置CLASSPATH.环境变量设置JAVA_HOME为java安装 ...

  10. 15.linux-LCD层次分析(详解)

    如果我们的系统要用GUI(图形界面接口),这时LCD设备驱动程序就应该编写成frambuffer接口,而不是像之前那样只编写操作底层的LCD控制器接口. 什么是frambuffer设备? frambu ...