Java 面试常问的关键字总结

关键字:

  • final finalize finally

  • throws和throw

  • static关键字的作用

  • abstract和 interface

  • super和 this

  • synchronize和 volatile

  • 1. final finalize finally对比

    (1)性质不同

  • final为关键字;

  • finalize为方法;

  • finally为为区块标志,用于try语句中;

  • (2)作用不同

  • final:用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final常量的具体用法将在下面进行介绍);final定义的变量值不可变,方法不可覆写,类不可继承。

  • 定义变量:一旦初始化(声明处或构造函数中)便不可改变。对基本类型是其值不可变,对引用类型是引用不可变;(String天生就是final的)

  • 定义方法:1)使用final定义的方法,不允许覆写,认为其功能满足要求无需扩展时;2)允许编译器将所有对此方法的调用转化为inline(行内机制),即可以将此方法直接复制在调用处,而不是进行例行的方法调用(保存断点、压栈),可以提高效率。但如果过多的话,会造成代码膨胀,反而会影响效率,慎用。

  • 定义类:无法被继承,这也就意味着此类在一个继承树中是一个叶子类;类成员是不是final都可以。

  • finalize:方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行I/0操作);

  • finally{}:用于标识代码块,与try{}进行配合,是异常处理模型的补充,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行;不可单独使用,在一个try...catch...finally语句块中最多只有一个finally;一般用来维护对象的内部状态,清理非内存资源。

  • 2. throws和throw对比

    (1)使用位置不同

  • throw位于方法体内部,可以作为单独语句使用;

  • throws位于方法头部的参数列表后面,不能单独使用;

  • (2)内容不同

  • throw抛出一个具体的异常对象,而且只能是一个;

  • throws声明抛出的异常类,可以同时声明多个;

  • (3)作用不同

  • throw用于在程序中抛出异常,一旦执行说明一定有异常抛出,由方法体内部语句处理异常;

  • throws用于声明在该方法内可能抛出的异常类,如果抛出了异常,由该方法的调用者处理,层层上抛;

  • 总结:函数调用时,如果需要向上层抛出异常,就必须在函数头部显式地声明(throws Exception1, Exception2)异常类型;如果仅需要在方法体内部处理异常,方法体内部可自行处理该异常,thorw抛出具体的异常实例(catch(Exception1 e){...})。

    3. static关键字的作用

    static关键字可用来修饰属性、方法、代码块,目的是把对象相关的变成类相关的,即:不加static的成员是对象相关的,归单个对象所有;加static修饰的成员是类成员,可以通过类名直接调用,归所有对象所有。

    static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:

  • 类名.静态方法名(参数列表…)

  • 类名.静态变量名

  • (1)static修饰属性(类变量、静态变量)

  • 被static修饰的变量,叫静态变量或类变量,可通过类名直接访问;没有被static修饰的变量,叫实例变量。

  • 静态变量为本类所有对象共享;实例变量只属于单个对象。

  • 静态变量在内存中只有一个拷贝,在类加载时被创建和初始化,JVM只为其分配一次内存(节省内存)。类加载过程只进行一次,因此静态变量也只会被创建一次;实例变量在创建对象时被初始化,在内存中有多个拷贝,每创建一个对象就会为其分配一次内存,各实例变量间互不影响(灵活)。

  • 所以一般在需要实现以下两个功能时使用静态变量:

    1).在对象之间共享值时;2).方便访问变量时

    (2)static修饰方法(静态方法)

  • static修饰的方法,叫静态方法,可通过类名直接访问,为本类所有对象共享;

  • 静态方法不能访问本类的非静态成员(包括实例变量和方法,因为非静态则和特定的对象关联,就不能全类共享了),但是非静态方法可以访问静态成员(ofcourse,静态成员全类共享);

  • 静态方法中不能出现this和super关键字(因为this是指向当前对象,super.成员名调用父类成员);

  • 因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract;

  • 子类覆盖父类的静态方法时,只能依然覆盖为静态方法(一日static终生static),但是没有多态。

  • Java中main方法必须为static的原因:

    在类加载时无法创建对象,而静态方法可以不通过对象调用,所以在类加载时可以通过main方法入口运行程序。

    (3)static修饰代码块(初始化块、静态代码块)

    格式: static{...}

    static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

    初始化总结(静态变量->实例变量->按声明初始化->执行构造方法)

    1)首次使用某个类时,JVM查找相应的类文件并加载(Java只有在必要时才会逐步载入相应的类文件)

    首先为所有的静态变量分配存储空间并初始化为默认值(全局变量),然后按照声明静态变量时指定的初始化动作的顺序,以及静态初始化块中的语句在类定义中出现的顺序依次执行。这些静态的初始化动作只会在其所属类的类文件加载时执行一次。

    2)类文件加载完毕后,如果需要创建类的对象,则进行如下初始化动作

    JVM为所有的实例变量分配足够的存储空间并初始化为默认值(局部变量);然后按声明实例变量时指定初值的初始化动作和实例初始化块中的语句在类中出现的顺序依次执行,之后再调用相应的构造方法。

    4. abstract和 interface对比

    stract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,区别:

    抽象类(Abstract Class):

    (1)只能作为其他类的基类,不能被实例化(new);

    (2)抽象类中的成员是不是abstract无所谓,并不是必须的。(可以有抽象成员,也可以没有任何抽象成员)

    (3)抽象类不能同时是final的。抽象的总是希望被继承,而final类不可被继承。final和abstract不可同时存在。

    (4)非抽象类继承抽象类,必须覆盖其所有的抽象成员。抽象类继承抽象类,可以不覆盖所有的抽象成员。

    (5)抽象类允许被声明

    接口(interface):

    接口的本质是一种特殊的抽象类,用来描述系统对外提供的所有服务。

    (1)接口中,所有方法都是公开、抽象的:public abstract。(都必须被继承)

    (2)接口中,所有属性都是公开、静态、常量:public static final,且必须赋初值。(所有实现类共享且不可改变)

    接口总是希望被实现被访问的,因此所有成员都必须是公开的(public),确保外界可以访问。接口仅仅描述系统可以做什么,但不指明如何去做,具体操作由实现类完成,因此方法都是abstract的,都必须被继承;接口不涉及任何的实现细节,因此无构造方法,接口不能被实例化;无变量,只有静态常量(static final),因为要被所有的实现类共享;类的继承只能单继承,但是接口可以一次实现多个,用“,”隔开。

    5. super和 this对比

    super:

    super可以理解为是指向自己父类对象的一个指针,指的是离自己最近的一个父类。

    用法:

  • super.成员名(变量名或者方法名):显式调用父类的同名成员,当然成员不能是private的(不允许子类访问)。因为当子类和父类存在同名成员时,因为子类成员优先级更高,此时会隐藏父类的相应成员。

  • super(参数列表);:调用父类的构造函数,注意super语句一定要放在函数体的第一条 :

  • this:

    this可以理解为指向当前对象自身的一个指针,即当前正在执行本方法的那个对象实例。位于函数体内部。

    用法:

  • this.成员名:引用成员变量。因为函数参数或者函数中的局部变量和成员变量同名的话,成员变量被屏蔽,此时要访问成员变量则需要使用“this.成员变量”的方式引用。

  • this(参数列表);:调用本类中参数表一致的另一个构造函数,注意应作为构造函数中的第一条语句。

  • 引用构造函数时:

    super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

    this和super都无需声明。

    6. synchronize和 volatile对比

    (1)作用范围:volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别;

    (2)volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

    (3)volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

    (4)volatile只能在线程内存和主内存之间同步一个变量的值,而synchronized则同步在线程内存和主内存之间的所有变量的值,通过锁住和释放监听器来实现。

    (5)volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

    (6)显然,synchronized在性能上将比volatile更加有所消耗

    (7)volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

    学习Java的同学注意了!!!
    学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群346942462,我们一起学Java!

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 202,723评论 5 476
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 85,080评论 2 379
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 149,604评论 0 335
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 54,440评论 1 273
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 63,431评论 5 364
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 48,499评论 1 281
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 37,893评论 3 395
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 36,541评论 0 256
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 40,751评论 1 296
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 35,547评论 2 319
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 37,619评论 1 329
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 33,320评论 4 318
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 38,890评论 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 29,896评论 0 19
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,137评论 1 259
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 42,796评论 2 349
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 42,335评论 2 342

    推荐阅读更多精彩内容

    • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
      子非鱼_t_阅读 31,558评论 18 399
    • Advanced Language Features 知识点:一. static修饰符 static修饰符可以用来...
      风景凉阅读 429评论 0 0
    • 接口/抽象类意义规范、扩展、回调为其子类提供一个公共的类型 封装子类中得重复内容 定义抽象方法,子类虽然有不同的实...
      MigrationUK阅读 2,153评论 1 28
    • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
      ZaneInTheSun阅读 2,627评论 0 11
    • 今天五一长假前最后一天上班,下午三点父亲发来微信问到:儿子出发没?我记得之前告诉过他我晚上才回家的,可能父亲忘记了...
      石寰轩阅读 264评论 0 0