一.内存管理:
1.堆:
①存储new出来的对象(包括实例变量)
②成员变量的生命周期:
创建对象是存在堆中,对象回收时一并消失.
③垃圾:
没有任何引用指向的对象
垃圾回收器不定时到内存中清扫垃圾,
回收过程是透明的,不一定发现垃圾就立刻回收,
调用System.gc()可以建议JVM尽快调度GC来回收.
④内存泄漏:
不再使用的内存没有被及时的回收
建议:不再使用的对象需及时将引用设置为null.
2.栈:
①存储正在调用中的方法中的所有局部变量(包括参数)
②调用方法时,会在栈中为该方法分配一块对应的栈帧,
栈帧中存储方法中所有局部变量(包括参数)
方法调用完后,栈帧被清除,局部变量一并失效
③局部变量的生命周期:
调用方法时存在栈中,方法完之后与栈帧一并消失.
3.方法区:
①存储.class字节码文件(包括方法)
②方法只有一份,能过this来区分具体的调用对象
4.package:
①避免类名冲突
②包名可以有层次结构,同包中的类不能同名
③类的完全限定名: 包名.类名
④建议:包名所有字母都小写
5. import:
同包中的类可以直接访问,不同包中的类不能直接访问,只有如下两种方式:
①先import声明类,再访问类----建议
②类的完全限定名-------太繁琐,不建议
6.访问控制修饰符:
①public:公开的,任何类
②private:私有的,本类
③protected:受保护的,本类、子类、同包类
④默认的:什么也不写,本类、同包类
类的访问修饰: public和默认的
类中成员的访问修饰: 如上4种都可以
7.static:
1.静态变量:
①由static修饰
②属于类,存在方法区中,只有一份
③常常通过类名.来访问
④何时用:所有对象共享的数据(图片、音频、视频等)
2.静态方法:
①由static修饰
②属于类,存在方法区中,只有一份
③常常通过类名.来访问
④静态方法没有隐式的this传递,静态方法中不能直接访问实例成员
⑤何时用:方法的操作仅与参数相关而与对象无关
3.静态块:
①由static修饰
②类被加载期间自动执行,因类只被加载一次,所以静态块也只执行一次
③何时用:常常用于初始化静态资源(图片、音频、视频等)
8.final:
最终的、不可变的------单独应用几率不高
①修饰变量:变量不可被改变
②修饰方法:方法不可被重写
③修饰类:类不可被继承
9.static final
常量: 应用率高
①常量必须声明同时初始化
②通过类名点来访问,不可被改变
③建议:常量名所有字母都大写,多个单词用_分隔
④编译器在编译时将常量直接替换为具体的值,效率高
10.抽象方法:
①由abstract修饰
②只有方法的定义,没有方法的具体实现(连{}都没有)
11.抽象类:
①由abstract修饰
②包含抽象方法的类必须是抽象类
不包含抽象方法的类也可以声明为抽象类----我乐意
③抽象类不能被实例化
④抽象类是需要被继承的,子类:
重写所有抽象方法------常用
也声明为抽象类--------不常用
⑤抽象类的意义:
封装子类共有的属性和行为-------代码复用
为所有子类提供一种统一的类型---向上造型
可以包含抽象方法,为所有子类提供了统一的入口,每个子类的实现不同,但入口是一致的
12.接口:
①是一个标准、规范----制定方
遵守了这个标准就能干某件事---------API
②是一种数据类型(引用类型)
③由interface定义
只能包含常量和抽象方法
④接口不能被实例化
⑤接口是需要被实现/继承的,实现类/子类:
必须重写接口中的所有抽象方法
⑥一个类可以实现多个接口,用逗号分隔
若又继承又实现时,应先继承后实现
⑦接口可以继承接口