一、继承

1、继承的概念

  1. 如同生活中的子女继承父母拥有的所有财产,程序中的继承性是指子类拥有父类[数据结构](https://link.zhihu.com/?target=http%3A//c.biancheng.net/data_structure/)的方法和机制,这是类之间的一种关系;继承只能是单继承。<br />** 补充:Java中的继承只能单继承,但是可以通过内部类继承其他类来实现多继承。**
  1. /*继承*/
  2. public class Son extends Father{
  3. public void go () {
  4. System.out.println("son go");
  5. }
  6. public void eat () {
  7. System.out.println("son eat");
  8. }
  9. public void sleep() {
  10. System.out.println("zzzzzz");
  11. }
  12. public void cook() {
  13. //匿名内部类实现的多继承
  14. new Mother().cook();
  15. //内部类继承第二个父类来实现多继承
  16. Mom mom = new Mom();
  17. mom.cook();
  18. }
  19. private class Mom extends Mother {
  20. @Override
  21. public void cook() {
  22. System.out.println("mom cook");
  23. }
  24. }
  25. }

2、继承的好处

  子类拥有父类的所有属性和方法(除了private修饰的属性不能拥有)从而实现了实现代码的复用; 

3、语法规则

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1612230883853-b9a04ddc-ab23-4084-beda-f8faaabfae9c.png#align=left&display=inline&height=145&margin=%5Bobject%20Object%5D&name=image.png&originHeight=145&originWidth=500&size=24511&status=done&style=none&width=500)

(1)方法的重写(是继承的一种方法)

  子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法的重写。当调用方法时会优先调用子类的方法。
重写要注意:
  a、返回值类型
  b、方法名
  c、参数类型及个数
 都要与父类继承的方法相同,才叫方法的重写。
重载和重写的区别:**(重载和重写,是多态的表现)
方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。
(方法名一样,参数可不一样)
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。
(方法,参数和返回值都要一样)**

(2)继承的初始化顺序

  1、初始化父类再初始化子类
  2、先执行初始化对象中属性,再执行构造方法中的初始化。
 基于上面两点,我们就知道实例化一个子类,java程序的执行顺序是:
父类对象属性初始化——>父类对象构造方法——>子类对象属性初始化—->子类对象构造方法
image.png

(3)final关键字

 使用final关键字做标识有“最终的”含义。
  1. final 修饰类,则该类不允许被继承。
  2. final 修饰方法,则该方法不允许被覆盖(重写)
  3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次
  4. final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量

(4)super关键字

 在对象的内部使用,可以代表父类对象。
  1、访问父类的属性:super.age
   2、访问父类的方法:super.eat()
 super的应用:
 首先我们知道子类的构造的过程当中必须调用父类的构造方法。其实这个过程已经隐式地使用了我们的super关键字。
 这是因为如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
 那么如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行
要注意的是**:如果子类构造方法中既没有显示调用父类的构造方法,而父类没有无参的构造方法,则编译出错。**
补充说明:虽然没有显示声明父类的无参的构造方法,系统会自动默认生成一个无参构造方法,但是,如果你声明了一个有参的构造方法,而没有声明无参的构造方法,这时系统不会动默认生成一个无参构造方法,此时称为父类有没有无参的构造方法。

二、封装

1、封装的概念

  1. 封装是将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。封装的目的在于保护信息,使用它的主要优点如下。<br /> Java 语言的基本封装单位是类。由于类的用途是封装复杂性,所以类的内部有隐藏实现复杂性的机制。Java 提供了私有和公有的访问模式,类的公有接口代表外部的用户应该知道或可以知道的每件东西,私有的方法数据只能通过该类的成员代码来访问,这就可以确保不会发生不希望的事情。

2、封装的优点

  1. 良好的封装能够减少耦合。
  2. 类内部的结构可以自由修改。
  3. 可以对成员变量进行更精确的控制。
  4. 隐藏信息,实现细节。

    Java 封装,说白了就是将一大坨公共通用的实现逻辑玩意,装到一个盒子里(class),出入口都在这个盒子上。你要用就将这个盒子拿来用,连接出入口,就能用了,不用就可以直接扔,对你代码没什么影响。

    3、封装的实现步骤

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1574587/1612231935141-860a1756-5ffd-4b4e-ae04-3f96a64d59f1.png#align=left&display=inline&height=306&margin=%5Bobject%20Object%5D&name=image.png&originHeight=306&originWidth=423&size=120565&status=done&style=none&width=423)

    三、多态

    1、多态的概念

    面向对象的多态性,即“一个接口,多个方法”。多态性体现在父类中定义的属性和方法被子类继承后,可以具有不同的属性或表现方式。多态性允许一个接口被多个同类使用,弥补了单继承的不足。
    image.png

    2、多态的好处

    可替换性、可扩充性、接口性、灵活性、简化性。**
    Map< String,String> map = new HashMap < String,String>();
    想换成HashTable实现,可以
    Map< String,String> map = new HashTable < String,String>();
    比如写一个方法,参数要求传递List类型,你就可以用List list = new ArrayList()中的list传递,但是你写成ArrayList list = new ArrayList()是传递不进去的。尽管方法处理时都一样。另外,方法还可以根据你传递的不同list(ArrayList或者LinkList)进行不同处理。

    3、Java中的多态

    java里的多态主要表现在两个方面:

    (1)引用多态  

      父类的引用可以指向本类的对象;
    父类的引用可以指向子类的对象;
    image.png

(2)方法多态

  根据上述创建的两个对象:本类对象和子类对象,同样都是父类的引用,当我们指向不同的对象时,它们调用的方法也是多态的。
  创建本类对象时,调用的方法为本类方法;
  创建子类对象时,调用的方法为子类重写的方法或者继承的方法;
  使用多态的时候要注意:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!
注意: 继承是多态的基础。
(3)重写和重载
多态一般可以分为两种:一个是重写override,一个是重载overload。
重写是由于继承关系中的子类有一个和父类同名同参数的方法,会覆盖掉父类的方法。重载是因为一个同名方法可以传入多个参数组合。
从jvm实现的角度来看,重写又叫运行时多态,编译时看不出子类调用的是哪个方法,但是运行时操作数栈会先根据子类的引用去子类的类信息中查找方法,找不到的话再到父类的类信息中查找方法。而重载则是编译时多态,因为编译期就可以确定传入的参数组合,决定调用的具体方法是哪一个了。
**