20175215 2018-2019-2 第四周Java课程学习总结

第五章学习内容

1.子类的继承性

(1)子类和父类在同一包中的继承性

如果子类和父类在同一个包中,那么,子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法,继承的成员变量或方法的访问权限保持不变。

(2)子类和父类不在同一包中的继承性

当子类和父类不在同一个包中时,父类中的private和友好访问权限的成员变量不会被子类继承,也就是说,子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。

2.子类与对象

子类对象的特点(主要讲继承)

子类创建对象时似乎浪费了一些内存,因为当用子类创建对象时,父类的成员变量也都分配了内存空间,但只将其中一部分作为分配给子类对象的变量,例如,父类中的private成员变量尽管分配了内存空间,也不作为子类对象的变量,当然他们也不是父类某个对象的变量,因为我们根本就没有使用父类创建任何对象。这部分内存似乎成了垃圾一样。但是,实际情况并非如此,我们需注意到,子类中还有一部分方法是从父类继承的,这部分方法却可以操作这部分未继承的变量。

3.成员变量的隐藏和方法重写

(1)成员变量的隐藏

子类隐藏继承的成员变量的特点如下:

  • 子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量。
  • 子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。

(2)方法重写

要注意的问题:

  • 重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其它方法,但无法操作被子类隐藏的成员变量和方法。如果子类想使用被隐藏的方法或成员变量,必须使用关键词super
  • 当子类未成功重写(覆盖)继承的方法,就会使子类出现方法重载,具体内容见之前的博客第三周java课程学习总结
  • 重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限(访问限制修饰符按访问权限从高到低的排列顺序是public、protected、友好的、private)。

4.super关键字

(1)用super操作被隐藏的成员变量和方法。

子类一旦隐藏了继承的成员变量,那么子类创建的对象就不在拥有该变量,该变量将归关键字super所拥有,同样,子类一旦隐藏了继承的方法,那么子类创建的对象就不能调用被隐藏的方法,该方法的调用由关键字super负责。

(2)使用super调用父类的构造方法

  • 当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的某个构造方法,也就是说,如果子类的构造方法没有明显地致命使用父类的哪个构造方法,子类就调用父类不带参数的构造方法
  • 由于子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果早子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:super();
  • 若类中定义了一个或多个构造方法,那么Java不提供默认的构造方法(不带参数的构造方法),因此,当在父类中定义多个构造方法时,应当包括一个不带参数的构造方法,以防子类省略super时出现错误

5.final关键字

  • final类:可以使用final将类声明为final类。final类不能被继承,即不能有子类。(String类被Java修饰为final类,不允许用户程序扩展此类)
  • final方法:如果用final修饰父类中的一个方法,那么这个方法不允许子类重写,也就是说哦,不允许子类隐藏可以继承的final方法(不允许任何篡改)。
  • 常量:如果成员变量或局部变量被修饰为final,那它就是常量。由于常量在运行期间不允许再发生变化,所以常量在声明时没有默认值,这就要求程序在声明常量时必须指定该常量的值。

6.对象的上转型对象

特点

  • 上转型对象不能操作子类新增的成员变量(失掉了这部分属性),不能调用子类新增的方法。(失掉了一些行为)。
  • 上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法。上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。因此,如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定是调用了子类重写的实例方法。

7.继承与多态

多态案例

class  动物 {
   void cry() {
   }  
}
class 狗 extends 动物 {
   void cry() {
      System.out.println("汪汪....."); 
   }  
}
class 猫 extends 动物  {
   void cry() {
      System.out.println("喵喵....."); 
   }  
}
public class Example5_11 { 
   public static void main(String args[]) {
      动物 animal;
      animal = new 狗();
      animal.cry(); 
      animal=new 猫();
      animal.cry();
  }
}

运行结果

8.abstract类和abstract方法

(1)注意点

  • abstract类中可以有abstract方法
  • abstract类不能用new运算符创建对象
  • abstract类的子类:如果一个非abstract类是abstract类的子类,它必须重写父类的abstract方法,即去掉abstract方法的abstract修饰,并给出方法体。如果一个abstract类是abstract类的子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法。
  • abstract类的对象作上转型对象:可以使用abstract类声明对象,尽管不能使用new运算符创建该对象,但该对象可以成为其子类的上转型对象,那么该对象就可以调用子类重写的方法。

9.面向对象编程

  • 使用多态进行程序设计的核心技术之一是使用上转型对象,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法。
  • 所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象。
  • 面向抽象编程的目的是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。面向抽象编程的核心是让类中的每种可能的变化对应的交给抽象类的一个子类去负责,从而让该类的设计者不去关心具体实现,避免所设计的类依赖于具体的实现。面向抽象编程使设计的类容易应对用户需求的变化。

参考资料

1.intValue()的用法
2.Java之Integer类

posted @ 2019-03-20 21:02  20175215丁文韬  阅读(253)  评论(0编辑  收藏  举报