综合了网上的一些面试经,整理出来一部分资料,后续会有补充,希望大佬们多多指点!
finalize()是Object的protected方法,子类可以覆盖该方法来实现资源清理工作,GC在回收对象之前调用该方法。
finalize()方法的通用格式如下:
protected void finalize(){//protected关键字是为了防止在该类之外定义的代码访问finalize()标识符
//finalization code here
}
Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize() 方法。
但是注意以下几点:
对象逃脱死亡的最后一次机会。(只要重新与引用链上的任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大,且无法保证各个对象的调用顺序。可用try-finally或其他替代。
不可以,被static final修饰的变量只能在被定义的时候或者类的静态代码块中初始化,一旦赋值后就不能再改变了。static final相当于类常量,就是在类被加载进内存的时候就要为属性分配内存,static块就是类被加载的时候执行且被执行依稀,所以可以在其中初始化
final引用恒定不变,引用的对象内容可以变
表示该类不能被继承
Java的异常处理都是通过这五个关键字来实现的
super主要存在与子类方法中,用于指向子类对象中父类对象
使用场景:访问父类的属性、函数、构造函数
一样的,程序正常运行
不是
在C语言中,siazeof是一个判断数据类型长度符的关键字,它可以返回一个对象或者类型所占的内存字节数
是因为Java是一种纯面向对象的编程语言,它将内存管理的细节都交给JVM来进行,同时Java是一种跨平台的语言,可移植性好,数据类型在机器中的大小都相同
而C/C++中需要sizeof是因为要移植,不同的数据类型在不同的机器上的大小可能不同,开发人员需要知道对应的数据类型大小
内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。
非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。
一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。
静态变量是和类绑定到一起的,而不是类的实例对象。每一个实例对象都共享同样一份静态变量。也就是说,一个类的静态变量只有一份,不管它有多少个对象。类变量或者说静态变量是通过static这个关键字来声明的。类变量通常被用作常量。静态变量通常通过类名字来进行访问。当程序运行的时候这个变量就会创建直到程序结束后才会被销毁。类变量的作用域和实例变量是一样的。它的初始值和成员变量也是一样的,当变量没被初始化的时候根据它的数据类型,会有一个默认值。类似的,静态方法是属于类的方法,而不是类对象,它的调用并不作用于类对象,也不需要创建任何的类实例。静态方法本身就是final的,因为重写只会发生在类实例上,静态方法是和类绑定在一起的,不是对象。父类的静态方法会被子类的静态方法屏蔽,只要原来方法没有声明为final。非静态方法不能重写静态方法,也就是说,你不能在子类中把一个静态方法改成实例方法。
简单来说:静态属性随着类的加载而加载,静态类不能创建对象,直接用类名来调用
静态方法不依靠对象而存在,而直接与类有关,只要包含在类中就可以得到执行,而不一定依附于对象的存在而执行。因此main方法作为程序的入口方法,在这之前是不可能有任何对象被建立的,也就是在main之前包括main自身不可能是非静态方法。所以main方法一定是静态的,有类就可以得到执行,进而有更多的静态方法或者非静态方法得到执行
不可以,静态函数中不能访问非静态成员变量,,只能访问静态变量,因为静态优先于对象存在,静态方法中更不可以出现this
静态变量是随着类的加载而执行的,JVM的代码编译运行顺序是编译、类的加载到执行,属于二者的过渡期。静态代码块也一样
成员方法可以访问静态变量,静态方法不能访问成员变量的原因是因为:被static修饰的属性和方法会随着类的加载而存在,而非静态成员变量则是在该类被创建对象之后才会初始化,如果只是类被加载而没有创建实例对象的话则无法访问非静态成员变量
byte、char、short、int、枚举类型、Java7后可以使用String|类型
while语法格式:
while(布尔表达式){
//语句
}
如果布尔表达式为真就会执行循环体中的语句然后在判断该布尔表达式如果还为真的话就会执行循环体中的语句一直到布尔表达式为false,然后循环结束
do/while语法格式:
do{
//语句
}while(布尔表达式)
先执行一次循环体,然后再判断布尔表达式是否为真,如果为真的话就继续执行循环体,再判断布尔表达式,知道布尔表达式为假就结束循环
两者的区别:while
是先判断在执行如果判断不成立,就不会执行;do/while
是先执行在判断,不管判断是否成立都会执行一次
备注:问题来源于唐尤华
当然,仅仅依靠这些还是不够的,还是需要多加代码联系和多读书的~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。