关键字:

  • 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 Interface
实例化 不能    不能
抽象类一般只能作为其他类的基类。一个类只能有一重继承关系。 一个类可以实现多个interface
数据成员 可有私有的,默认是friendly 型,其值可以在子类中重新定义,也可以重新赋值,可以非abstract 不可有私有的,默认是public static final 型,且必须赋初值,实现类中不能重新定义,不能改变其值。
方法成员 可以私有的,可以有非abstract方法,必须实现 不可有私有的,默认是public,abstract 类型
设计理念 表示的是“is-a”关系 表示的是“like-a”关系
实现 需要继承,要用extends 需要实现,用implements

抽象类(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则可以保证变量的修改可见性和原子性

详细的 synchronize 和 volatile用法介绍请见博文:Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集) 第二节【二、线程同步】

Java 面试总结(一) —— 面试常问的关键字总结的更多相关文章

  1. 找工作笔试面试那些事儿(8)---常问的CC++基础题

    这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...

  2. Java 面试总结 面试常问的关键字总结

    文章出处http://www.cnblogs.com/IUbanana/p/7116520.html 关键字: final finalize finally throws和throw static关键 ...

  3. 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!

    本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...

  4. Java面试官最常问的volatile关键字

    在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...

  5. Java面试常问的问题(转载)

    并发.JVM.分布式.TCP/IP协议 1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的.以下简单模拟一个数据结构的连环炮. ...

  6. 大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)

    大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)   现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法.一 ...

  7. 面试常问的dubbo的spi机制到底是什么?

    前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...

  8. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

  9. Android相关面试题---面试官常问问题

    版权声明:本文为寻梦-finddreams原创文章,请关注: http://blog.csdn.net/finddreams/article/details/44513579 一般的面试流程是笔试完就 ...

随机推荐

  1. maven 热部署至tomcat

    1.配置tomcat的界面访问账号和权限./tomcat/conf目录下tomcat-users.xml添加 这里是根据自己的需求添加的一个角色权限 <role rolename="a ...

  2. OpenCV探索之路(五):图片缩放和图像金字塔

    对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用 ...

  3. 【设计模式】单一职责原则(SRP)

    单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下: 单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能 ...

  4. 二叉树遍历 C#

    二叉树遍历 C# 什么是二叉树 二叉树是每个节点最多有两个子树的树结构 (1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层有叶子结点,并 ...

  5. 关于MySQL数据库的一些操作

    启动:net start MySQL 关闭:net stop MySQL (也可以用quit:) 登录到MySQL:mysql -u root -p -u : 所要登录的用户名; -p : 告诉服务器 ...

  6. Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源

    熟悉Entity Framework应该对以下图片不陌生,他就是ADO.NET实体数据模型向导:可以将数据库的表自动生成模型类,或者创建Code First的模型文件. 但是这个模型向导默认只显示微软 ...

  7. CoreOS, Kubernetes, etcd

    CoreOS CoreOS Container Linux is the leading container operating system, designed to be managed and ...

  8. LR11 scan correlation 卡死解决方案

    LR11 scan correlation 卡死解决方案 笔者在录制脚本时是勾选Enable correlation during recording的,导致后续每次脚本回放都会弹出scan corr ...

  9. C#访问ORALCE数据库

    随着时间的推移知识也在更新,原来可用的技术也会被淘汰或更新. framework4.0开始不再支持System.Data.OracleClient了,但是令人欣慰的是ORACLE公司自己出了一个Ora ...

  10. Swift 入门之简单语法(三)

    集合 数组 数组使用 [] 定义,这一点与 OC 相同 //: [Int] let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 遍历 for num in nu ...