相比C++,Java是一种更纯粹的面向对象语言,在Java中,(几乎)一切都是对象。
1.1 创建对象
通过标识符操纵对象,操纵的标识符是对象的引用(reference)。类似于遥控器(引用)操作空调(对象)。
- 创建引用:
String s;
- 对引用初始化:
String s = "hello java";
- 通常用new操作符实现初始化:
String s = new String("hello java");
1.2 对象存储在哪?
基本知识:计算机中有以下五个地方可以存数据
-
寄存器:
- 速度最快的存储区。
- 位于cpu内部,数量极其有限。
- 寄存器会按需分配,你无法感知。
-
栈:
- 速度非常快(仅次于寄存器)。
- 位于RAM内部。
- 通常存储Java对象的引用。
-
堆:
- 通用的内存池,也位于RAM中。
- 通常用于存储Java对象。
- 好处:编译器无需知道存储的数据在堆里存储了多久,因此分配存储比较灵活。
-
非RAM区:
- 存活于程序之外,程序没有运行时也可以存在。
- 如:流对象和持久化对象。
- 有时候(嵌入式系统中)常量可能会存储到ROM区。
1.3 基本数据类型
基本数据类型需要被特殊对待。
- 通过上文可知,一般情况下Java通过new将对象存放在堆里。
- 但是,用new创建一个特别小的,简单的,常用的变量,放在堆里就影响了程序的效率。
- 因此,对于这些基本的类型,可以不用new来创建,而是创建一个并非引用的“自动”变量,这些变量直接存储值,并存放在栈中。
- 目的:提高程序的效率。
Java目前支持八种基本数据类型:
基本类型 | 大小 | 最小值 | 最大值 | 包装类类型 |
---|---|---|---|---|
Boolean | Boolean | |||
char | 16-bit | Unicode 0 | Unicode 2^16-1 | Character |
byte | 8 bits | -128 | 127 | Byte |
short | 16 bits | -2^15 | 2^15-1 | Short |
int | 32bits | -2^31 | 2^31-1 | Integer |
long | 64 bits | -2^63 | 2^63-1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
void | Void |
注:
- boolean所占大小没有明确指定。参考:(1)Oracle官方文档(2)你真的知道boolean类型大小吗
- byte即字节。在java中,byte是作为最小的数字来处理的。
1.4 创建新的数据类型:类
- 创建类:
class People {
/* 类主体 */
}
- 创建对象:
People lwb = new People();
- 字段,方法,参数(列表)和返回值 略
- static关键字:方便在没有创建对象的情况下来进行调用(方法/变量)。
- static修饰的方法 / 变量不需要依赖于对象来进行访问,只要类被加载了,就可通过类名访问。
- static方法(静态方法)不依赖于任何对象就可以进行访问,因此对于静态方法是没有this的,因为它不依附于任何对象。因此,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
- static变量(静态变量)与非静态变量的区别:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化;非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
- static代码块。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
1.5 操作符
- 注意优先级。
- 简化符号:
x = x + 1;
可以写为x += 1;
- 自动递增递减:
print(i++)
和print(++i)
- ++在前,先自增再赋值;
- ++在后,先赋值再自增。
- 关系操作符:
- 基本数据类型的比较,使用
==
; - 引用类型的比较,使用
equals()
- 基本数据类型的比较,使用
- 按位操作符:
- 与
&
,或|
,取反~
,异或^
;
- 与
- 移位操作符:
- 左移:
<<
- 有符号右移
>>
, 符号为正,高位插0,符号为负,高位插1 - 无符号右移
>>>
,无论正负,高位插0
- 左移:
1.6 控制程序执行流程
-
if-else, while, do-while, for, foreach
略 - return:
- 指定方法返回什么
- 导致当前方法退出,并返回那个值
- break和continue:
- break表示退出当前循环,并且不执行循环剩下的所有语句(包括接下来所有未执行的循环)
- continue表示退出当前循环,但是返回循环起始处执行下一次循环(如果存在)
1.7 初始化和清理
-
构造器
- 名称与类同名(意味着首字母大写)
- 创建对象时
new People()
,先为对象分配存储空间,再调用构造器。=>确保了你在操作对象前,它就已经被初始化了 - 构造器的重载(同名,但是参数列表不一样)
-
对于有继承关系的子父类程序的初始化顺序:
- 1.父类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
- 2.子类【静态成员】和【静态代码块】,按在代码中出现的顺序依次执行。
- 3.父类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
- 4.执行父类的构造方法。
- 5.子类的【普通成员变量被普通成员方法赋值】和【普通代码块】,按在代码中出现的顺序依次执行。
- 6.执行子类的构造方法。
-
this关键字
- 只能在方法内部使用,表示“调用该方法的那个对象”的引用
- 应用场景:需要明确指出当前对象的引用
public class Money { int i = 0; Money increment() { i++; return this; // 返回Moeny对象的引用 } void print() { Systemn.out.println("i = " + i); } public static void main(String[] args) { Money m = new Money(); m.increment().increment().increment().print(); } }
- 将当前对象传递给其他方法也很有用
-
finalize()方法:
- finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
- 一般不建议用finalize()完成“非内存资源”的清理工作,但建议用于:
- ① 清理本地对象(通过JNI创建的对象);
- ② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。
1.8 控制权限
-
权限(隐私)等级从小到大:public,protected, 包访问权限(无关键词),private
-
包访问权限:
- 当前包的其他类都有访问权限,但是包以外的其他类都是private的。
-
接口访问权限:public
- 对每个人都是可用的
-
继承访问权限:protected
- 子类可访问
- 同包下的其他类可访问
-
private:
- 访问权限仅限于类的内部,是一种封装的体现
网友评论