java基础面试题9

1.是否可以从一个静态方法内部发出对非静态方法的调用?

不可以,静态方法只能访问静态成员,因为非静态方法在调用的时候要先创建对象,在调用静态方法的时可能对象并没有被初始化。

2.如何实现对象克隆?

有两个方式:

1)实现Cloneable接口并重写Object类中Clone()方法;

2)实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正深度克隆,代码如下。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class MyUtil {
private MyUtil() {
throw new AssertionError();
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> T clone(T obj) throws
Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bout);
oos.writeObject(obj);
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bin);
return (T) ois.readObject();
// 说明:调用 ByteArrayInputStream 或 ByteArrayOutputStream对象的 close 方法没有任何意义
// 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
}
}

测试代码:

import java.io.Serializable;
class Person implements Serializable {
private static final long serialVersionUID = -9102017020286042305L;
private String name; // 姓名
private int age; // 年龄
private Car car; // 座驾
public Person(String name, int age, Car car) {
this.name = name;
this.age = age;
this.car = car;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name

}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", car=" +
car + "]";
}
}

 

class Car implements Serializable {
private static final long serialVersionUID = -5713945027627603702L;
private String brand; // 品牌
private int maxSpeed; // 最高时速
public Car(String brand, int maxSpeed) {
this.brand = brand;
this.maxSpeed = maxSpeed;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getMaxSpeed() {
return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
@Override
public String toString() {
return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed +
"]";
}
}

class CloneTest {
public static void main(String[] args) {
try {
Person p1 = new Person("Hao LUO", 33, new Car("Benz",300));
Person p2 = MyUtil.clone(p1); // 深度克隆
p2.getCar().setBrand("BYD");
// 修改克隆的 Person 对象 p2 关联的汽车对象的品牌属性
// 原来的 Person 对象 p1 关联的汽车不会受到任何影响
// 因为在克隆 Person 对象时其关联的汽车对象也被克隆了
System.out.println(p1);
} catch (Exception e) {
e.printStackTrace();
}
}
}

注意:基于 序列 化和 反序 列化 实现 的克 隆不 仅仅 是深 度克 隆, 更重 要的 是通 过泛型限 定, 可以 检查 出要 克隆 的对 象是 否支 持序 列化 ,这 项检 查是 编译 器完 成的 ,不是 在运 行时 抛出 异常 ,这种 是方 案明 显优 于使 用 Object 类的 clone 方法 克隆 对象。 让问题在 编译 的时 候暴 露出 来总 是好 过把 问题 留到 运行 时。

3.接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承具体类?

接口可以继承接口,而且还支持多继承接口,抽象类可以实现接口,抽象可以继承具体类也可以继承抽象类。

4.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

可以,但一个源文件中最多只包含一个公开类而且文件名必须和公开类的类名完全一致。

5.Anonymous Inner Class (匿名内部类)是否可以实现接口,是否可以继承其他类?

可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来调用监听和回调。

6.内部类可以引用它的包含类(外部类)的成员,有没有什么限制?

一个内部类可以访问创建它的外部类对象成员,包括私有成员。

7.java中的final关键字有哪些用法?

1)修饰类:表示该类不能被继承

2)修饰方法:表示不能被重写

3)修饰变量:表示变量只能被复制一次后值不能修改(常量);

 

posted @ 2022-07-04 13:07  开源遗迹  阅读(47)  评论(0)    收藏  举报