学习记录之面向对象
1. 构造方法:构造函数、构造器、构建器----------------复用给成员变量初始化代码
- 作用:给成员变量赋初始值
- 与类同名,没有返回值类型(连void都没有)
- 在创建(new)对象时被自动调用
- 若自己不写构造方法,则编译器默认提供一个无参构造方法,
若自己写了构造方法,则不再默认提供
- 构造方法可以重载
2. this:指代当前对象,哪个对象调用方法它指的就是哪个对象
只能用在方法中,方法中访问成员变量之前默认有个this.
this的用法:
- this.成员变量名--------------访问成员变量当成员变量和局部变量同名时,若想访问成员变量则this不能省略,其它一般省略
- this.方法名()------------------调用方法(一般不用,了解)
- this()----------------------------调用构造方法(一般不用,了解)
null:表示空,没有指向任何对象。若引用的值为null,则该引用不能再进行任何点操作了,若操作则发生NullPointerException空指针异常。
注:成员变量和局部变量是可以同名的,但是使用的时候默认采取的是就近原则。
引用类型数组:
- 给引用类型数组的元素赋值时,必须得new个对象
- 若想访问对象的数据/调用方法,需要通过数组元素去打点
继承:
- 作用:代码复用
- 通过extends来实现继承
- 超类/父类:共有的属性和行为
派生类/子类:特有的属性和行为
- 派生类可以访问:派生类的+超类的,而超类不能访问派生类的
- 一个超类可以有多个派生类,但一个派生类只能继承一个超类-----单一继承 具有传递性
- java规定:构造派生类之前必须先构造超类
- 在派生类构造方法中若没有调用超类构造方法,则默认super()调超类无参构造方法
- 在派生类构造方法中若自己调用了超类构造方法,则不再默认提供
> 注意:super()调用超类构造方法,必须位于派生类构造方法的第一行
3. super:指代当前对象的超类对象
super的用法:
- super.成员变量名------------------------访问超类的成员变量(一般不用,了解)
- super.方法名()----------------------------调用超类的方法
- super()--------------------------------------调用超类的构造方法
向上造型:
- 超类型的引用指向派生类的对象
- 能点出来什么,看引用的类型
2. 方法的重写(override/overriding):重新写
- 发生在父子类中,方法名相同,参数列表相同------派生类中重写了超类的方法
- 重写方法被调用时,看对象的类型
- 重写需遵循"两同两小一大"原则:
- 两同:
- 方法名相同
- 参数列表相同
- 两小:
- 派生类方法的返回值类型小于或等于超类方法的
- void和基本类型时,必须相等
- 引用类型时,可以小于或等于
- 派生类方法抛出的异常小于或等于超类方法的
- 一大:
- 派生类方法的访问权限大于或等于超类方法的
3. 重写与重载的区别:-------------常见面试题
- 重写(override):发生在父子类中,方法名相同,参数列表相同
- 重载(overload):发生在同一类中,方法名相同,参数列表不同
继承要符合is(是)的关系
何时向上造型:
- 当多种角色所干的事几乎一样时,可以将它们统一造型到一个数组中,复用
- 比如:学生/老师/医生都在输出名字并问好,就将它们统一造型到Person数组中,一个for即可,实现代码的复用
package和import:
- package:声明包
- 作用:避免类的命名冲突
- 同包中的类不能同名,不同包中的类可以同名
- 类的全称:包名.类名,包名常常有层次结构
- 建议:包名所有字母都小写
- import:导入类
- 同包中的类可以直接访问的,不同包中的类不能直接访问,若想访问:
- 先import导入类,再使用类----------建议
- 类的全称------------------------------------太繁琐,不建议
访问控制修饰符:---------------------保护数据的安全
- public:公开的,任何类
- private:私有的,本类
- protected:受保护的,本类、派生类、同包类
- 默认的:什么也不写,本类、同包类---------------------java不建议
> 说明:
> 1. 类的访问权限只能是public或默认的
> 2. 类中成员的访问权限如上4种都可以
> 3. 访问权限由大到小:public>protected>默认的>private
final:最终的、不可改变的-------------单独应用率低
- 修饰变量:变量不能被改变
- 修饰方法:方法不能被重写
- 修饰类:类不能被继承
static:静态的
- 静态变量:
- 由static修饰
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
- 何时用:所有对象所共享的数据(图片、音频、视频等)
- 静态方法:
- 由static修饰
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
- 静态方法中没有隐式this传递,所以不能直接访问实例成员
- 何时用:方法的操作与对象无关(不需要访问对象的数据)
- 静态块:
- 由static修饰
- 属于类,在类被加载时自动执行,一个类只被加载一次,所以静态块只执行一次
- 何时用:初始化/加载静态资源(图片、音频、视频等)
访问权限常规使用规则:
- 实例变量一般都private
- 方法绝大部分情况都是public的,但是若某方法只是我自己用,也是可以private的
- 静态的一般都是public
成员变量分两种:
- 实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份通过引用打点来访问
- 静态变量:由static修饰,属于类的,存储在方法区中,只有一份 通过类名打点来访问
内存管理:由JVM管理
- 堆:new出来的对象(包括实例变量)
- 栈:局部变量(包括方法的参数)
- 方法区:.class字节码文件(包括静态变量、所有方法)
给成员变量赋值规则:
- 静态变量,一般在静态块中初始化
- 实例变量,一般在构造方法中初始化