《继承与多态》动手动脑

1、什么是继承?

  继承是对现实生活中的“分类”概念的一种模拟。

2、继承条件下类的访问权限

  public:外界可自由访问;

  private:外界不可访问;

  protected:同一包中的子类都可以访问,另一包中的子类(派生于同一个父类)也可以访问;

  default:如果不指明任何权限,则默认同一包中的类可以访问;

3、通过super调用基类构造方法,必须是子类构造方法中的第一个语句。

4、为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

  构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。

  子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。不能反过来调用也是这个原因,因为父类根本不知道子类有神魔变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!

5、不允许继承的类

final class 类名

{

}

  以final声明的方法不允许覆盖。
  以final声明的变量不允许更改。
  利用final,可以设计出一种特殊的“只读” 的“不可变类”。

6、子类与父类方法间的关系

  由于Java并未对子类方法的命名做过多的限制,因此,子类与父类各自定义的方法之间,可以出现以下三种情况
  扩充(Extends):子类定义的方法父类没有同名;
  覆盖/重写(Override):子类父类定义了完全一样的方法;
  重载(Overloads):子类有父类的同名方法,但两者的参数类型或参数数目不一样。

 7、在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。

8、Java“方法覆盖”的语法规则

(1)覆盖方法的允许访问范围不能小于原方法。
(2)覆盖方法所抛出的异常不能比原方法更多。
(3)声明为final方法不允许覆盖。
    例如,Object的getClass()方法不能覆盖。
(4)不能覆盖静态方法。

9、子类父类拥有同名的方法时

  当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
  这个特性实际上就是面向对象“多态”特性的具体表现。

  如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
  如果子类被当作父类使用,则通过子类访问的字段是父类的!

10、多态编程有两种主要形式:
  (1)继承多态:示例程序使用的方法
  (2)接口多态:使用接口代替抽象基类,这个任务留为作业。

原文地址:https://www.cnblogs.com/xhj1074376195/p/11748591.html