zoukankan      html  css  js  c++  java
  • java学习笔记day05

    1.final关键字:防止被继承的类或覆写的方法修改,变量或方法被final定义后
      会在内在中存在

      特点:
       1)可以修饰类、函数、变量。
       2)被final修饰的类不可以被继承。
       3)被final修饰的方法不可以被覆盖。
       4)被final修饰的变量是常量,只能赋值一次。通常被修饰的变量所有字母大写。
       5)内部类只能访问被final修饰的局部变量,这个比较少用。

    2.抽象类:
      抽象方法所在的类,必须标示为抽象类,因此,抽象类因抽象方法而存在的。
      特点:
      1)抽象类不能用new()建立对象。


    3.继承类
      子类和父类有一模一样的方法时,子类继承父类后,子类对象调用该方法默认是
      调用子类中的方法,如果需要调用父类中的该方法,则在子类的该方法内的第一句为super.方法();即可
      注意:子类方法覆盖父类方法时,方法的修饰权限一定要大于或者等于父类。
            子类中的静态方法只能覆盖父类中的静态方法。

    4.多态:多态的出现是为了提高程序的扩展性
      思想:通过面向对象的思想,可以指挥对象做事情,如果对象多了,指挥每一个对象,就变得麻烦了。 

       如何将麻烦的事情简单化?对这些对象进行分析并向上抽取,出现了共性类型后,就可以指挥共性类型

     做事情。

      多态的三个条件:继承,重写,父类引用指向子类对象。
      说明:1)类与类之间必须要有关系
            2)通常会出现覆盖操作

      在程序上的体现:
          1)父类或接口引用指向了自己的子类对象
             如:Father f = new Son();  //Fater可以是类,也可以是接口
       
          2)父类或接口引用接收自己的子类对象
             如:有个方法传递的参数为父类或子类
                 method(Father f){
                    ......
                 }
             调用改方法时,则
                 method(new Son){
                    ......
                 }

      成员函数在多态中的特点:
      1)编译时期,参考的是引用变量所属的类串是否有所调用的方法
      2)运行时期,参考的是对象所属的类中是否有调用的方法
      即:编译时看左边,运行时看右边。
      
      多态问题:
      1)当父类引用f指向其子类的对象的时候,通过f无法访问专属于子类对象的成员。
    为什么这样不可以?LZ有没有想过,因为f是FatherClass,所以编译器只知道f拥有FatherClass.class的

    信息,FatherClass.class以外的信息,编译器不知道,而子类的对象成员是在SonClass.class里,也就是

    说在FatherClass.class以外,所以f无法访问子类的对象成员

      2)假如子类中有对父类方法的重写,那么根据多态机制,通过f访问这个方法的时候实际访问的是子类

    中重写的方法。
    为什么这样可以?上面说了,f只能访问FatherClass.class的信息(注意这里指的是编译期编译器只知道f

    是FatherClass类型,不知道f具体指向什么对象,运行期才知道指向什么对象),而子类重写的方法,父

    类中也存在,即SonClass.class重写的方法,FatherClass.class里也有(如果SonClass.class里有但是

    FatherClass.class里没有的方法,f也不能直接调用),所以f可以访问,但是调用的时候(注意这里指的

    是运行期),f实际指向的是SonClass对象,所以调用的是SonClass对象的方法。

      3)问题是如果子类重写的方法中访问了专属于子类的成员变量,这时候通过父类引用f还可以调用那个

    被重写的方法吗?
    可以,要分清编译期和运行期,编译期是编译器检查语法和类型,运行期是解析器解析伪代码为机器指令

    而执行,编译期编译器会检查f的访问范围,也就是f的访问不超过FatherClass.class的信息就不会出错,

    运行期解析器会解析方法的代码指令,因为f指向子类对象,所以会解析子类重写的方法代码指令,而子类

    对象的内存空间是包含子类的成员变量的空间的,所以也不存在子类成员变量没有分配内存的问题,所以

    可以调用。

  • 相关阅读:
    织梦内容模型自定义字段设置一个随机数
    网页禁止右键查看源码屏蔽键盘事件
    面试官:如何防止 Java 源码被反编译?我竟然答不上来。。
    Elastic Job 同城主备、同城双活,高可用必备~
    再见,Spring Security OAuth!!
    怎么让 Linux 进程在后台运行?
    30 个 ElasticSearch 调优知识点,都给你整理好了!
    Spring Boot 2.5.4 发布,2.2.x 正式结束使命!
    移动端与服务器端之间的 token 怎么设计?
    最新数据库排行出炉,SQL Server 暴跌。。
  • 原文地址:https://www.cnblogs.com/luihengk/p/4036220.html
Copyright © 2011-2022 走看看