1. main方法为什么是静态的,能不能改为非静态的
由于JVM在运行Java应用程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用因此需要限制为public static。
不能改为非静态
,main方法必须声明为静态的,这样JVM才可以调用main方法而无需实例化他的类。
2. main方法能被重写吗
在Java中静态方法在编译时会编译在一起,main方法是静态方法,所以在Java中不能重写静态方法。
3. Java语法糖是什么意思
指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员适用,简而言之,语法糖让程序更加简洁,有更高的可读性。
常见的语法糖包括
- 自动装箱拆箱
- 泛型
- 增强的for循环
- 字符串连接符(+)
- 方法引用
4. 为什么重写equals还要重写hashcode
HashMap中,如果要比较key是否相等,要同时使用这两个函数。
因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址。
这样,即便有相同含义的两个对象,比较也是不相等的。HashMap中比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等在比较equals(),若相等则认为是相等。
否则,认为他们不相等。
5. 如何实现对象克隆
- 实现cloneable接口并重写object类中的clone方法。
- 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。
6. 内部类的分类有哪些
在Java中,内部类是一个相对独立的类,但他被定义在另一个类的内部。内部类可以访问其外部类的所有成员,并提供了更好的封装性和代码组织方式。根据定义的位置和特性,内部类主要分为以下几种。
- 成员内部类
- 定义:定义在类内部但在方法外的内部类。
- 特点:
– 可以访问外部类的所有成员(包括私有成员)。
– 是非静态的,必须通过外部类的实例来创建。
– 可以被定义为private、protected、public或默认访问级别。
- 静态内部类
- 定义:使用static关键字修饰的内部类。
- 特点:
– 只能访问外部类的非静态成员。
– 可以通过外部类名直接创建,不需要外部类的实例。
– 可以被定义为private、protected、public或默认访问级别。
- 局部内部类(也称作方法内部类)
- 定义:定义在方法或者代码块内部的内部类。
- 特点:
– 他的作用域仅限于定义他的方法或者代码块。
– 可以访问外部类的所有成员。
– 不能定义静态成员(包括静态方法和静态变量)
– 不能使用访问修饰符修饰。
- 匿名内部类
- 定义:没有名字的内部类,通常用于实现接口或者抽象类的实例化。
7. 局部内部类和匿名内部类访问局部变量的时候,为什么变量必须加上final
示例:
public class Outer{
void outMethod(){
final int a = 10;
class Inner{
void innerMethod(){
System.out.println(a);
}
}
}
}
上述例子,变量a必须加上final,因为生命周期不一致,局部变量直接存储在栈中,当方法结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出错,加了final,可以确保局部内部类使用的变量与外层的局部变量区分开。
8. 抽象方法是否可同时是静态方法、本地方法或者被synchronized修饰
都不能
抽象方法需要子类重写,而静态方法无法被重写。
本地方法是native实现的
synchronized和方法的实现细节有关,抽象方法不涉及实现细节。
9. 类的实例化顺序
比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序。
先静态、先父后子。
一个类的实例化过程
:
- 父类中的static代码块,当前类的static。
- 顺序执行父类的普通代码块。
- 父类构造函数。
- 子类普通代码块。
- 子类构造函数
- 子类方法执行。
10. float f = 3.2 是否正确
不正确
3.2是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型,会造成精度丢失,因此需要强制类型转换
float f = (float) 3.2.