程序员面试题(五) java面试题

11、静态变量存在哪?
考察点:类
参考回答:
方法区

12、讲讲什么是泛型?
考察点:JAVA 泛型
参考回答:
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法 时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化, 类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/ 调用时传入具体的类型(类型实参)。
public class GenericTest {
public static void main(String[] args) {
/*
List list = new ArrayList();
list.add(“qqyumidi”);
list.add(“corn”);
list.add(100);
*/
List list = new ArrayList();
list.add(“qqyumidi”);
list.add(“corn”);
//list.add(100); // 1 提示编译错误
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2
System.out.println(“name:” + name);
}
}
}
采用泛型写法后,在//1 处想加入一个 Integer 类型的对象时会出现编译错误,通过 List,直接限定了 list 集合中只能含有 String 类型的元素,从而在//2 处无须进行强 制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是 String 类型 了。

13、解释 extends 和 super 泛型限定符-上界不存下界不取
考察点:JAVA 泛型
参考回答:
(1)泛型中上界和下界的定义
上界 <? extend Fruit>
下界 <? super Apple>
(2)上界和下界的特点
上界的 list 只能 get,不能 add(确切地说不能 add 出除 null 之外的对象,包括 Object)
下界的 list 只能 add,不能 get
(3)示例代码
import java.util.ArrayList;
import java.util.List;
class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}
public class CovariantArrays {
public static void main(String[] args) {
//上界
List<? extends Fruit> flistTop = new ArrayList();
flistTop.add(null);
//add Fruit 对象会报错
//flist.add(new Fruit());
Fruit fruit1 = flistTop.get(0);
//下界
List<? super Apple> flistBottem = new ArrayList();
flistBottem.add(new Apple());
flistBottem.add(new Jonathan());
//get Apple 对象会报错
//Apple apple = flistBottem.get(0);
}
}
(4)上界 <? extend Fruit> ,表示所有继承 Fruit 的子类,但是具体是哪个子类,无法确 定,所以调用 add 的时候,要 add 什么类型,谁也不知道。但是 get 的时候,不管是什么子类, 不管追溯多少辈,肯定有个父类是 Fruit,所以,我都可以用最大的父类 Fruit 接着,也就是把 所有的子类向上转型为 Fruit。
下界 <? super Apple>, 表示Apple的所有父类,包括Fruit, 一直可以追溯到老祖宗Object 。 那么当我 add 的时候,我不能 add Apple 的父类,因为不能确定 List 里面存放的到底是哪个父 类。但是我可以 add Apple 及其子类。因为不管我的子类是什么类型,它都可以向上转型为 Apple 及其所有的父类甚至转型为 Object 。但是当我 get 的时候,Apple 的父类这么多,我用什么接 着呢,除了 Object,其他的都接不住。
所以,归根结底可以用一句话表示,那就是编译器可以支持向上转型,但不支持向下转型。 具体来讲,我可以把 Apple 对象赋值给 Fruit 的引用,但是如果把 Fruit 对象赋值给 Apple 的引 用就必须得用 cast。

14、是否可以在 static 环境中访问非 static 变量?
考察点:static 变量
参考回答:
static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机 载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量, 编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

15、谈谈如何通过反射创建对象?
考察点:类
参考回答:

  • 方法 1:通过类对象调用 newInstance()方法,例如:String.class.newInstance() - 方法 2:通过类对象的 getConstructor()或 getDeclaredConstructor()方法获得构造器 (Constructor)对象并调用其 newInstance()方法创建对象,例如: String.class.getConstructor(String.class).newInstance(“Hello”);

16、Java 支持多继承么?
考察点:JAVA 多继承
参考回答:
Java 中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是 java 中的接口 支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子 接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

17、接口和抽象类的区别是什么?
考察点:抽象类
参考回答:
Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于: 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。 类可以实现很多个接口,但是只能继承一个抽象类 类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象 的。
抽象类可以在不提供接口方法实现的情况下实现接口。 Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。 Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private,protected 或者 是 public。 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法 的话是可以被调用的。 也可以参考 JDK8 中抽象类和接口的区别

18、Comparable 和 Comparator 接口是干什么的?列出它们的区别。
考察点:comparable 接口
参考回答:
Java 提供了只包含一个 compareTo()方法的 Comparable 接口。这个方法可以个给两个对象 排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。 Java 提供了包含 compare()和 equals()两个方法的 Comparator 接口。compare()方法用来给两 个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals() 方法需要一个对象作为参数,它用来决定输入参数是否和 comparator 相等。只有当输入参数也 是一个 comparator 并且输入参数和当前 comparator 的排序结果是相同的时候,这个方法才返回 true。

19、面向对象的特征有哪些方面
考察点:JAVA 特征
参考回答:
(1)抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。 抽象并不打算了解全部问题,而只 是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 (2)继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。 对象的一个新类可以从现有的类中派 生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原 始类称为新类的基类(父类)。派生 类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的 需要。 (3)封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基 本概念,即现实世界可以被描绘成一 系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 (4) 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享 、代码共享的优势,很好的解决了应用程序函数同名问题。

20、final, finally, finalize 的区别。
考察点:声明
参考回答:
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally 是异常处理语句结构的一部分,表示总是执行。 finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以 覆盖此方法提供垃圾收集时的其他资源 回收,例如关闭文件等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值