对于封装性的复习
1.public
2.protected
3.缺省
4.private
对于在类中声明的属性和方法1.2.3都可以在同一包下的其他类中出现,4只能在其被声明的类中出现。出了包以后,在子类中只有1.2可以被使用(方法也一样),不是子类的话只有1可以
对于缺省的类,不能在其他的包中被引用
面向对象特征之二:继承性 1. 继承性的理解 > 生活上:财产的继承、颜值的继承 > 代码层面: > 自上而下:定义了一个类A,在定义另一个类B时,发现类B的功能与类A相似,考虑类B继承于类A > 自下而上:定义了类B,C,D等,发现B、C、D有类似的属性和方法,则可以考虑将相同的属性和方法进行抽取, 封装到类A中,让类B、C、D继承于类A,同时,B、C、D中的相似的功能就可以删除了。 2. 继承性的好处 - 继承的出现减少了代码冗余,提高了代码的复用性。 - 继承的出现,更有利于功能的扩展。 - 继承的出现让类与类之间产生了`is-a`的关系,为多态的使用提供了前提。 - 继承描述事物之间的所属关系,这种关系是:`is-a` 的关系。可见,父类更通用、更一般,子类更具体。 3. 继承的格式: class A{ //属性、方法 } class B extends A{ } 继承中的基本概念: 类A: 父类、superClass、超类、基类 类B: 子类、subClass、派生类 4. 有了继承性以后: > 子类就获取到了父类中声明的所有的属性和方法。 > 但是,由于封装性的影响,可能子类不能直接调用父类中声明的属性或方法。 > 子类在继承父类以后,还可以扩展自己特有的功能(体现:增加特有的属性、方法) extends:延展、扩展、延伸 子类和父类的理解,要区别于集合和子集 > 不要为了继承而继承。在继承之前,判断一下是否有is a的关系。 5. 默认的父类: Java中声明的类,如果没有显式的声明其父类时,则默认继承于java.lang.Object 6. 补充说明: > Java是支持多层继承。 > 概念:直接父类、间接父类 > Java中的子父类的概念是相对的。 > Java中一个父类可以声明多个子类。反之,一个子类只能有一个父类(Java的单继承性)
二、方法的重写(overwrite / override) 1. 为什么需要方法的重写? 子类在继承父类以后,就获取了父类中声明的所有的方法。但是,父类中的方法可能不太适用于子类,换句话说,子类 需要对父类中继承过来的方法进行覆盖、覆写的操作。 举例(银行账户): class Account{//账户 double balance;//余额 //取钱 public void withdraw(double amt){ //判断balance余额是否够amt取钱的额度 } } class CheckAccount extends Account{ //信用卡 double protectedBy;//透支额度 public void withdraw(double amt){ //判断balance余额是否够amt取钱的额度 //如果不够,还可以考虑从protectedBy额度里取 } } class AccountTest{ public static void main(String[] args){ CheckAccount acct = new CheckAccount(); acct.withdraw(); //执行的是子类重写父类的方法 } } 2. 何为方法的重写? 子类对父类继承过来的方法进行的覆盖、覆写的操作,就称为方法的重写。 3. 方法重写应遵循的规则 [复习]方法声明的格式:权限修饰符 返回值类型 方法名(形参列表) [throws 异常类型] { //方法体 } 具体规则: ① 父类被重写的方法与子类重写的方法的方法名和形参列表必须相同。 ② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符 > 子类不能重写父类中声明为private权限修饰的方法。 ③ 关于返回值类型: > 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型必须是void > 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须与被重写的方法的返回值类型相同。 > 父类被重写的方法的返回值类型是引用数据类型(比如类),则子类重写的方法的返回值类型可以与被重写的方法的返回值 类型相同 或 是被重写的方法的返回值类型的子类 ④ 子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。 补充说明:方法体:没有要求。但是子类重写的方法的方法体必然与父类被重写的方法的不同。 4. 面试题:区分方法的重载(overload)与重写(override / overwrite) 重载:“两同一不同” 重写:继承以后,子类覆盖父类中同名同参数的方法 [类比]相同类型的面试题: throws / throw final / finally / finalize Collection / Collections String / StringBuffer / StringBuilder ArrayList / LinkedList HashMap / LinkedHashMap / Hashtable ... sleep() / wait() == / equals() 同步 / 异步