面向对象02——封装与继承
面向对象——封装
封装能提供安全性
访问权限修饰符
private:表示私有,类访问权限,只能在本类中访问。离开本类后不能直接访问。
缺省:表示包私有,包访问权限,访问者的包必须和当前定义类的包相同才能访问
protected:子类访问权限,同包中的可以访问,即使不同包有继承关系,也可以访问
public:公共访问权限,若某一个字段或方法使用public修饰可以在当前项目任何地方访问
JavaBean规范简述(特殊java类)
JavaBean是Java语言写成的可重用组件(类)
- 类必须用public修饰
- 必须保证有公共的无参数构造器,即使手动提供了带参数的也必须提供公共的无参构造器
- 包含了属性的操作字段(给属性赋值,获取属性值
分类
- 复杂:UI,Windows…类
- 简单:domain,dao组件,搞作数据库,封装数据,逻辑运算等
成员
- 方法:Method
- 事件:event
- 属性:property
getter方法:用于获取某一字段存储的值
public 数据类型 getName(){return name;}
注意:如果操作的字段是boolean类型的,此时应该是is方法,getName–>isName.
**setter方法:**仅仅用于给某一个字段设置需要存储的值
public void setName(字段类型 n){name = n};
在javab中有属性这个概念,只有标准情况下字段名和属性名才相同
this关键字
- 构造器中:表示当前创建的对象
- 方法中:哪个对象调用含this方法,这个this就指哪个对象
- 当一个对象创建后,JVM会分配一个引用自身的引用:this
(存储自身地址的指针)
构造器重载相互调用问题
构造器中如果要调用构造器则需要this(name)
注意,this(实参);必须作为构造器中的第一句话且构造器中只能调用一次重载构造器
当多个构造器重载时,或者多个方法重载时,一般我们是少参数调用多参数。参数越多,方法未知因素越多,功能越复杂
面向对象——继承
被继承的类(super class)
继承的类(sub class):具备父辈某一些行为
继承关系可以解决代码重复问题
继承关系
继承关系是一种从一般到特殊的关系,即子类是父类的一种特殊符号。
extends表示父类和子类的关系
语法格式:在定义子类的时候表明自己需要拓展于哪一个父类
public class 子类类名 extends 父类类名 {}
Java中,类之间只允许单继承。但Java允许多重继承
在Java中除Object类之外,每一个类都有一个直接的父类。
Object类是Java语言的根类(任何类都是Object的子类)
推理:Object类要么是一个类直接父类,要么是一个类的间接父类
继承关系的真正作用是表达出一种体系
方法覆盖
子类中如果有与父类相同的方法,那么会覆盖父类的方法。
只有方法有覆盖,字段没用
原则:
- 方法签名相同
- 子类方法的返回类型是和父类方法的返回类型相同或者是其子类
- 子类方法抛出的异常类型和父类方法声明抛出的异常类型相同或其子类
- 子类方法的访问权限必须大于父类方法的访问权限或相同
@Override可以检测是否覆盖
super关键字
在子类的某一个方法,调用父类被覆盖的方法。
super:表示当前对象的父类对象,this的老爸
子类的初始化
*:在创建子类时执行构造器,子类构造器中有隐式的super(),所以在调用子类构造器的时候就调用了父类的构造器创建了父类,且先执行了父类构造器再执行子类。注意,这里默认调用的是父类无参的构造器
- 如果父类不存在可以被子类访问的构造器,则不存在子类
- 如果父类未提供无参构造器,此时子类必须显示通过super()语句调用父类带参数构造器
super应用场景
隐藏现象(不叫覆盖)
- 满足继承的访问权限下,隐藏父类的静态方法。注意:仅仅是静态方法,子类存在和父类一模一样的静态方法
- 满足继承的访问权限下,隐藏父类的字段
- 若本类中局部变量名和字段名相同,隐藏本类字段
Java语言根类Object类
什么是object:object本身是对象的意思,所有对象都具有某一些共同行为,所以,我们抽象出一个类:object
object类常见方法
- protected void finalie():当GC确定不存在对该对象的更多引用时,由对象的GC调用此方法。我们不要去调用
- Class<?> getClass():返回对象的真实类型
- int hashCode():返回该对象的哈希值,hashCode决定了对象在哈希表中的存储位置
- boolean equals(Object obj):拿当前对象和参数做比较。在object类中的equals方法,本身和“==”符号相同,都是比较对象的内存地址
- 官方建议:每个类都应该复写equals方法,不要比较内存地址。去关心我们要比较的数据
- String toString():表示把一个对象转换为字符串。打印对象时,其实打印的是对象的toString()方法返回值。
默认情况下,打印的是对象的十六进制,官方建议:覆盖每个类的toString()返回我们关心的数据