Java面试之关键字

综合了网上的一些面试经,整理出来一部分资料,后续会有补充,希望大佬们多多指点!

finalize

  • 什么是finalize()方法

finalize()是Object的protected方法,子类可以覆盖该方法来实现资源清理工作,GC在回收对象之前调用该方法。

finalize()方法的通用格式如下:

protected void finalize(){//protected关键字是为了防止在该类之外定义的代码访问finalize()标识符
 //finalization code here
}
  • finalize()方法什么时候被调用

Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize() 方法。

但是注意以下几点:

  1. 对象不一定会被回收
  2. 垃圾回收不是析构函数
  3. 垃圾回收只与内存有关
  4. 垃圾回收了finalize()都是靠不住的,只要JVM还有没耗尽内存的底部,它是不会浪费时间进行垃圾回收的
  • 析构函数(finalization)的目的是什么

对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。可用try-finally或其他替代。

final

  • final关键字有哪些用法
  1. 修饰数据:只能进行一次赋值操作,并在生命周期内不可改变他的值
  2. 修饰方法参数:表示在整个方法中我们不修改参数的值
  3. 修饰方法:表示方法不能被覆盖
  4. 修饰类:无法被继承
  • 能否在运行时想static final类型的赋值

不可以,被static final修饰的变量只能在被定义的时候或者类的静态代码块中初始化,一旦赋值后就不能再改变了。static final相当于类常量,就是在类被加载进内存的时候就要为属性分配内存,static块就是类被加载的时候执行且被执行依稀,所以可以在其中初始化

  • 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

final引用恒定不变,引用的对象内容可以变

  • 一个类被声明为final类型,表示了什么意思

表示该类不能被继承

  • throws, throw, try, catch, finally分别代表什么意义

Java的异常处理都是通过这五个关键字来实现的

  1. try指定一块预防所有异常的程序
  2. catch 紧跟在try后边,应包含一个catch字句来只in个你想要捕捉的” 异常”的类型
  3. throw指的语句抛出一个异常
  4. throws指的是声明方法可能抛出的异常类型
  5. finally不管发生什么异常都被执行的一段代码
  • final、finally、finallize的区别
  1. final修饰符。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,不能重载。
  2. finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中
  3. finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。 

Java 有几种修饰符?分别用来修饰什么

  • 类的修饰符:
  1. public:可以在其他任何类中使用,默认为统一包下的任意类
  2. abstract:抽象类,不能被实例化,可以包含抽象方法,抽象方法不能被实现,无具体功能,只能衍生子类
  3. final:被它修饰的类不能被继承
  • 成员变量
  1. static:类变量:类变量是指不管该类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量,因此可以通过类本身或者某个对象来访问类变量
  2. final:常量
  3. volatile:声明一个可能被同时并发运行的几个线程所控制和修改的变量
  4. abstract:只有声明部分,方法体为空,具体在子类中完成
  5. transient:(过渡修饰符)指定该变量是系统保留,暂时无特别作用的临时性变量
  6. 访问修饰符:
访问修饰符
  • 方法修饰符:
  1. public (公共控制符)
  2. private:(私有控制符)指定此方法只有自己类等方法访问,其他的类不能访问(包括子类)
  3. protected(保护访问控制符):指定该方法可以被它的类以及子类进行访问
  4. final,指定该方法不能被重载
  5. static:不需要实例化就可以调用的方法
  6. synchronized:同步修饰符,在多个线程中,该修饰符用于在运行前,对它所属的方法加锁来防止其他线程的访问,运行结束后可以解锁
  7. native:本地修饰符,指定该方法的方法体是用其他语言在程序外部写的

transient变量有什么特点

  1. 一旦变量被transient修饰,变量不在是对象持久化的一部分,该变量内容在序列化之后无法获得访问
  2. transient关键字只能被修饰变量,而不能修饰方法和类。注意本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现serializable接口
  3. 被transient关键字修饰的变量不能再被序列化,一个静态变量不管是否被transient修饰,均不能被序列化

super什么时候使用

super主要存在与子类方法中,用于指向子类对象中父类对象

使用场景:访问父类的属性、函数、构造函数

public static void 写成 static public void会怎样

一样的,程序正常运行

说明一下public static void main(String args[])这段声明里每个关键字的作用

  1. public:公共的权利,所有继承本类的子类都可以访问
  2. static:表明在类加载的时候这个方法或者成员变量都会被加载,而不需要创建对象就可以访问
  3. void:表示该方法没有返回值
  4. main:主方法,程序的开始
  5. (String[] args):参数,传递进来一个字符串数组的参数

sizeof 是Java 的关键字吗

不是

在C语言中,siazeof是一个判断数据类型长度符的关键字,它可以返回一个对象或者类型所占的内存字节数

  • 为什么Java中没有sizeof()?

是因为Java是一种纯面向对象的编程语言,它将内存管理的细节都交给JVM来进行,同时Java是一种跨平台的语言,可移植性好,数据类型在机器中的大小都相同

而C/C++中需要sizeof是因为要移植,不同的数据类型在不同的机器上的大小可能不同,开发人员需要知道对应的数据类型大小

