Java语言基础、学习笔记

  • 来源:新网
  • 更新日期:2018-03-20

摘要:第一、二章:   一、Java开发入门 1. ①  下载压缩包,    ②  将解压文件粘贴到新建项目的根,  ③  右键构建路径,添加到新的路径。 2. 加载游戏背景图,参数是图片文件的全名(包含后缀名)。图片放到src的Images包 3. 音乐必须放在src的Sounds文件夹下,只支持mp3格式文件 5. false表示只播放一次,true表示一直重复播放 6. ①  注意各

第一、二章:

一、Java开发入门

1. ① 下载压缩包, ② 将解压文件粘贴到新建项目的根, ③ 右键构建路径,添加到新的路径。

t01b0166bb12a06c549.png

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 jrebinjavaw.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”