A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fmi110 高级黑马   /  2015-8-19 18:06  /  231 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

a
  1. 1、继承的描述:
  2.         通过 extends 关键字让类与类之间产生关系。
  3.         多个类具有相同的属性或者行为时,将这些内容抽取到单独一个类中,那么多个类不必再
  4.         定义这些属性和行为,只要继承哪个类即可。多个类成为子类,单独的类成为父类或者超类。

  5.     PS: 1 子类可以访问父类中非私有的属性和行为
  6.         2 子类无法继承父类中私有的内容
  7.         3 父类怎么来的?共性不断向上抽取来的

  8.     继承的好处:
  9.         1 继承的出现提高了代码的复用性
  10.         2 继承的出现让类与类之间产生了关系,提供了多态的前提

  11. 2、继承的特点
  12.    
  13.     java 类只支持单继承,不支持多继承。因此一个类只有一个父类,不能有多个

  14.     原因:当出现多继承时,父类中出现相同的方法名时,子类要执行哪一个方法是不确定。

  15. 3、 super 和 this关键字
  16.     1 成员变量
  17.         this 和 super 的用法很相似,this 代表本类对象的引用;super 代表父类的内存空间的标识
  18.         当本类成员和局部变量同名时,用 this区分;
  19.         当子父类中出现同名成员变量时,用 super区分父类
  20.         ————————————————————————————————————————————————————————————————————
  21.                 class Fu{
  22.                     private int num = 4;
  23.                     public int getNum(){
  24.                         return num;
  25.                     }
  26.                 }
  27.                 class Zi extends Fu{
  28.                     private int num = 3;
  29.                     void show(){
  30.                         System.out.println("this.num:"+this.num+"...super.num:"+super.num);
  31.                     }
  32.                 }
  33.                 class ExtendsDemo{
  34.                     new Zi().show();
  35.                 }
  36.                 输出结果: this.num:3...super.num:4
  37.         ————————————————————————————————————————————————————————————————————
  38.     2 成员函数
  39.         当子父类中出现成员函数一模一样去情况,会运行子类的函数
  40.         这种现象,称为覆盖操作,这是函数在子父类中的特性。
  41.         在子类覆盖方法中,要继续使用被覆盖的方法可以通过super.函数名 获取。

  42.         函数的两个特性:
  43.             1 重载,在同一个类中。函数名相同,参数列表不同 overload
  44.             2 覆盖,在子类中,覆盖也成为重写,覆写,override

  45.         何时使用重写操作?
  46.             当子类需要父类的功能,但子类的功能主体有子集独特的内容时,可以复写父类的方法,
  47.         这样既沿袭了父类的功能,又定义了子类特有的内容。

  48.         PS: 1 父类中私有方法不能被覆盖(子类看不到)
  49.             2 父类的 static 方法无法覆盖
  50.             3 覆盖时,子类方法权限一定要大于或等于父类方法的权限

  51.     3. 构造函数
  52.         子父类中构造函数的特点:
  53.         在子类构造函数执行时,发现父类构造函数也运行了。
  54.         原因:在子类的构造函数中,第一行有一个默认的隐式语句:super();
  55.         注意:如果使用super(4);语句调用父类的其他构造函数,那么默认的父类构造函数将不会再被调用。

  56. 4、子类的实例化过程
  57.     子类中所有的构造函数默认都会访问父类中空参数的构造函数
  58.     因为每一个子类的构造函数第一行都有一条默认语句 super();

  59.     为什么子类实例化的时候要访问父类中的构造函数呢?

  60.         那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对
  61.     自己的内容进行初始化的。

  62.     P.S.
  63.     1 当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函
  64.     数。
  65.       
  66.     2 子类构造函数中如果使用this调用了本类构造函数,那么默认的super();就没有了,因为super和this都只
  67.      能定义在第一行,所以只能有一个。 但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。

  68.     3 super语句必须要定义在子类构造函数的第一行!因为父类的初始化动作要先完成。
  69.     ————————————————————————————————————————————————————————————————————
  70.             class Fu{
  71.                 Fu(){
  72.                     super();//没写时,系统会隐士的给出
  73.                     //子类初始化时,调用的是子类的show,但此时子类特有的成员变量num 未初始化
  74.                     show();
  75.                 }
  76.                 public void show(){
  77.                     System.out.println("Fu show");
  78.                 }
  79.             }
  80.             class Zi extends Fu{
  81.                 int num = 8;
  82.                 Zi(){
  83.                     super();
  84.                     //通过super初始化父类内容时,此时子类的成员变量并未显示初始化,等 super父类
  85.                     //初始化完毕后,才进行子类的成员变量显式初始化
  86.                 }
  87.                 public vois show(){
  88.                     System.out.println("Zi show..."+num);
  89.                 }
  90.             }
  91.             class ExtendDemo(){
  92.                 public static void main(String[] args){
  93.                     Zi zi = new Zi();
  94.                     zi.show();
  95.                 }
  96.             }
  97.         输出结果:  Zi show...0
  98.                     Zi show...8

  99.         总结:Zi zi =  new Zi();的实例化过程
  100.             1 JVM 会读取指定路径下的Zi.class 文件,并加载如内存,并会先加载Zi的父类(如果
  101.         有直接父类)
  102.             2 在内存开辟空间,并分配地址(父类、子类中的成员和方法同时开辟)
  103.             3 并在对象空间中,对对象的属性进行默认初始化
  104.             4 调用对应的构造函数进行初始化
  105.             5 在构造函数中,第一行会先调用父类中的构造函数super()进行初始化
  106.             6 父类构造函数初始化完毕后,再对子类的属性进行显示初始化
  107.             7 再进行子类构造函数的特定初始化
  108.             8 初始化完毕后,将地址值赋给引用变量
  109.             PS:类定义中如果存在构造代码块,代码块会先于构造函数执行!
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马