Java学习笔记--来自Java核心卷和尚学堂视频
Java常见点解析
起步之注意点
- Java对大小写敏感,关键字public被称为访问修饰符
- 关键字class 的意思是类。Java是面向对象的语言,所有代码必须位于类里面。
- 一个源文件中至多只能声明一个public的类,其它类的个数不限,如果源文件中包含一个public 类,源文件名必须和其中定义的public的类名相同,且以“.java”为扩展名。
- 一个源文件可以包含多个类class。
- 正确编译后的源文件,会得到相应的字节码文件,编译器为每个类生成独立的字节码文件,且将字节码文件自动命名为类的名字且以“.class”为扩展名。
- main方法是Java应用程序的入口方法,它有固定的书写格式:
- public static void main(String[] args) {…}
- 在Java中,用花括号划分程序的各个部分,任何方法的代码都必须以“{”开始,以“}”结束, 由于编译器忽略空格,所以花括号风格不受限制。Java中每个语句必须以分号结束,回车不是语句的结束标志,所以一个语句可以跨多行。
- 编程时,一定要注意缩进规范;
- 在写括号、引号时,一定是成对编写,然后再往里插入内容。
用一个简单的台球游戏进行示例, 桌球在球桌中按照一定线路和角度移动,遇到边框会自动弹回。运行的结果图如下:
package com.zrq.first;
import java.awt.*;
import javax.swing.*;
public class BallGame extends JFrame {
//导入小球图片
Image ball = Toolkit.getDefaultToolkit().getImage("image/ball.png");
//导入桌子图片
Image desk = Toolkit.getDefaultToolkit().getImage("image/desk.jpg");
double x = 100;
double y = 100;
boolean right = true;
double degree = 3.14 / 3;//弧度
@Override
public void paint(Graphics g) {
System.out.println("111");
g.drawImage(desk, 0, 0, null);
g.drawImage(ball, (int) x, (int) y, null);
x = x + 10 * Math.cos(degree);
y = y + 10 * Math.sin(degree);
//碰到上下,注意减去边框的宽度
if (y > 500 - 40 - 30 || y < 40 + 40) {
degree = -degree;
}
if (x < 40 || x > 856 - 40 -30) {
degree = 3.14 - degree;
}
/*
if (right) {
x = x + 10;
} else {
x = x - 10;
}
if (x > 856-40-30) {
right = false;
}
if (x < 40) {
right = true;
}
*/
}
void launchFrame() {
setSize(856, 500);
setLocation(50, 50);
setVisible(true);
//重画
while (true) {
repaint();
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
BallGame game = new BallGame();
game.launchFrame();
}
}
数据类型和运算符
注释
- 单行注释: 使用“//”开头,“//”后面的单行内容均为注释。
- 多行注释: 以“/”开头以“/”结尾,在“/”和“/”之间的内容为注释,我们也可以使用多行注释作为行内注释。但是在使用时要注意,多行注释不能嵌套使用。
- 文档注释: 以“/**”开头以“*/”结尾,注释中包含一些说明性的文字及一些JavaDoc标签(后期写项目时,可以生成项目的API)
标识符
标识符是用来给变量、类、方法以及包进行命名的
- 标识符必须以字母、下划线_、美元符号$开头。
- 标识符其它部分可以是字母、下划线“_”、美元符“$”和数字的任意组合。
- Java 标识符大小写敏感,且长度无限制。
- 标识符不可以是Java的关键字。
标识符的使用规范
- 表示类名的标识符:每个单词的首字母大写,如Man, GoodMan
- 表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”(常用此种)
【注意】不要用汉字,不符合标准
关键字/保留字
emmm....这个本人觉得用到看看就好吧
abstract | assert | boolean | break | byte | case |
catch | char | class | const | continue | default |
do | double | else | extends | final | finally |
float | for | goto(不要用) | if | implements | import |
instanceof | int | interface | long | native | new |
null | package | private | protected | public | return |
short | static | strictfp | super | switch | synchronized |
this | throw | throws | transient | try | void |
volatile | while |
变量的本质与分类(有C语言基础可跳过)
变量本质上就是代表一个”可操作的存储空间”,空间位置是确定的,但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”,从而操纵这个“存储空间”存储的值。
Java身为强类型语言,必须要声明作用域。
从整体上可将变量划分为局部变量、成员变量(也称为实例变量)和静态变量。
局部变量、成员变量、静态变量的区别如下:
类型 | 声明位置 | 从属于 | 生命周期 |
---|---|---|---|
局部变量 | 方法或语句块内部 | 方法/语句块 | 从声明位置开始,直到方法或语句块执行完毕,局部变量消失,使用前需要声明 |
成员变量(实例变量) | 类内部,方法外部 | 对象 | 对象创建,成员变量也跟着创建。对象消失,成员变量也跟着消失;成员变量会自动初始化 |
静态变量(类变量) | 类内部,static修饰 | 类 | 类被加载,静态变量就有效;类被卸载,静态变量消失。 |
常量(与C语言略微不同)
注意与c中的区别,const变为final
变量和常量命名规范(规范是程序员的基本准则,不规范会直接损害你的个人形象):
- 所有变量、方法、类名:见名知意
- 类成员变量:首字母小写和驼峰原则: monthSalary
- 局部变量:首字母小写和驼峰原则
- 常量:大写字母和下划线:MAX_VALUE
- 类名:首字母大写和驼峰原则: Man, GoodMan
- 方法名:首字母小写和驼峰原则: run(), runRun()
基本数据类型(C语言上面增加)
整形
类型 | 占用存储空间 | 表数范围 |
---|---|---|
byte | 1字节 | -27 ~ 27-1(-128~127) |
short | 2字节 | -215 ~ 215-1(-32768~32767) |
int | 4字节 | -231 ~ 231-1 (-2147483648~2147483647)约21亿 |
long | 8字节 | -263 ~ 263-1 |
浮点型
类型 | 占用存储空间 | 表数范围 |
---|---|---|
float | 4字节 | -3.403E38~3.403E38(科学计数法) |
double | 8字节 | -1.798E308~1.798E308(科学计数法) |
float类型赋值时需要添加后缀F/f,浮点数不精确,一定不要用于比较,如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal或BigInteger类。
字符型
字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
在字符型中,会涉及到转义字符,常见的如下:
转义符 | 含义 | Unicode****值 |
---|---|---|
\b | 退格(backspace) | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
\t | 制表符(tab) | \u0009 |
\“ | 双引号 | \u0022 |
\' | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
String本身就是字符列
boolbean类型
boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
运算符
整形运算
- 如果两个操作数有一个为Long, 则结果也为long。
- 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
- 如果两个操作数有一个为double,则结果为double。
- 只有两个操作数都是float,则结果才为float。
赋值运算符与拓展运算符
运算符 | 用法举例 | 等效的表达式 |
---|---|---|
+= | a += b | a = a+b |
-= | a -= b | a = a-b |
*= | a *= b | a = a*b |
/= | a *= b | a = a/b |
%= | a *= b | a = a%b |
关系运算符
运算符 | 含义 | 示例 |
---|---|---|
== | 等于 | a==b |
!= | 不等于 | a!=b |
> | 大于 | a>b |
< | 小于 | a<b |
>= | 大于或等于 | a>=b |
<= | 小于或等于 | a<=b |
逻辑运算符
运算符 | 说明 | |
---|---|---|
逻辑与 | &( 与) | 两个操作数为true,结果才是true,否则是false |
逻辑或 | |(或) | 两个操作数有一个是true,结果就是true |
短路与 | &&( 与) | 只要有一个为false,则直接返回false |
短路或 | ||(或) | 只要有一个为true, 则直接返回true |
逻辑非 | !(非) | 取反:!false为true,!true为false |
逻辑异或 | ^(异或) | 相同为false,不同为true |
位运算符
位运算符 | 说明 |
---|---|
~ | 取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
<< | 左移运算符,左移1位相当于乘2 |
>> | 右移运算符,右移1位相当于除2取商 |
字符串连接符
“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
条件运算符
常见的语法为
x ? y : z
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
表达式优先级
优先级 | 运算符 | 类 | 结合性 |
---|---|---|---|
1 | () | 括号运算符 | 由左至右 |
2 | !、+(正号)、-(负号) | 一元运算符 | 由左至右 |
2 | ~ | 位逻辑运算符 | 由右至左 |
2 | ++、-- | 递增与递减运算符 | 由右至左 |
3 | *、/、% | 算术运算符 | 由左至右 |
4 | +、- | 算术运算符 | 由左至右 |
5 | <<、>> | 位左移、右移运算符 | 由左至右 |
6 | >、>=、<、<= | 关系运算符 | 由左至右 |
7 | ==、!= | 关系运算符 | 由左至右 |
8 | & | 位运算符、逻辑运算符 | 由左至右 |
9 | ^ | 位运算符、逻辑运算符 | 由左至右 |
10 | | | 位运算符、逻辑运算符 | 由左至右 |
11 | && | 逻辑运算符 | 由左至右 |
12 | || | 逻辑运算符 | 由左至右 |
13 | ? : | 条件运算符 | 由右至左 |
14 | =、+=、-=、*=、/=、%= | 赋值运算符、扩展运算符 | 由右至左 |
注意,若不是考试,不用刻意记忆,每一层加上括号就好
自动类型转换
自动类型转换指的是容量小的数据类型可以自动转换为容量大的数据类型。如图所示,黑色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
强制类型转换
强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
语法格式:
(type)var//运算符“()”中的type表示将值var想要转换成的目标数据类型。
操作比较大的数时,要留意是否溢出,尤其是整数操作时。
控制语句
1.从结构化程序设计角度出发,程序有三种结构:顺序结构、选择结构和循环结构
2.选择结构
(1)if单选择结构 if-else双选择结构 if-else if-else多选择结构
(2)switch多选择结构
3.多选择结构与switch的关系:当布尔表达式是等值判断的情况,可使用多重选择结构或switch结构,如果布尔表达式区间判断的情况,则只能使用多重选择结构
(1) 循环结构
(2)当型:while与for
(3)直到型:do-while
4.while与do-while的区别,在布尔表达式的值为false时while的循环体一次也不执行,而do-while至少执行一次
5.break可以在switch与循环结构中使用,而continue只能在循环结构中使用
6.方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数
7.方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法
8.任何能用递归解决的问题也能使用迭代解决。在要求高性能的情况下尽量避免使用递归,递归调用既花时间又耗内存。