Java面试准备六:Java关键字

来源:互联网 发布:跟淘宝合作的购物软件 编辑:程序博客网 时间:2024/06/02 04:42

这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢。

下文参考Java关键字总结

  1. final关键字
  2. static关键字

1. final最终、不可改变

可用来修饰类、方法和变量(包括成员变量和局部变量)。
final方法在编译阶段绑定,称为静态绑定。

  • 修饰类
  • 修饰方法
  • 修饰变量
  • final参数
  • 注意

    修饰类

  • 使用情况:当一个类你永远不会让它被继承,就可以使用final进行修饰。
  • 这个类不能被继承,不能有子类。
  • final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式的指定为final方法。

    修饰方法

  • 使用情况:只有在想明确禁止该方法在子类中被覆盖的情况下才将 方法设置为final的。
  • 类的private方法会隐式的被指定为final方法。

    修饰变量

  • 修饰变量是final用得最多的地方。
  • 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的。

    final参数

  • 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值或者引用指向。道理同final变量。

    注意

  • 一个类不能同时是abstract又是final。abstract以为这必须扩展类,final意味着不能扩展类。一个方法不能同时是abstract方法又是final。abstract意味着必须重写方法,final意味着不能重写方法。两者是相互矛盾的。
  • 当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或初始化构造器或构造器中进行初始化赋值
  • final变量和普通变量的区别。当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会进行优化,会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问这个常量,不需要再运行时确定。这普通变量在编译时,确定不了自身的值,需要在运行时才能知道。(这里不大了解)
  • 局部内部类和匿名内部内只能访问局部final变量。因为这里的局部变量,在编译阶段便需要确定下来。也就是说,如果局部变量的值再编译期间就可以确定,则直接在匿名内部类里面创建一个拷贝。如果局部变量的值无法在编译期间确定,则通过构造器传参的方式来对拷贝进行初始化赋值。(不明白)

2. static静态
static可以修饰类,方法,属性以及代码块。

  • 修饰属性
  • 修饰方法
  • 修饰代码块
  • 修饰类

    修饰属性

  • 一个类无论生成了多少个对象,所有这些对象共同使用唯一一份静态的成员变量
  • 一个对象对该静态成员变量进行了修改,其他对象的该静态成员变量的值也会随之发生变化。
  • 通过“类名 . 成员变量名”的方式来使用静态成员变量

    修饰方法

  • 通过“类名 . 方法名”的方式来访问静态方法。
  • 静态方法只能继承,不能重写。因为重写是用于表现多态的,而静态方法可以不生成实例直接用类名来调用,这就与重写的定义有所冲突,所以静态方法不能重写,只能是隐藏。
    举例:
    抽象类Mother
public abstract class  Mother {    public static void speak(){        System.out.println("说话...");    }}

继承类Child

public class Child extends Mother{// 在重写speck()方法时报错:This instance method cannot //override the static method from Mother//  private void speak() {//      System.out.println("say something");//  }       public static void main(String[] args) {        Child child = new Child();        child.speak();//只能隐藏    }}
  • static方法与非static方法:不能再静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量;可以在非静态方法中访问静态的成员变量。因为静态方法可以直接用类名来调用,而非静态成员变量是在创建对象实例时才为变量分配内存和初始化变量值。总的来说,能不能访问某个变量,要看它在被调用时系统有没有为它分配了内存和初始化变量值。
  • 不能再静态方法中使用this关键字。因为静态方法可以直接用类名来调用,而this实际上是创建实例时,实例对应的一个应用,所以不能再静态方法上使用this。

    修饰代码块

  • 静态代码块也就是完成一些初始化工作。
  • 首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到JVM上,然后由JVM加载这个类来生成对象,每个类只会被加载一次,所以静态代码块只会被执行一次;而构造方法在每次生成一个对象实例的时候都会调用类的构造方法。如果继承体系中既有构造方法,又有静态代码块,那么执行顺序是:首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。

    修饰类

  • static是可以用来修饰类的,但是只能用来修饰内部类。
  • 被static修饰的内部类可以用new关键字直接创建一个实例,不需要先创建外部类实例。可以这样理解,因为static主要是修饰类里面的成员,包括内部类、属性、方法这些。修饰这些变量的目的就是为了即便是不断地实例化该类,所有的对象实例都会共享这些static成员。因为是共享的、唯一的,所以,也就不需要在实例化这个类以后再通过这个类来调用这个成员了。直接调用通过类名static成员,这样更加方便。
0 0
原创粉丝点击