类和对象
类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体。
类是用于描述事物的,类中可以定义事物的属性和行为。而对象是通过描述的这个类,使用new关键字创建出来,通过对象就可以调用该对象具体的属性和功能。
对象是同类事物的一种抽象表现形式,而实例是对象的具体化,一个对象可以实例化很多实例,对象就是一个模型,实例是照着这个模型生产的最终产品。
从内存分配的角度来看,对象是保存在堆中的,而实例是存储中栈中的,实例其实只是对象的一个引用,也就是指向对象的指针。
String 类
String str str是对象
String str = “abc”; "abc"是实例,也是对象。
引用类型
引用类型 | 对象是否可引用 | 回收时间 | 使用场景 |
---|---|---|---|
强引用 | 可以 | 从不回收 | 普遍对象的状态 |
软引用 | 可以 | 内存不足时 | 内存敏感的高速缓存 |
弱引用 | 可以 | 下一次GC | 对象缓存 |
虚引用 | 不可以 | 下一次GC,不影响对象生命周期 | 必须和引用队列(ReferenceQueue)一起使用,一般用于追踪垃圾收集器的回收动作。相比对象的finalize方法,虚引用的方式更加灵活和安全 |
null
null就是空,抽象意义上的空,空就是无的概念。
对于null的理解,应该是这样的:仅有一个变量名,但实际上不存在。
(业务中要注意是否会产生空指针异常)
isEmpty和isBlank的区别
isEmpty仅仅是判断空和长度为0字符串
isBlank判断的是空,长度为0,空白字符(包括空格,制表符\t,换行符\n,换页符\f,回车\r)组成的字符串。
包和修饰符
包:
- 可以有多层。
- 不同包的文件名可以重复。
- 包的声明必须在第一行代码。
- 不同包之间的访问要使用类的全名。要使用关键字import将类导入。
*代表的是通配符,代表导入了这个包下的所有的类,并没有导入子包下的类。
类的全名:包名.类名
权限修饰符
public 当前类,相同包下不同的类,不同包下的类
default 当前类,相同包下不同的类
private 当前类
protected 当前类,相同包下不同的类
default:当前包下使用
protected:让子类对象使用
Debug
方法
一、方法的声明
1、方法是完成某个功能的一组语句,通常将某个功能写成一个方法
2、定义方法就是编写有特定功能的一段代码,在程序中使用同样功能的地方可以调用定义好的方法,实现代码的重用
方法声明或称为定义方法
语法格式:
[访问控制符] [修饰符] 返回值类型 方法名 (参数类型 形式参数,参数类型 形式参数,…)
public static void main(String [] args){
方法体:是一个语句块,执行特定的功能操作
}
二、方法的分类
1、根据参数的个数:有参方法、无参方法
2、根据返回值的类型:
有返回值的方法:基本数据类型和引用数据类型
无返回值的方法:void关键字
实参和形参的区别
(1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形
参变量。
(2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。
(3)实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误。
(4)在一般传值调用的机制中只能把实参传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参值发生改变,而实参中的值不会变化。而在引用调用的机制当中是将实参引用的地址传递给了形参,所以任何发生在形参上的改变实际上也发生在实参变量上。
this
this关键字指向的是当前对象的引用
作用:
this.属性名称
指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)
this.方法名称
用来访问本类的成员方法
this();
访问本类的构造方法
()中可以有参数的 如果有参数 就是调用指定的有参构造
注意事项:
1.this() 不能使用在普通方法中 只能写在构造方法中
2.必须是构造方法中的第一条语句
注释
//:行注释,单选注释。用于某行代码后面
/**/:块注释。//的升级版,用来注释多行代码,也可以写多行注释
/***/:javadoc注释。同上,但是能写入javadoc文档说明,用来生成HTML格式的代码报告,所以注释文档必须写在类、域、构造函数、方法,以及字段(field)定义之前。注释文档由两部分组成——描述、块标记
阿里巴巴Java命名手册
类和对象的生命周期(储存原理)
java对象生命周期
对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。
创建对象时应该遵循的规则
避免在循环体中创建对象,即使该对象占用内存空间不大。
for (int i = 0; i < 10000; ++i) {
Object obj = new Object();
System.out.println("obj= "+ obj);
}
上面这种写法违法了该规则,会浪费大量空间。
Object obj = null;
for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}
这种写法,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象应用,浪费大量的内存空间,而且增大了系统做垃圾回收的负荷。
不要对一个对象进行多次初始化,这同样会带来较大的内存开销,降低系统性能。
Java类生命周期
一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段