《Java编程思想》前4章的粗略总结
万物皆对象:
Java是一种面向对象的编程语言,其中所有的数据和代码都被看作是对象。对象是类的实例,它们包含数据(属性)和行为(方法)。这种面向对象的思想使得编程更模块化、可维护和可扩展。
每个对象都有一个接口:
对象之间的通信是通过调用方法来实现的。每个对象都有一个接口,即一组可以调用的方法。对象的接口定义了与外界的交互方式,其他对象通过调用这些方法来与对象进行通信。
程序是一组对象的集合,通过消息传递来告知彼此该做什么:
程序是由多个对象组成的,这些对象通过相互发送消息来协同工作。消息传递是通过调用对象的方法实现的。这种方式使得程序结构清晰,易于理解和维护。
每个对象都有自己的存储空间,可以容纳其他对象:
对象可以包含其他对象,形成复杂的数据结构。这种组合的方式允许创建更复杂、有层次结构的数据模型。对象的属性可以是其他对象的引用,从而构建起更大的系统。
每个对象都属于某个类的实例:
类是对象的模板,描述了对象的属性和行为。通过类,可以创建多个相似的对象。类定义了对象的共同特征,对象是类的实例。
一个程序就是一组类的集合,这些类通过创建对象之间的联系,以执行某种任务:
程序是由多个类组成的,这些类通过创建对象并协同工作来完成特定的任务。每个类负责一部分功能,通过对象之间的协作实现程序的目标。
在Java中,基本数据类型和对象是有区别的。基本数据类型是直接存储值的,而对象则通过引用来操作。即使是基本数据类型,当它们被封装为对象时,也是通过引用进行操作。
在Java中,所有的对象都必须经过显式的创建过程,这与一些其他语言不同,其中一些对象可以由运行时系统自动创建。
对象在内存中的存储通常分为两个部分:对象的方法区(存储代码)和堆区(存储对象的实例变量)。对象的引用存储在栈上。
栈(Stack)
每个线程都有自己的栈,栈中存储基本数据类型的变量和对象的引用。栈的大小是有限的,而且在方法调用时会动态地分配和释放栈帧。
作用:栈用于存储线程执行方法时的局部变量和方法调用信息。每个线程都有自己的栈,栈的大小是固定的。
存储内容:基本数据类型的变量和对象的引用。
生命周期:栈中的变量的生命周期与方法的调用周期一致。当方法调用结束时,栈帧就会被弹出,栈中的局部变量也随之销毁。
堆(Heap)
所有线程共享的内存区域,用于存储通过new关键字创建的对象。堆的大小通常比栈大得多,对象在堆上分配,并且其生命周期不受方法调用的影响。
作用:堆用于存储对象的实例,即通过new关键字创建的对象。堆是所有线程共享的一块内存区域。
存储内容:实例变量(对象的属性)和对象的方法。
生命周期:对象的生命周期不受方法的调用周期限制。在堆上创建的对象会一直存在,直到没有任何引用指向它时,垃圾回收器将其回收。
Java的垃圾回收器会负责自动释放不再使用的对象。程序员不需要手动销毁对象,这有助于避免内存泄漏和提高代码的安全性。
Java提供了基本数据类型,如int、float等,它们是直接存储值的,而不是通过引用来操作。这些基本类型在一些特殊情况下更高效。
加、减、乘、除和取余:Java提供了基本的算术操作符,用于执行加法、减法、乘法、除法和取余运算。
int x = 5;
int y = 3;
int sum = x + y; // 加法
int difference = x - y; // 减法
int product = x * y; // 乘法
int quotient = x / y; // 除法
int remainder = x % y; // 取余
自增和自减:++和–操作符用于增加或减少变量的值。但是++i和i++是有区别的,具体看下面:
前缀形式(++i 和 --i):
在前缀形式中,变量先发生自增或自减,然后再参与表达式的计算。
int x = 5;
int y = ++x;
System.out.println("x: " + x); // 输出:6
System.out.println("y: " + y); // 输出:6
在这个例子中,x先发生自增,然后将自增后的值赋给y,因此x和y的值都变成了6。
后缀形式(i++ 和 i–):
在后缀形式中,变量的值首先被使用,然后再发生自增或自减。
int a = 5;
int b = a++;
System.out.println("a: " + a); // 输出:6
System.out.println("b: " + b); // 输出:5
在这个例子中,a的值首先被赋给b,然后a发生自增。因此,a的值变成了6,而b的值仍然是5。
比较运算符:用于比较两个值的关系,返回布尔结果。
int a = 5;
int b = 7;
boolean isEqual = (a == b); // 相等
boolean isNotEqual = (a != b); // 不相等
boolean greaterThan = (a > b); // 大于
boolean lessThan = (a < b); // 小于
boolean greaterOrEqual = (a >= b); // 大于等于
boolean lessOrEqual = (a <= b); // 小于等于
逻辑运算符:用于对布尔值进行操作,包括逻辑与、逻辑或和逻辑非。
boolean x = true;
boolean y = false;
boolean andResult = x && y; // 逻辑与
boolean orResult = x || y; // 逻辑或
boolean notResult = !x; // 逻辑非
位运算符:对二进制位进行操作,包括按位与、按位或、按位异或等。
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
int andResult = a & b; // 按位与,结果:0001
int orResult = a | b; // 按位或,结果:0111
int xorResult = a ^ b; // 按位异或,结果:0110
int notResult = ~a; // 按位取反,结果:11111010
左移和右移:用于将二进制位向左或向右移动指定的位数。
int num = 8; // 二进制:1000
int leftShiftResult = num << 2; // 左移两位,结果:0010000
int rightShiftResult = num >> 1; // 右移一位,结果:0000100
instanceof:用于检查对象是否属于特定类或接口的实例。
Object obj = new String("Hello");
if (obj instanceof String) {
System.out.println("obj is an instance of String");
} else {
System.out.println("obj is not an instance of String");
}
三元运算符:用于根据条件选择两个值中的一个。
int a = 5;
int b = 7;
int min = (a < b) ? a : b; // 如果 a 小于 b,min 等于 a,否则等于 b
if语句:根据条件的真假执行不同的代码块。
int x = 10;
if (x > 10) {
System.out.println("x 大于 10");
} else if (x < 10) {
System.out.println("x 小于 10");
} else {
System.out.println("x 等于 10");
}
switch语句:根据表达式的值选择执行不同的分支。
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
// 其他case...
default:
System.out.println("未知");
}
while循环:在满足条件的情况下反复执行代码块。
int count = 0;
while (count < 5) {
System.out.println("Count: " + count);
count++;
}
do-while循环:至少执行一次代码块,然后在满足条件时重复执行。
int count = 0;
do {
System.out.println("Count: " + count);
count++;
} while (count < 5);
for循环:指定初始条件、循环条件和迭代步骤的循环结构。
for (int i = 0; i < 5; i++) {
System.out.println("i: " + i);
}
增强for循环:用于遍历数组或集合。
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println("Number: " + num);
}
break语句:终止循环或switch语句。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当 i 等于 5 时退出循环
}
System.out.println("i: " + i);
}
continue语句:跳过循环体中剩余的代码,进入下一次循环。
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 当 i 为偶数时跳过本次循环的剩余代码
}
System.out.println("i: " + i);
}