前因:
记录在牛客上刷题的错题记事本
1. 有以下类定义: 运行后:正确的是
class Foo {
final int i;
int j;
public void doSomething() {
System.out.println(++j + i);
}
}
A : 0
B : 1
C : 2
D : 不能执行,因为编译有错
正确答案选D, 类的final
成员变量必须满足以下其中一个条件
- 在构造函数中赋值
- 初始化赋值
2. 以下不是修饰符final的作用的是( )。
A : 修饰常量
B : 修饰不可被继承的类
C : 修饰不可变类
D : 修饰不可覆盖的方法
答案选C, final的作用:
- 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。
@Data
@AllArgsConstructor
class Student {
private Integer id;
private String name;
}
public static void main(String[] args) {
final Student student = new Student(1,"张三");
System.out.println(student);
student.setName("李四");
System.out.println(student);
}
Student(id=1, name=张三)
Student(id=1, name=李四)
-
修饰方法,方法不可被重写,但是还是可以重载
-
修饰类,类不可继承。
不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。
3. 在Java中,对于不再使用的内存资源,如调用完成的方法,“垃圾回收器”会自动将其释放。( )
A : 正确
B : 错误
答案选B, JVM 内存可简单分为三个区:
- 堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)
- 栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)
- 方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)
Java 的垃圾回收器(GC)主要针对堆区
4. java中下面哪些是Object类的方法()
A : notify()
B : notifyAll()
C : sleep()
D : wait()
答案选A,B,D,Object类中方法:
-
protected Object clone()创建并返回此对象的一个副本。
-
boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
-
protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
-
class getClass()返回此 Object 的运行时类。
-
int hashCode()返回该对象的哈希码值。
-
void notify()唤醒在此对象监视器上等待的单个线程。
-
void notifyAll()唤醒在此对象监视器上等待的所有线程。
-
String toString()返回该对象的字符串表示。
-
void wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
-
void wait(long timeout)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
-
void wait(long timeout, int nanos)在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。