子类与父类
子类
class 子类名 extends 父类名{ ....... }
类的树形结构
子类的继承性
子类和父类在同一包中的继承性
子类继承了父类不是private的成员属性和成员方法
子类和父类在同一包中的继承性
//子类中只继承protected和public的成员变量和成员方法
继承关系的UML
子类与对象
//当使用子类构造方法创建对象的时候,不仅子类声明中的成员变量被分配了内存,而且父类的成员变量也分配了内存空间
成员变量的隐藏和方法重写
成员变量的隐藏:
/* *当子类的成员变量和父类的成员变量出现同名时(变量类型可以不同),这样子类就会隐藏 *所继承的成员变量 */
特点:
/* *之类对象已经自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量 *子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的 *方法所操作的成员变量一定是被子类继承或者隐藏的成员变量 */
/* 子类继承的方法只能操作子类继承和隐藏的成员变量 子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量(若要操作需要使用super关键字操作子类隐藏的成员变量) */
方法重写
子类通过重写可以隐藏已继承的方法(方法重写又称方法覆盖) 重写规则: 1.如果子类可以继承父类的某个方法,这个子类就有权利重写这个方法。 2.子类的方法名字,返回类型,参数类型个数都要和父类的一致才算是重写 3.@Override
/* 重写的目的: 隐藏继承的方法,增加拓展功能 */
/* 注意事项: 重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限 高到低:public--->protected--->友好的--->private */
super关键字
/*super代表指向父类 子类一旦隐藏继承的成员变量/方法,那么子类创建的对象就不再拥有该变量/方法,该变量将归关键字super所有,可以使用super来访问 */
/* *在加载子类的时候回 super()调用父类的默认构造方法 */
final关键字
/* *fina可以修饰类,成员变量,方法中局部变量 */ final class A{ } /* final 修饰的类不能被继承,不能有子类; */ //final 修饰方法,那么这个方法不允许子类重写,也就是说,不允许子类隐藏可以继承的final方法老老实实继承,不许任何修改 public final void method(){ } //final 修饰的变量,就是常量,运行期间不允许修改
对象的上转型对象
Animal a; a=new Tiger(); //或者 Animal a; Tiger b=new Tiger(); a=b; /* * 这时就称a是对象b的上转型对象 */
特点:
/* 上转对象不能操作子类新增的成员变量/方法(失掉这一部分属性) 上转对象可以访问子类继承或者隐藏的成员变量/方法, */
继承与多态
/* 动态性:指父类的某个方法被父类的某个方法被子类重写时,可以产生自己的功能行为 */
abstract类和abstract方法
/* 用关键字abstract修饰的类称为abstract类(抽象类) */ abstract class A{ } /* 使用关键字abstract修饰的方法称为abstract方法(抽象方法) */ abstract int min(int x,int y); abstract class A{//抽象类 abstract int min(int x,int y);//抽象方法 int max(int x,int y){ return x<y?y:x; } }
特点:
/* 1.abstract类 不能用new运算符创建对象 继承抽象类的类必须重写抽象类的抽象方法(不能使用abstract和final修饰同一个方法) 2.abstract类中可以有abstract方法 3.abstract的子类 如果一个非抽象类继承该抽象类,必须重写父类的抽象方法(给出方法体),如果是抽象类继承抽象类则,可重写或者继承 4.abstract类的对象作上转型的对象 抽象类可以 抽象出重要的行为标准,该标准用抽象方法来表示。 抽象类声明的对象可以成为其子类的对象的上转型对象 */
面向抽象编程
在程序设计时,经常使用抽象类,原因是:abstract类只是关心操作,而不关心这些操作具体的实现的细节,
开-闭原则
/* 让设计的系统对扩展开放,对修改关闭 */