1 内存管理
- 内存由谁来进行管理:jvm分配管办理(每个java文件代码都要由jvm执行)
- 1.1 堆
- 1)堆中的存储:
- 堆中存储所有new出来的都对象(包括成员变量——>(因为new的同时会初始化,加载构造方法,而构造方法就是为了给成员变量赋初值。))
- 引用数组就存在于堆中,且成员变量也存在于堆中所以不是所有的基本类型,引用类型都存在于栈中
- 2)成员变量的生命周期:
- 随着对象的创建而产生于堆中,对象被回收(gc垃圾回收机制)而消失。
- 3)垃圾回收机制:
- 3.1)什么是垃圾:在java中没有引用指向的对象。
- 3.2)垃圾回收的方式:
- 垃圾回收器(GC)不定时的会去堆中查看,看到垃圾就自动回收,
- 回收的过程是透明的(不知道其如何回收),即也不是一看到就会立刻回收。
- 如果想快点儿回收,可以调用system.gc()方法,但是也不一定立马回收,只是加快回收。
- 4)内存泄漏:
- 4.1)确定没有用的对象,还有引用指向使其没有及时回收,则会造成泄露。
- 4.2)如何处理:对象不再使用后,及时将引用值设为null。
- 1)堆中的存储:
- 1.2 栈
- 1)栈中的存储:
- 用于存储正在调用中的方法的所有局部变量(包括参数)。
- 2)栈桢:
- 调用方法时,栈会分配给该方法一个对应的栈桢,栈桢中包含所有的局部变量(及参数),方法调用结束时,栈桢消失,局部变量也一起消失。
- 3)局部变量的生命周期:
- 调用方法时候存在于栈中,方法调用结束与栈桢一起消失。
- 1)栈中的存储:
- 1.3 局部变量与成员变量的区别:
- 局部变量:存于栈中————————————————成员变量:存于堆中
- 局部变量:没有默认值,必须声明并初始化才可使用——成员变量:有默认值
- 局部变量:位置在方法中——————————————成员变量:存在类中
- 1.4 方法区
- 存放字节码文件(.class),包括方法
- 方法只存储一份,属性每个对象都有对应的一份。
- 那方法如何识别是哪个对象进行调用呢?——>通过this关键字
2 继承 (是一个泛化的过程)
- 2.1 目的:避免代码的重复,增加了代码的重用性
- 2.2 方式:extends
- 2.3 规则:
- 父类有子类共有的属性,方法。子类有父类的所有属性,方法。
- 单一性:一子一父亲,一父多儿子
- 传递性:父传子,子传孙世世代代。
- 构造方法的规范性:
- 写子类构造方法前必须写父类构造方法(都不写,默认有无参)。
- 子类构造方法第一行默认有super()(必须在第一行)来调用父类无参。
- 自己调用父类构造方法,则没有默认了。
- 2.4 super:
- 概念:指代当前对象的父类对象。
- 什么时候用:在父类的基础上加东西时。
- 用法:
- super.成员变量(?不能局部变量么?那实例变量和类变量呢?)——>访问父类的成员变量
- super.方法名()————————————————————————>调用父类的方法
- super()—————————————————————————————>调用父类的构造方法
- this和super的区别?
- 2.5 向上造型 (is -a的关系)
- 概念:Father f(父类的引用)=(指向)new son();(子类的对象)
- 规则:对象能点出什么来,看的是的引用类型(引用类型有啥点啥)。
- 2.6 方法重写
- 1) 概念:
- 方法的名字相同,参数列表相同,方法体不同。
- 2) 重写后的规则:
- 重写后,调用方法时,引用要看对象的类型,而不是引用类型的类型。
- 3) 重写需注意的规则:(一大两小两同)
- 一大:子类的访问权限>=父类的访问权限
- 两小:
- 子类方法的返回值类型<=父类方法的返回值类型
- void和基本类型——>必须相同
- 引用类型——————>小于等于
- 子类方法抛出的异常<=父类方法抛出的异常 (异常的级别?)
- 子类方法的返回值类型<=父类方法的返回值类型
- 两同:
- 方法的名字相同
- 方法的参数列表相同
- 1) 概念:
- 2.7 方法重载(overload)与方法重写的区别(override)
- overload:方法名相同,参数列表不同,方法体不同,遵循运行期(什么在运行期执行?)绑定,根据引用类型调用方法
- override:方法名相同,参数列表相同, 方法体不同,遵循编译期(什么在编译期执行?)绑定,根据对象类型调用方法
3 访问控制
- 3.1 包命名格式:
- 全部小写
- 域名反写 . 项目名 . 项目模块名 . 类名
- 3.2 访问修饰符的作用范围
- public:所有类
- protected:本类,本包,子类
- 默认:本类,本包
- private:本类
- 3.3 package和import
- 本包可以直接声明使用,不同包需要导包或者(包名.类名)
- 3.4 封装(数据私有化,行为公开化)
- 不会因为别的操作的变更,而导致自己不能实行某些业务。为的是增加代码的扩展性。
4 static
- 4.1 成员变量:分为实例变量(int a;)和静态变量(static int a ;)
- 1)实例变量:
- 属于对象的,存在于堆中。有几个对象,就有相应的几个变量。通常通过(对象名.变量)调用
- 2)静态变量:
- 属于类的,存在于方法区中。被static修饰。只存在一个。通常通过(类名.变量)调用
- 1)实例变量:
- 4.2 什么时候用静态变量:
- 所有对象的某一属性的值都一样的时候,或只有一份的时候。
- 4.3 静态方法:
- 基本性质:属于类,存在于方法区,被static修饰。只存在一个,通过类名调用。
- 特殊性质:没有隐式的this,所以静态方法中不能直接调用实例变量(实力变量必须要对象名调用)。
- 4.4 什么时候用静态方法:
- 当该方法被调用时,至于参数有关,与对象无关的时候。或用于工具方法(eg:Arrays.sort() Math.sqrt();…),工厂方法。
- 4.5 静态块
- 被static修饰
- 属于类的,类被加载期间自动实行,由于类只被加载一次,所以静态块只执行一次
- 什么时候使用?——>加载静态资源图片音频视频等。
5 final(不能变)
- 用法
- 修饰变量:不能被改变(1.声明的同时初始化 2.在构造方法中初始化)
- 修饰方法:不能被重写
- 修饰类:不能被继承,但可以继承别人。
- 出现的时机:
- 基本类库里的类:String,Math、Integer等都是final修饰的类
- 不想类被滥用。
6 Static final(常量)
- 用法:
- 建议都常量名称都大写
- 常量不能被修改
- 常量必须在声明的同时初始化
- 通过类名来调用
- 编译时,自动替换为具体的值。
- 而静态变量,一般通过三部:首先加载类,其次将方法保存与方法区,最后从方法区中取出方法。