java应用程序的运行机制
源文件(java)通过java编译器 到字节码文件(class) 然后在虚拟中运行(类装载器,字节码校验器,解释器)
一些包含关系(从上到下依次包含)
- JVM(Java Virtual Machine)
- JRE(Java Runtime Environment)
- JDK(Java Development Kit)
一些注意的点
- 一个源文件中至多只能声明一个public类,其他类个数不限,并且文件名必须和其中定义的public类名相同
java基础语法注意点:
-
标识符必须以字母、下划线_、美元符号
”和数字的任意组合。Java 标识符大小写敏感,且长度无限制。标识符不可以是Java的关键字。
-
表示类名的标识符:每个单词的首字母大写,如Man, GoodMan表示方法和变量的标识符:第一个单词小写,从第二个单词开始首字母大写,我们称之为“驼峰原则”,如eat(), eatFood()
-
局部变量: 方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用。
-
成员变量:方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化成该类型的默认初始值。
- 实例变量的默认初始值
| 数据类型 | 初始值 |
|---|---|
| int | 0 |
| double | 0.0 |
| char | '\u0000' |
| boolean | false |
-
静态变量:使用static定义。 从属于类,生命周期伴随类始终,从类加载到卸载。 (注:讲完内存分析后我们再深入!先放一放这个概念!)如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值
-
基本数据类型
[图片上传失败...(image-92352e-1578107661148)]
-
Java 语言整型常量的四种表示形式
十进制整数,如:99, -500, 0
八进制整数,要求以 0 开头,如:015
十六进制数,要求 0x 或 0X 开头,如:0x15
二进制数,要求0b或0B开头,如:0b01110011
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ 。 -
浮点类型 :
十进制数形式,例如:3.14 314.0 0.314
科学记数法形式,如314e2 314E2 314E-2 (3.14)
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型。 -
浮点数是不精确的,一定不能用于比较
-
同样,这里涉及到引用数据类型和基本数据类型的比较问题:
引用数据类型:类、接口类型、数组类型、枚举类型、注解类型。
基本数据类型比较的话直接'==',直接比较的是地址,而引用数据类型需要使用.equals()方法进行值的比较 -
转义字符
| 转义符 | 含义 | Unicode值 |
|---|---|---|
| \b | 退格 | \u0008 |
| \n | 换行 | \u000a |
| \r | 回车 | \u000d |
| \t | 制表符 | \u0009 |
| " | 双引号 | \u0022 |
| ' | 单引号 | \u0027 |
| |反斜杠 | \u005c |
- 小问题
这里记录一下我一直搞错的一个小知识点
public static void main(String[] args) {
boolean man = false;
if(man = false){//这里判断的逻辑是false先赋值给man,然后在对man的值进行判断(以前我一直以为是判断的是false赋值成功没,赋值成功的话就执行接下来的语句)
System.out.println("男性");
}
}
- 二元运算符的运算规则:
整数运算:
1. 如果两个操作数有一个为Long, 则结果也为long。
2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。
浮点运算:
3. 如果两个操作数有一个为double,则结果为double。
4. 只有两个操作数都是float,则结果才为float。
-
取模运算:
其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同 -
异或:相同为false ,不同为true
-
&与&& 的区别:
&两边都执行;&&如果一边符合条件另一边不执行 -
刚学到一个3取反码之后为-4 遇到这个问题第一反应就是学过,但是具体原理已经遗忘的差不多了,于是查了下是这样的:
1.数值在内存中一补码形式表示
2.正数的原码、反码、补码形式上都是相同的;因此,3(unsigned char)的原码、反码、补码为以下:
00000011 (原码)
00000011 (反码)
00000011(补码,内存中的存在形式)
- 如何求一个负数的补码:将该数的绝对值的二进制形式,按位取反再加1。以-4为例:
(1)4的原码:00000100
(2)取反:111111011
(3)再加1:11111100 (得-4的补码,-4在内存中的存在形式) - 对3取反码~3,即是对内存中的3(00000011)取反为11111100,即是-4在内存中的表现形式,输出来即为-4.
(一些基础性的知识还有有必要了解的)
-
int b = 3<<2; //相当于:322
-
一个要注意的运算符优先级问题:逻辑与、逻辑或、逻辑非的优先级一定要熟悉!(逻辑非>逻辑与>逻辑或)。如:a||b&&c的运算结果是:a||(b&&c),而不是(a||b)&&c
-
switch的一个简单用法:
int rand = (int) (26 * Math.random());
char c2 = (char) (c + rand);
System.out.print(c2 + ": ");
switch (c2) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
System.out.println("元音");
break;
case 'y':
case 'w':
System.out.println("半元音");
break;
default:
System.out.println("辅音");
- 带标签的continue和break
public class Test18 {//控制嵌套循环跳转(打印101-150之间所有的质数)
public static void main(String args[]) {
outer: for (int i = 101; i < 150; i++) {
for (int j = 2; j < i / 2; j++) {
if (i % j == 0){
continue outer;
}
}
System.out.print(i + " ");
}
}
}
-
待解决的一个难点:
通过移位运算来解决进制转化问题 -
导包的一个小技巧
import static java.lang.Math.*;//导入Math类的所有静态属性
import static java.lang.Math.PI;//导入Math类的PI属性
- 匿名内部类
new 父类构造器(实参类表) \实现接口 () {
//匿名内部类类体!
}
-
局部内部类:定义在方法内部
-
foreach循环 : 用于读取数组或集合元素的值,不能修改











网友评论