为什么80%的码农都做不了架构师?>>>
第一、二章:
一、Java开发入门
1. ① 下载压缩包, ② 将解压文件粘贴到新建项目的根, ③ 右键构建路径,添加到新的路径。
2. 加载游戏背景图,参数是图片文件的全名(包含后缀名)。图片放到src的Images包
3. 音乐必须放在src的Sounds文件夹下,只支持mp3格式文件
5. false表示只播放一次,true表示一直重复播放
6. ① 注意各处的大小写, ② 注意数据类型(字符串用双引号[英])
二、变量和数据类型
Ⅰ、变量
1. 程序由指令和数据组成。
2. 变量定义不能“重名”,也就是不能重复“定义”。
3. 在一定范围内,“变量”可以重复使用,但不可以重复定义。
4. 变量指向新的数据只会影响之后指令的执行效果。
5. 保留字:goto、const。(无意义)
Ⅱ、标识符
1. 标识符是用来给类、方法、变量等命名用的。
命名规则:1)由字母、中文(不推荐)、数字、下划线 _、$组成;2)不能以数字开头;3)不能是关键字。
2. 注意:大小写如:demo和Demo
3. 驼峰命名法:每个单词第一个字母大写,例:ageOfBaby
4. 潜规则”:类名:大写开头;变量名、方法名:小写开头。
Ⅲ、变量类型、初始化
1. 定义一个变量的格式:变量类型 变量名=初始值;
2. 局部变量使用前必须赋给初值。声明时赋值或者使用前赋值都可以
3. 整数常量默认是int类型,小数常量默认是double类型。
选用数据类型的时候在考虑到数据的可能范围之后,选择最小范围的类型,这样节省资源。
Ⅳ、类型转换
1. byte b=3;int i=b;//隐式类型转换
其实并没有把这个东西从这种类型"转换"成另一种类型,它只是根据
原来的内容创建一个新东西。
另:byte b = (byte)i;//显式类型转换
2. 不能从 double 转换为 float。小数默认是double
3. int i2 = (int)d1;//显式类型转换,会丢失小数部分
4. 大范围”=“小范围”:隐式转换
“小范围”=“大范围”:显式转换,编译器担保不出事
都是整数参与乘除运算,结果还是整数。整数常量参与乘除计算一般加f声明为小数类型,避免精度损失。
5. int转换为String:Integer.toString(i);String转换为int:Integer.parseInt("33")。显式类型转换仅限整数、小数类
型之内。
总结:① 大范围 =》 小范围 隐式转换 小范围 =》 大范围 显式转换
② 注释:要显示一个 \ ,前面加一个 \ 即可;
要显示两个 \(即 \\) ,前面加两个 \\,而两个分开的 \ (即 \ \) ,须在各个前加 \\ ;
要显示三个以上 \(即 \ \ \ ……),在各个\前面加一个 \ 即可。
Ⅴ、赋值运算符
1. 基本数据类型是复制传递
2. 通过中间变量来交换两个int变量的值。
第三章、游戏引擎
1、网页、Swing、Android、游戏引擎等几乎所有图形环境中,都是以屏幕左上角为原点坐标,x向右为正向,y向下为正向。
像素:图形内容都是由一个个的像素点组成的。
2、imgName为初始显示图片的文件名(必须放在src的Images包下)。也可以调用void createImage(int num)创建一个什么都不显示的图片。
3、比较运算:① 借助中间变量temp; ② 运算法
4、repeat表示是播放一次,还是重复播放。playSpriteAnimate是启动动画之后就结束,不会等动画播完。
5、Dimension getSpriteSize(int spriteNum) 获得精灵的尺寸
6、生成精灵、网址: http://www.spriters-resource.com
剪切工具:SpriteSheets(需要.Net Framework)。
生成的图片必须是png格式的。
7、程序打包:① 把bin和两个jar拷贝到单独的文件夹下;
② 创建一个.bat文件,内容是 start jre\bin\javaw.exe -cp .\bin\ -Djava.ext.dirs=. Main1。Main1代表入口类,如果有报名则要写全名。
③ 压缩一下,发给对方,解压双击“bat”文件即可
第四章、逻辑运算符和if语句
1、苦记优先级表,不如直接用括号区别优先级,提高代码可读性。
2、短路运算:对于&&,一旦遇到左边的为false,那么结果一定是false了
对于||,一旦遇到左边的为true,那么结果一定是true了
因此就不计算右边的表达式了。
另:非运算(!),单目运算,没有短路运算
第五章、if和switch语句
1、if语句若只有一行代码,去掉大括号虽然可行,但不符合代码规范,所以不建议去掉大括号
2、switch只能进行离散值的判断,不能进行范围的判断;switch只能进行常量的比较,不能进行变量的比较
3、else可以不用最后的else,建议加上,更加严谨
4、如果匹配了上面的一个条件,那么即使复合下面的else if条件,else if也不会执行“先来后到”
5、三元运算符能够实现的,基本if都能实现;if能实现的,三元运算符不见得能够实现。所以基本是“简单的判断然后根据判断的boolean结果进行简单的赋值”才使用三元运算符
6、表达式可以是byte、short、int、char类型。(*)JDK5以后还可以是枚举类型,JDK7以后还可以是String类型。
7、break意味着switch的结束。default相当于if的else,当所有case都不匹配的时候,执行default
8、多个switch条件合并的问题:当多个case条件的代码一样的情况下,可以合并,最后加一个break;
9、① case语句不能是判断条件表达式,也不能是变量,必须得是常量
② 不能有重复的case常量,但if可以有
③ 每条case语句后必须有一个break,但default后的可以省略
第六章、for循环
1、for(初始化;是否继续循环判断;一次循环后执行的) 这三部分都可以省略,第一部分省略就没有初始化,第二部分省略则默认为true,第三部分则执行后不执行什么。
2、循环嵌套层数可以更多,但是建议不要超过两层。
3、break和continue可以用到for、while、do while这些循环语句中。区别是break是终止整个循环,continue是终止当次循环
4、空格弹跳:这种“一次性触发”的动作最好用后面的“事件驱动”,否则实现起来很麻烦,getPressedKeyCode()只适合于“连续动作”
5、 注意变量的范围(全局还是局部),不同范围起的作用不同,甚至易引起错误。
第七章、while、数组
1、对于int、double、float等数组,没有赋值的元素被初始化为0;对于String、Integer等引用类型初始化为null。
2、不能动态增加数组的大小,要用LinkedList、ArrayList等来增加
第八、九、十
Ⅰ、二维数组:
① 可以为不定长数组
② 交换数组元素:第i个和第length-i-1个交换
Ⅱ、方法:
1、方法就是一堆可以复用的代码段。方法执行过程中无法确定的数据以参数形式传递过来;方法的执行结果以返回值进行返回。
2、方法的声明时参数的名字和调用时候变量名字没有关系,调用的时候甚至可以不传变量
3、方法中的局部变量不能被调用的方法访问,如果真要访问只能通过参数传值,并且只是相当于变量赋值,方法内部对参数的赋值不会影响调用者。
Ⅲ、重载(OverLoad):① 在同一个类中,允许存在一个以上的同名方法,只要其参数个数或者参数类型不同即可。返回值是否一样无关和参数名是否一样无关。
② 方法重载可以实现“方法参数默认值的效果”
③ 可变参数前面还可以有其他参数,只要保证可变参数是最后一个就可以(只能有一个可变长度参数)
第十一章、面向对象基础
1、面向对象不是替代面向过程的,宏观是面向对象,微观仍然是面向过程
2、一个java文件中只能定义一个public的class,且文件名一般和public类一样。
3、new出的每个对象都是一个单独的实例,两个对象之间的成员变量是独立的两份。
4、局部变量必须初始化,成员变量声明时默认初始化,基本数值类型默认初始值为0、false,String等非基本类型初始化为null。
5、当成员变量和局部变量(函数参数也可以看做局部变量)重名的时候,被看做局部变量,因此为了避免混乱,建议访问类成员变量的时候加上“this.”, 在类内部this代表当前对象。this.也可以调用当前类的成员方法。
6、栈内存(成员变量):自动释放
堆内存(局部变量):不会自动释放(System.gc回收)
7、new Person().sayHello();创建一个匿名对象,然后调用。
8、public成员可以被类内部或者外部访问,private成员只能被类内部访问(通过set、get方法访问)。这样可以保护不希望外接调用的内部成员(Member,包含字段Field/变量、方法)不被外界访问。封装数据、暴露行为。
9、构造函数是创建类对象,并且在创建完成前对类进行初始化的特殊函数。如果定义类时没有声明构造函数,默认会给出一个无参构造函数,如果定义了任意一个构造函数,将不会提供默认的无参构造函数。
10、① 方法名必须和类名一致 ② 没有返回值类型
11、JavaBean的规则:
1)必须有无参构造函数;
2)字段不能是public;
3)类的字段必须通过get和set 方法来访问。 set***、get***。只有get没有set则是“只读”
4) boolean类型属性名避免使用 “is” 开头的名称
12、包(package):① 通过package定义在页面最顶部; 避免类名重复的问题。
② 在磁盘上的保存路径和package一致,可以单级、可以多级。
③ 包名小写
④ “公司域名反着写.产品名.模块名”:com.rupeng.crm.user、com.sun.media.sound
13、静态static:
① static变量不需要new就可以直接通过类名调用。static变量是共享一块儿内存空间,非static变量则是各对象隔离的。
② static 方法中无法使用this关键字,因为static独立于对象存在,不是任何人的唯一。
③ static成员中只能访问static成员,不能直接访问非static成员。非static成员可以访问static成员。
④ 静态成员只会初始化一次。
14、单例模式:
① 类在系统中只能有一个对象
② 构造函数声明为private,这样避免外界访问
第十二章、面向对象深入
1、枚举:限定一个数据的可选值范围,比如“方向”。
2、枚举的原理:构造函数设置为private,把几个对象设置为public static fina实例。
3、类的静态代码块:静态代码块在类第一次被使用的时候执行一次,在构造函数执行之前执行。只要一旦开始“接触一个类”,静态成员、static代码块就会被执行。
4、继承(inherit):① Java中一个类可以“继承”自其他类。
② 子类会从父类继承所有非private成员。子类还可以有子类。
③ Java中一个类只能有一个父类(单继承),如果没指定父类,则Java内置的Object为父类。
5、继承中的构造函数调用顺序:① 子类的构造方法默认都去访问了父类的无参构造方法:在子类中的构造方法中都有一行默认语句:super()
② 先执行父类的构造函数把父类初始化完成,再初始化子类的。
③ 可以通过super(参数)去访问父类中的有参构造函数。可以通过this(参数...)去访问本类中的其他构造函数。
④ 如果父类没有无参构造函数,那么子类必须显式调用父类的其他的构造函数。
6、public/private/protected:
① private成员无法被子类访问,子类只能通过父类的非private方法“间接”访问父类的private成员。这样保证了父类private成员的安全性。
② 继承是“模子”的集成,数据不会继承。
③ protected成员只能被自己以及子类(直接或者间接)以及兄弟(同package包中)访问,无法被“外姓人”访问。
另:default(什么都不写):同一个package包中可以访问。
第十三章、多态
1、多态:父类和子类中的方法的参数个数和类型都相同,只是实现体不同,父类(基类)类型变量指向子类类型对象,并调用子类类型对象的方法进行实现的现象。
另:① 父类类型的变量可以指向子类的对象,但子类类型的变量不可以指向父类。
② 可以调用哪些方法由变量的类型决定
2、类型转换:
()类型转换可以把“以父类类型角度观察的对象的实例”重新以“子类类型角度观察”。(显式类型转换/强制类型转换)如:Chinese zgr5 = (Chinese)dqr1;(dqr1是父类类型)
3在父类方法中调用虚方法,指向的是子类对象,执行的也是子类对象的方法
4、如果父类中的某些方法不希望被子类Override,比如kill,那么标记为final即可。
好处:① 安全,可以保证父类定义的行为的执行(必须“被杀死”);
② 效率高,避免了查询虚方法表(*)。
另:如果某些类不希望被继承,类也可以声明为final。
final 类的好处主要是安全。String类就是final
5抽象类:Ⅰ、① 抽象方法没有方法体;② 一旦类中定义了抽象方法,类必须被修饰为抽象;
③ 抽象类无法实例化(new)。
Ⅱ、抽象类的抽象方法主要用来限制子类“必须实现这些抽象方法”;子类也可以不实现,那么子类也要是抽象类,由子类的子类……去实现。
6、调试:如果修改了类结构、加了方法、改了方法、改了签名等就要重启
第十四章、游戏引擎封装
1、虚方法定义“能干什么”,子类中的方法定义具体“干什么”。
2、public GameText(){this("");//调用重载的构造函数}
3、GameText[] txts = new GameText[words.length];//只是new了一个大小为5的txts数组,并没有元素,元素需要另外赋值
4、for(GameText text:txts){text.moveLeft();}//增强for循环
5、增强for循环只适用于读取(使用),不能赋值
6、数组的每个元素的默认值,int=0,boolean=false,String =null, 类数组的每个元素的默认值都是null
第十五章、匿名类和接口
1、匿名类格式:new 类名() { };//类体
这样就是相当于声明了一个这类的子类,然后并且创建这个类的对象。注意:不是创建这个父类的对象。
2、System.out.println(d2.getClass());//d2指向的对象是Test1$1 (编译器自动生成的)类型
3、类中this指的是匿名内部类,如果要想指外部的对象,要用“类名.this”
4、接口:Ⅰ、① 是一种用来声明“能力”的类型,不提供具体实现
② 不提供实现方法,连{}都不能有。
③ 接口无法实例化,只能被类“实现”(implements)
Ⅱ、① 既可以使用接口类型变量又可以使用类类型变量调用speak
② 接口的意义是定义“做什么”,类定义“怎么做”
③ 接口中只能声明static 成员变量,不能声明普通成员变量。因为static 可以被外界用,一个没有实现代码的接口中声明普通成员变量没意义。而且必须要是public。
Ⅲ、① 接口中可以定义多个方法,也可以不定义任何方法(* 标识接口)。
② 接口只是“能力”不是“实现”,因此不能也必要定义构造函数。
③ 类只能有一个父类,类可以实现多个接口。
④ 接口可以继承其他接口:extends。 接口也有多态、类型转换。
Ⅳ、不能给values参数传递int[],但是可以传递Integer[]
第十六章、补充知识
1、java中==就是用来比较是否指向同一个对象,如果要进行内容的比较,则需要提供equals方法或者实现Comparable接口。
2、char其实也是一个数字
3、java字符串比较方法:
使用String.compareTo方法:
compareTo()的返回值是int,它是先比较对应字符的大小(ASC||码顺序)
①、如果字符串相等返回值0
②、如果第一个字符和参数的第一个字符不等,结束比较,返回它们之间的差值(ASC||码值) //第一个字符出结果了就不较后面的了
(负值前字符串的值小于后字符串,正值前字符串大于后字符串)
③、 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,
依次类推。
④、如果比较完一个,另一个字符串还剩一点,则返回this.length()-anotherString.length()
4、在内存中创建一个字符串对象,内容是“abc”,把s1指向这个字符串对象
发现已经有了一个“abc”字符串对象了,因此把s2直接指向之前的“abc”