前言:
在这个竞争激烈的时代,想要脱颖而出,除了要比别人掌握更多的技术的同时,也要让你的能力被别人知道,面试就是一个途径。特整理以下面试题,供广大在路上的朋友们参考。
面试题:
1、public,private,protected,以及不写(default)时的区别?
答:
区别如上图,总结一下就是:
public
同一个工程就可以访问,protect
是不同包且不是其子类就不能访问,default
是同一个包下的就可以访问,private
只有同一个类才能访问。
2、面向对象的特征有哪些?
答:面向对象有四个特征,分别是:封装、继承、抽象、多态。
封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。封装的目的是实现"高内聚,低耦合"。普通洗衣机比全自动洗衣机更好用,是因为全自动洗衣机封装得更好,我们无需关心洗衣机怎么洗衣服,调用了哪些方法,我们只需要发一个洗衣服的指令给洗衣机就可以,这就是封装。
继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。打个比方:定义一个"狗"类,狗有鼻子眼睛(属性),会吃饭睡觉(方法),现在有一只经过训练的狗,会做算数题,会做算数题的狗也是狗,也有鼻子眼睛,也会吃饭睡觉,只是多了一个做算数题的方法,所以我们可以让这个"会做算术的狗"继承"狗"。继承提高了软件的可重用性和可扩展性。
抽象:抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,包括数据抽象和行为抽象。说起"抽象",其实顾名思义,所谓抽象就是非具体的东西。比如,苹果是具体的东西,看得见摸得着,香蕉也是具体的东西,苹果和香蕉都属于水果,但是水果不是具体东西,而是抽象的东西。所以就可以把苹果和香蕉的共性抽出来写成一个水果类,这个水果类就是抽象类。抽象有两种方式:抽象类和接口。子类与抽象类的关系是is a
,实现类与接口的关系是like a
。比如有三个类,"门"、"警报"、"警报门","警报门"也是"门",所以"门"应该是抽象类,"警报门"is a
"门";"警报门"还会发出警报,有"警报"的功能,但是我们不能说"警报门"是"警报",他们的关系是"警报门"like a
"警报",所以"警报"应该定义为接口。
多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。比如"水果 a = new 苹果()",这就用到了多态性。
3、Java基本数据类型有哪些?
答:Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type),Java 5以后引入的枚举类型也算是一种比较特殊的引用类型。
4、基本类型和包装类的区别?
答:
上图是基本类型对应的包装类。
区别:
①、包装类创建的是对象,拥有方法和字段.对象的调用都是通过引用对象的地址 ;而基本类型不是。
②、包装类是引用传递 而基本类型是值传递 ;
③、变量的值存储在栈里,而对象存储在堆里,相比而言,栈更高效,这也是java保留基本类型的原因。包装类创建的对象,可以使用api提供的一些有用的方法。更为强大。
5、float f=3.4;是否正确?
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4;
或者写成float f =3.4F;
。
6、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
答:对于short s1 = 1; s1 = s1 + 1;
由于1是int类型,因此s1+1
运算结果也是int 型,需要强制转换类型才能赋值给short型。而short s1 = 1; s1 += 1;
可以正确编译,因为s1+= 1;
相当于s1 = (short)(s1 + 1);
其中有隐含的强制类型转换。
7、下面的代码运行结果如何?
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
答:首先需要注意的是f1、f2、f3、f4四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。包装类装箱的本质是当我们给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf(),大家可以查阅一下源码,这个方法做了一个判断,当整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。
8、&和&&的区别?
答:&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是""短路与""。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals("")
,二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。
9、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。
10、Java有没有goto?
答:goto 是Java中的保留字,在目前版本的Java中没有使用。(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)。
11、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
答:
堆区:
提供所有类实例和数组对象存储区域,jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
栈区:
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中,每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
方法区:
又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class、常量和static变量。运行时常量池都分配在 Java 虚拟机的方法区之中。
例子:
A a = new A();
int b = 1;
final int c;
A是对象,所以在堆中;a是对象A的引用,所以在栈中;b是基本类型,所以在栈中;c是常量,所以在方法区。
12、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
答:在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
13、用最有效率的方法计算2乘以8?
答:2 << 3
效率最高,因为cpu直接支持位运算符。(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。
14、数组有没有length()方法?String有没有length()方法?
答:数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。
15、构造器(constructor)是否可被重写(override)?
答:构造器不能被继承,因此不能被重写,但可以被重载。
总结:
以上15个面试题都是Java的基础,来源于网络,经过了我的整理,希望能更容易让大家理解。
网友评论