复习: 进程 / 线程 / 并行 / 并发 同步 / 异步 / 非阻塞 / DMA 理解单线程在此之前,我们的代码都是运行在一个线程中,这被称之为“单线程编程”。这个线程又被称为主(primary)线程,或者启动线程。(我们默认使用的)更具体的说,代码运行在线程的栈(stack)中(复习):一个线程对应着一个栈,这个栈又被称之为线程栈。单个线程中,Java和C#代码都是同步(依次)运行的。PS:为什么强调Java和C#,因为JavaScript是单线程都可以异步的,^_^创建新线程Java和C#运行开 ……
发送EmailEmail并不能在用户之间直接传递,而是依赖于邮件的:发送服务器(如下图:smtp.163.com)接收服务器(如下图:pop.qq.com)发送方(sender)将email推送给邮件发送服务器。这一过程可以由用户登录邮箱网站完成,或使用其他邮箱软件(如outlook)推送163.com按邮件收件人地址将email推送到qq.com服务器收件方(receiver)从服务器拉取自己的email上述3个过程,1和2都是推送,使用SMTP(Simple Mail Transfer Protoco ……
集合概览集合是同一类型元素的组合,本身也是一个类/对象,就像一个容器一样,(可以)装着它的元素。PS:早期的集合元素类型都是Object,但现在我们都使用泛型。(@想一想@:为什么?)数组就是一种集合。除此以外,Java和C#还内置了:存储单个元素的:Collecition,根据其内部元素排列方式(数据结构),又分为:有序的、可以根据下标找到元素的:List(类似于数组,但比数组更强大)无序的、没有下标的、但元素不重复的Set队列Queue存储键值对的:Map/Dictionary。成绩单就是典型的键值 ……
字符串(String/string)是非常特别的,值得单独一讲。首先我们要知道,它是由class定义的引用类型。(演示转到定义&复习:值类型和引用类型) 但是,字符串的一系列行为表现得就像值类型一样!比较String可以使用比较运算符==也设计得和值类型一样。一般来说,如果是引用类型,==运算符会比较两个对象的堆地址;但值类型,==运算符直接比较两个对象的值。我们看看string的比较:string center = "源栈", greet = "欢迎您";string a = center + ……
什么是反射?Reflection的直译。角度一:镜子一个对象,照照镜子:我是谁?(从哪儿来?要到哪儿去?^_^) 程序自己 在 运行时(不是:程序员在读/写代码时),得到自己的:类型信息:类名类的成员信息:字段、构造函数、方法类的外部环境信息:程序集(C#中的.dll)或包(Java中的.jar)信息static void grow(Person person) {//告诉我person是啥?Student,还是TeacherSystem.out.println(person.getClass().get ……
复习:面向函数:函数做变量 / 回调 / 委托 / Lamda / 箭头函数…… lambda的类型JavaScript可以将箭头函数赋值给任意一个变量,Java/C#呢?Java:利用(只定义了一个方法的)接口C#:利用委托作用都是一样的:“固化”函数/方法的参数和返回。换言之,具有相同参数和返回值的方法就是同一类型的lamda。基于上述设定,如果再引入泛型,lamda的类型其实就是由:有无返回值参数个数决定。所以,Java和C#都内置了一些lamda类型:C#:Func和ActionJava:Supp ……
更彻底的抽象(abstract) interface ISort{/// 可以有属性,get和set仅作为“只读/只写”的标识int[] Array { get; set; }/// 不需要访问修饰符,因为只能是public的/// 可以有方法,不能有实现int[] Ascend();int[] Descend();}实现(implement):演示 接口的继承:演示 为什么需要接口?从概念上讲,接口更加的“纯粹”。从实用的角度:struct的“继承”只能使用接口(演示:DateTime)实现“多”继承 ……
复习:异常:概念明晰 / throw / try...catch / finally / 性能 异常类型万物皆对象。Java/C#需要将异常信息封装成对象,并内置了很多很多的Exception类。Java中的RuntimeExcepition和C#中的Exception类似,最主要的成员包括:Message:异常消息,属性,可以使用构造函数传入;} catch (RuntimeException e) {System.out.println(e.getMessage());throw new Runti ……
重载(overload) 引入:两个数相加,三个数相加,四个数相加……可以使用同一个方法名,配以不同的参数“组合”(个数/类型/次序/传递方式ref)。但注意:仅是参数名不同仅是返回值不同不能认为是方法的重载。static void grow(){}//static int grow(){return -1;} //不能通过返回类型区分static void grow(int age){}static void grow(string name){}//static void grow(s ……