zoukankan      html  css  js  c++  java
  • Java面向对象重要关键字

    面向对象过程接触的重要关键字:extends   super   this   final   static 

    extends 关键字用作继承功能,可以申明一个类是从另外一个类继承而来的,一般形式如下:

      class 子类 extends 父类 { }

      继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

    继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

    • 子类拥有父类非private的属性,方法。

    • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

    • 子类可以用自己的方式实现父类的方法。

    • Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。

    • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。

    super 与 this 关键字

      super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

      this关键字:指向自己的引用。

      super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法。super 也可以用在子类的子类中,Java 能自动向上层类追溯。父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。
    super 关键字的功能:

      • 调用父类中声明为 private 的变量。
      • 点取已经覆盖了的方法。
      • 作为方法名表示父类构造方法。

    无论是 super() 还是 this(),都必须放在构造方法的第一行。
    值得注意的是:

    • 在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
    • 不能在构造方法以外的任何方法内调用构造方法。
    • 在一个构造方法内只能调用一个构造方法。

    如果编写一个构造方法,既没有调用 super() 也没有调用 this(),编译器会自动插入一个调用到父类构造方法中,而且不带参数。
    最后注意 super 与 this 的区别:super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。

    static 的内存分配

      静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。

    注意静态变量虽然也可以通过对象来访问,但是不被提倡,编译器也会产生警告。static 的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static 变量,它都会被初始化。类变量(class variables)用关键字 static 修饰,在类加载的时候,分配类变量的内存,以后再生成类的实例对象时,将共享这块内存(类变量),任何一个对象对类变量的修改,都会影响其它对象。

    静态方法

      静态方法是一种不能向对象实施操作的方法。例如,Math 类的 pow() 方法就是一个静态方法,语法为 Math.pow(x, a),用来计算 x 的 a 次幂,在使用时无需创建任何 Math 对象。因为静态方法不能操作对象,所以不能在静态方法中访问实例变量,只能访问自身类的静态变量。
      以下情形可以使用静态方法:

      • 一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如 Math.pow())。
      • 一个方法只需要访问类的静态变量。

      main() 也是一个静态方法,不对任何对象进行操作。实际上,在程序启动时还没有任何对象,main() 方法是程序的入口,将被执行并创建程序所需的对象。
      关于静态变量和静态方法的总结:

        • 一个类的静态方法只能访问静态变量;
        • 一个类的静态方法不能够直接调用非静态方法;
        • 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;
        • 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;
        • 静态方法不能被非静态方法覆盖;
        • 构造方法不允许声明为 static 的;
        • 局部变量不能使用static修饰。

    final关键字

      final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

    声明类: final class 类名 {//类体}

    声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

    :实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final

    在 Java 中,声明类、变量和方法时,可使用关键字 final 来修饰。final 所修饰的数据具有“终态”的特征,表示“最终的”意思。具体规定如下:

    • final 修饰的类不能被继承。
    • final 修饰的方法不能被子类重写。
    • final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次。
    • final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有 一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
    • final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。

    final 一般用于修饰那些通用性的功能、实现方式或取值不能随意被改变的数据,以避免被误用,例如实现数学三角方法、幂运算等功能的方法,以及数学常量π=3.141593、e=2.71828 等。
    事实上,为确保终态性,提供了上述方法和常量的 java.lang.Math 类也已被定义为final 的。如果变量被标记为 final,其结果是使它成为常数。注意:想改变 final 变量的值会导致一个编译错误。

  • 相关阅读:
    java字符串的遍历以及字符串中各类字符的统计
    Java Jvm运行机制原理
    为什么面试要问 hashmap 的原理
    HashMap的实现原理
    redis两种持久化方式的优缺点
    2018No-java面试知识
    从架构演进的角度聊聊spring cloud都做了些什么?
    MySQL索引优化
    2018java面试知识汇总
    多线程—7种同步方法
  • 原文地址:https://www.cnblogs.com/sdlzspl/p/7201094.html
Copyright © 2011-2022 走看看