zoukankan      html  css  js  c++  java
  • javase的一些基础(2)

      继承的注意事项:

                  A:子类只能继承父类所有非私有的成员(成员方法和成员变量)

                  B:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。

                  C:不要为了部分功能而去继承

             那么,我们什么时候考虑使用继承呢?

                  继承其实体现的是一种关系:"is a"。

                         Person

                                Student

                                Teacher

                         水果

                                苹果

                                香蕉

                                橘子          

                  采用假设法。

                         如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

      继承中成员变量的关系:

                  A:子类中的成员变量和父类中的成员变量名称不一样,这个太简单。

                  B:子类中的成员变量和父类中的成员变量名称一样,这个怎么玩呢?

                         在子类方法中访问一个变量的查找顺序:

                                a:在子类方法的局部范围找,有就使用

                                b:在子类的成员范围找,有就使用

                                c:在父类的成员范围找,有就使用

                                d:如果还找不到,就报错。

      this和super的区别?

                  分别是什么呢?

                         this代表本类对应的引用。

                         super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)

                  怎么用呢?

                         A:调用成员变量

                                this.成员变量 调用本类的成员变量

                                super.成员变量 调用父类的成员变量

                         B:调用构造方法

                                this(...)    调用本类的构造方法

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

                         C:调用成员方法

                                this.成员方法 调用本类的成员方法

                                super.成员方法 调用父类的成员方法

    继承中构造方法的关系

                  A:子类中所有的构造方法默认都会访问父类中空参数的构造方法

                  B:为什么呢?

                         因为子类会继承父类中的数据,可能还会使用父类的数据。

                         所以,子类初始化之前,一定要先完成父类数据的初始化。

                        

                         注意:子类每一个构造方法的第一条语句默认都是:super();

      如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?

                  报错。

           如何解决呢? 

                  A:在父类中加一个无参构造方法

                  B:通过使用super关键字去显示的调用父类的带参构造方法

                  C:子类通过this去调用本类的其他构造方法

                         子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。

                        

           注意事项:

                  this(...)或者super(...)必须出现在第一条语句上。

                  如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化,所以必须放在第一条语句上。

      继承中成员方法的关系:

                  A:子类中的方法和父类中的方法声明不一样,这个太简单。

                  B:子类中的方法和父类中的方法声明一样,这个该怎么玩呢?

                         通过子类对象调用方法:

                                a:先找子类中,看有没有这个方法,有就使用

                                b:再看父类中,有没有这个方法,有就使用

                                c:如果没有就报错。

      方法重写:子类中出现了和父类中方法声明一模一样的方法。

          

      方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值无关。

      子类对象调用方法的时候:先找子类本身,再找父类。

                 

      方法重写的应用:

                  当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。

                  这样,即沿袭了父类的功能,又定义了子类特有的内容。

      方法重写的注意事项

                  A:父类中私有方法不能被重写

                         因为父类私有方法子类根本就无法继承

                  B:子类重写父类方法时,访问权限不能更低

                         最好就一致

                  C:父类静态方法,子类也必须通过静态方法进行重写

                         其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解

                        

                  子类重写父类方法的时候,最好声明一模一样。

        A:一个类的静态代码块,构造代码块,构造方法的执行流程

                         静态代码块 > 构造代码块 > 构造方法

        B:静态的内容是随着类的加载而加载

                         静态代码块的内容会优先执行

        C:子类初始化之前先会进行父类的初始化

      final可以修饰类,方法,变量

           特点:

                  final可以修饰类,该类不能被继承。

                  final可以修饰方法,该方法不能被重写。(覆盖,复写)

                  final可以修饰变量,该变量不能被重新赋值。因为这个变量其实常量。

      面试题:final修饰局部变量的问题

                  基本类型:基本类型的值不能发生改变。

                  引用类型:引用类型的地址值不能发生改变,但是,该对象的堆内存的值是可以改变的。

      final修饰变量的初始化时机

                  A:被final修饰的变量只能赋值一次。

                  B:在构造方法完毕前。(非静态的常量)

      由于继承中方法有一个现象:方法重写。

        所以,父类的功能,就会被子类给覆盖调。

        有些时候,我们不想让子类去覆盖掉父类的功能,只能让他使用。

         这个时候,针对这种情况,Java就提供了一个关键字:final

      多态的前提:

                  A:要有继承关系。

                  B:要有方法重写。其实没有也是可以的,但是如果没有这个就没有意义。

      多态中的成员访问特点:

                  A:成员变量

                         编译看左边,运行看左边。

                  B:构造方法

                         创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。

                  C:成员方法

                         编译看左边,运行看右边。

                  D:静态方法

                         编译看左边,运行看左边。

                         (静态和类相关,算不上重写,所以,访问还是左边的)

                        

                  由于成员方法存在方法重写,所以它运行看右边。

      多态的弊端:

          不能使用子类的特有功能。    

          我就想使用子类的特有功能?行不行?

            行。      

          怎么用呢?

            A:创建子类对象调用方法即可。(可以,但是很多时候不合理。而且,太占内存了)

            B:把父类的引用强制转换为子类的引用。(向下转型)

                 

      对象间的转型问题:

                  向上转型:

                         Fu f = new Zi();

                  向下转型:

                         Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。

  • 相关阅读:
    Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)
    SAP 公司间开票 报错 :0080264464 000000 销售机构 未定义
    C++虚函数、纯虚函数,继承及多态、友元
    postgre 用户权限管理
    mysql 主从搭建
    vue 配置开发线上环境
    基于Ant Design UI框架的React项目
    postgresql数据库报“connections on Unix domain socket "/tmp/.s.PGSQL.5432"?”
    postgres 连接数查看与设置
    修改postgresql密码
  • 原文地址:https://www.cnblogs.com/lenbore/p/4749732.html
Copyright © 2011-2022 走看看