static

  • static class 与 non static class的区别

内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。

非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。

一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

  • static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法
  1. “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
  2. Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
  3. 无法重写被private修饰的方法,因为被private修饰的父类方法在子类中是不可见的
  • 静态类型有什么特点

静态变量是和类绑定到一起的,而不是类的实例对象。每一个实例对象都共享同样一份静态变量。也就是说,一个类的静态变量只有一份,不管它有多少个对象。类变量或者说静态变量是通过static这个关键字来声明的。类变量通常被用作常量。静态变量通常通过类名字来进行访问。当程序运行的时候这个变量就会创建直到程序结束后才会被销毁。类变量的作用域和实例变量是一样的。它的初始值和成员变量也是一样的,当变量没被初始化的时候根据它的数据类型,会有一个默认值。类似的,静态方法是属于类的方法,而不是类对象,它的调用并不作用于类对象,也不需要创建任何的类实例。静态方法本身就是final的,因为重写只会发生在类实例上,静态方法是和类绑定在一起的,不是对象。父类的静态方法会被子类的静态方法屏蔽,只要原来方法没有声明为final。非静态方法不能重写静态方法,也就是说,你不能在子类中把一个静态方法改成实例方法。

简单来说:静态属性随着类的加载而加载,静态类不能创建对象,直接用类名来调用

  • main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态

静态方法不依靠对象而存在,而直接与类有关,只要包含在类中就可以得到执行,而不一定依附于对象的存在而执行。因此main方法作为程序的入口方法,在这之前是不可能有任何对象被建立的,也就是在main之前包括main自身不可能是非静态方法。所以main方法一定是静态的,有类就可以得到执行,进而有更多的静态方法或者非静态方法得到执行

  • 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用

不可以,静态函数中不能访问非静态成员变量,,只能访问静态变量,因为静态优先于对象存在,静态方法中更不可以出现this

  • 静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢

静态变量是随着类的加载而执行的,JVM的代码编译运行顺序是编译、类的加载到执行,属于二者的过渡期。静态代码块也一样

  • 成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量(建议自己用代码尝试一下)

成员方法可以访问静态变量,静态方法不能访问成员变量的原因是因为:被static修饰的属性和方法会随着类的加载而存在,而非静态成员变量则是在该类被创建对象之后才会初始化,如果只是类被加载而没有创建实例对象的话则无法访问非静态成员变量

switch

  • switch 语句中的表达式可以是什么类型数据

byte、char、short、int、枚举类型、Java7后可以使用String|类型

  • while 循环和 do 循环有什么不同

while语法格式:

while(布尔表达式){
 //语句
}

如果布尔表达式为真就会执行循环体中的语句然后在判断该布尔表达式如果还为真的话就会执行循环体中的语句一直到布尔表达式为false,然后循环结束

do/while语法格式:

do{
 //语句
}while(布尔表达式)

先执行一次循环体,然后再判断布尔表达式是否为真,如果为真的话就继续执行循环体,再判断布尔表达式,知道布尔表达式为假就结束循环

两者的区别while是先判断在执行如果判断不成立,就不会执行;do/while是先执行在判断,不管判断是否成立都会执行一次

备注:问题来源于唐尤华

当然,仅仅依靠这些还是不够的,还是需要多加代码联系和多读书的~

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大闲人柴毛毛

稳扎稳打JS——自由变量

自由变量的作用域在程序运行前就已经确定! 自由变量相当于Java中的全局变量,它在外层作用域中声明,但在内层作用域中使用,如下所示: var a = 1; f...

37870
来自专栏Hongten

java中静态变量和实例变量到底有什么区别_看了就知道啦

==================================================

9430
来自专栏Esofar 开发日记

JavaScript权威指南 - 函数

函数本身就是一段JavaScript代码,定义一次但可能被调用任意次。如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法。用于初始化一个...

9630
来自专栏C语言及其他语言

【编程经验】表达式和语句及选择结构

在C中,表达式代表值,而语句代表给计算机的指令。 表达式 表达式由运算符和操作数组成。最简单的表达式只是一个不带运算符的常量或者变量,例如12或者num。...

10320
来自专栏LhWorld哥陪你聊算法

python 使用小结

使用Python 已经一段时间了 ,现将python 中可能用到的技巧和一些知识点分享如下。

11910
来自专栏Android Note

Java 8之lambda表达式(一)

11230
来自专栏叁金大数据

自学Python二 Python中的屠龙刀(续)

秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数!

13230
来自专栏Linux驱动

指针学习(详解)

在指针中*是取内容,&是取地址 (在结构体中时:变量结构体用".",指针结构体用"->") 通常有两种的表示: 1. 通过指针向指向的地址内容赋值 *p=a;...

18850
来自专栏calmound

Javascript数组

定义    定义空数组       var arr = new Array();       var arr = [];    定义一个包含1,2,3的数组  ...

35460
来自专栏C语言及其他语言

C语句和程序流

1、 表达式和语句 在C中,表达式代表值,而语句代表给计算机的指令。 表达式 表达式由运算符和操作数组成。最简单的表达式只是一个不带运算符的常量或者变...

34560

扫码关注云+社区

领取腾讯云代金券