思想:Java 中万物(几乎)皆对象
1.类的创建
1.1 类
如果一切都是对象,那么是什么决定了某一类对象的外观和行为呢?换句话说,是什么确定了对象的类型?
class
关键字类来描述一种新的对象(新建一个类)
class ATypeName {
// 这里是类的内部
}
使用new
关键字来创建一个这种类型的对象
1.2 字段
类里存放两种类型的元素:方法(method)和字段(field)。
类的字段可以是基本类型,也可以是引用类型。
通常,字段不在对象间共享。
1.3 基本类型默认值
基本类型 | 初始值 |
---|---|
boolean | false |
char | \u0000 (null) |
byte | (byte) 0 |
short | (short) 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
2.对象
2.1 对象操纵
在 C/C++ 中,对象的操纵是通过指针来完成的。
虽万物皆可为对象,但我们所操纵的标识符实际上只是对对象的“引用”
String s = "this is string";
2.3 对象创建
引用”用来关联“对象”。
new 关键字代表:创建一个新的对象实例。
String s = new String("this is string");
2.2 对象清理
只要你需要,new
出来的对象就会一直存活下去。 相比在 C++ 编码中操作内存可能会出现的诸多问题,这些困扰在 Java 中都不复存在了。在 C++ 中你不仅要确保对象的内存在你操作的范围内存在,还必须在使用完它们之后,将其销毁。
我们在 Java 中并没有主动清理这些对象,那么它是如何避免 C++ 中出现的内存被填满从而阻塞程序的问题呢?
答案是:Java 的垃圾收集器会检查所有 new
出来的对象并判断哪些不再可达,继而释放那些被占用的内存,供其他新的对象使用。也就是说,我们不必担心内存回收的问题了。你只需简单创建对象即可。当其不再被需要时,能自行被垃圾收集器释放。垃圾回收机制有效防止了因程序员忘记释放内存而造成的“内存泄漏”问题。
2.3 基本存储类型
有一组类型在 Java 中使用频率很高,它们需要特殊对待,这就是 Java 的基本类型。之所以这么说,是因为它们的创建并不是通过 new
关键字来产生。通常 new
出来的对象都是保存在堆内存中的,以此方式创建小而简单的变量往往是不划算的。所以对于这些基本类型的创建方法,Java 使用了和 C/C++ 一样的策略。也就是说,不是使用 new
创建变量,而是使用一个“自动”变量。 这个变量直接存储"值",并置于栈内存中,因此更加高效。
基本类型 | 大小 | 最小值 | 最大值 | 包装类型 |
---|---|---|---|---|
boolean | — | — | — | Boolean |
char | 16 bits | Unicode 0 | Unicode 216 -1 | Character |
byte | 8 bits | -128 | +127 | Byte |
short | 16 bits | - 215 | + 215 -1 | Short |
int | 32 bits | - 231 | + 231 -1 | Integer |
long | 64 bits | - 263 | + 263 -1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | — | — | — | Void |
2.4 作用域
{
int x = 12;
// 仅 x 变量可用
{
int q = 96;
// x 和 q 变量皆可用
}
// 仅 x 变量可用
// 变量 q 不在作用域内
}
{
int x = 12;
{
int x = 96; // Illegal
}
}
在上例中, Java 编译器会在提示变量 x 已经被定义过了。因此,在 C/C++ 中将一个较大作用域的变量"隐藏"起来的做法,在 Java 中是不被允许的。 因为 Java 的设计者认为这样做会导致程序混乱。
3.方法使用
[返回类型] [方法名](/*参数列表*/){
// 方法体
}
3.1 返回类型
[对象引用].[方法名](参数1, 参数2, 参数3);
int x = a.f();
3.2 参数列表
boolean flag() {
return true;
}
double naturalLogBase() {
return 2.718;
}
void nothing() {
return;
}
void nothing2() {
}
4.代码注释
/* 这是
* 跨越多行的
* 注释
*/
/* 这是跨越多
行的注释 */
// 这是单行注释