继承是为了减少代码冗余,将有 is-a 关系的事物抽象出来,作为父类,将众多共有的属性和方法在父类中实现,让其它类继承,这些类称为子类,这些子类就可以避免书写过多的重复代码;多态是为了实现针对不同的事件作出不同的回应,常用的是动态绑定,重载,覆盖;
继承:
- 构造方法:如果子类没有定义任何构造方法,则需要父类已经定义了 无参构造方法。值得注意的是,对于子类中的构造方法,在子类的构造方法语句执行前都会去调用父类的构造方法,默认情况下是调用父类的无参构造方法,哪怕是在子类的构造方法中,相当于使用了语句 super() ; 如果你想调用父类的有参构造方法,则需要 super(param a, param b) 语句;而有的类中的构造方法需要相互调用,则需要使用 this();
- 区别 super() 和 this() 关键字,super()是调用父类的方法,this()是调用本类中的方法;
- 如果父类中的方法或属性为 private ,很遗憾哪怕你子类拥有这些方法或属性,你也不能修改它们。考虑到子类可能具有这些需求,那么你可以用另外一种限定修饰符 protected;protected可以让这个相同包内的类具有访问权限,跨包就需要该类是其子类;而默认修饰符 (default) 在同一个包内都可以访问,但跨包后就不具备权限了。
多态:
- 动态绑定:一个对象的构造声明可能出现用父类的对象引用来引用子类的对象,这个父类被称为声明类型,而子类被称为实际类型。java中的机制则是从实际类型开始查找能被响应的方法或属性,以继承的链往上延伸查询,找到则停止查询并执行该动作;
- 关于重载:重载指的是函数名相同,参数名不同,如:feed(animal : Cat), feed(animal : Dog); 如果传递的参数为猫类则喂猫粮,如果传递的参数为狗类则喂骨头;这便是多态的一种实现;
- 关于覆盖:不同于重载,这是指 签名完全相同 ,应用场景可能是:父类写好的函数被发现在子类中不适用或者已找到更好的方法,于是在子类中重写它;
instance of 可用于观察一个对象是不是属于某个类;如果A类继承于B类,那 ( new A() ) instanceof B 的判断值是对的,但反过来就是 false ,因为你能说每只猫都是动物,但不能说每一只动物都是猫,这是检验 is-a关系的一种方法;由此衍生,就可以理解类型转换的问题,B b = new A(); 是没问题,因为A类事实上是B类的一种扩展,B类中有的属性和方法A类都有,所以可以放心的把将A交给B用;但是反过来又不好说了,尽管这个B型可能真的是A类型,只是用B类型引用传递过来,但java不怕一万就怕万一,于是就需要你自己确定这个责任,需要显示转换类型, A a = (A)(new B()); 这里你可以用instanceof来做一个确定,如果判断值为 true 则转换;
时间: 2024-11-03 21:00:33