为什么写这篇?
我想设计一个安卓,iOS或者Web应用的时候,开始做软件的时候一般都会找一个趁手的工具,一般是一门语言,java, objective-c,swift,c#等等。但是这些语言也是有共通的地方的。
很有可能会很想做一个东西,却必须新学一门语言。这篇可能有些纰漏,后面会继续修改。但是这篇是一个雏形。新学一个语言先理解它的变量。
变量
一般想学一个语言,先学变量,变量一般分为两种,值类型和引用类型。Java,C#,Objective-C,python。都有这些东西。入手一个语言先熟悉,这门语言的两种变量,值变量,引用变量。
值类型
值类型是地址里面直接存一个值。这些类型传递的是值和传递地址的类型有很多不同的特性。值类型分配在栈上。装箱的值类型会分配在堆上。值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放。
byte
short
int
long
long long
char
double
float
boolean
。。。。。。。
引用类型
一般想学一个语言,一般都会有一类引用类型。引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被垃圾回收机制释放。
引用类型-结构类型
结构类型,主要是用来组织变量。用来实现常见的数据结构。栈,队列,二叉树,图。。。。等等。
字符串
集合
列表
字典
可变类型
时常我们会遇到一个概念是可变的类型和不可变的类型,这个可变与不可变是对地址来说的。对于不可变的字符串不管多少个拷贝,我们都将引用指向同一个地方就可以,这个问题实际就是编程中写出来的一些bug的源头。
拷贝
深拷贝,浅拷贝,对于可变和不可变类型的意义是不一样的。实际本质是我们是用一个地址指向了同一个地址,还是从新分配了一片内存,重新将值赋给新分配的内存。
引用类型-过程类型
过程类型主要用来调用或者封装调用,将对变量的各种操作封装成函数,函数多了不便于组织将很多函数可以封装成类,类可以单继承,多继承,有类方法,实例方法。需要组织多个类就出现了包,一个包不想让别人知道实现细节变出现了库。函数时常被我们理解成一个调用过程,实际它也存在一个地址只,异步回调的是函数,调用的是函数的地址,函数的指针。接口,委托,函数,类中的函数都可以理解为函数,函数指针。接口和代理是实现函数指针的抽象,类是将函数指针和变量做为一个整体。写程序时常是调用系统的包,类,函数,其实都是这样一个过程,我们要在会用的同时知道原理。
函数
学各种语言写hello world都会调用函数。
类
接口
委托
包
值类型和引用类型的区别
这个总结很常见也很实用,面试百分之90中奖。
值类型
存储方式:存储值
内存分配:分配在栈上
内存回收:用完回收
效率:效率高
转换:装箱才能变成引用类型
引用类型
存储方式:存储地址
内存分配:分配在堆上
内存回收:手动回收和垃圾回收
效率:效率低
转换:引用类型需要拆箱才能变成值类型
内存-作用域-生命周期-垃圾回收
内存
这篇讲的是变量,所有变量怎么跑也跑不出内存。一旦有不理解的问题请向内存追寻。这就是大学学操作系统的原因。内存是怎么分配的就是问题的源泉。
作用域
最近写代码犯过一个教科书式的错误,#define的变量为什么不生效,#define变量的作用域只是当前文件。注意变量的作用域。
垃圾回收
强引用,弱引用,引用环。垃圾回收时机,垃圾回收的方式。也是学习一个语言时要想明白的问题。
网友评论