Java面试题总结(一)---Java基础
java面试题总结(一)---java基础
1、面向对象的特征有哪些?
答:面向对象的特征主要有以下几个:
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不需要了解全部的问题,而只是选择其中的一部分,避免考虑一些与目标无关的细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2)继承:一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且新类可以修改或增加新的方法使之更适合特殊的需要。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2、作用域public,private,protected,以及不写时的区别?
答:区别如下:
作用域 当前类 同包 子孙类 其他
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
不写时默认为default。
3、short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错?
答:short s1 = 1; s1 = s1 + 1;s1+1运算结果是int 型,需要强制转换类型;short s1 = 1; s1 += 1;可以正确编译,自动类型提升。
4、java 有没有goto?
答:goto 是java 中的保留字,现在没有在java 中使用,可能以后会使用。
5、int 和integer 有什么区别?
答:java 提供两种不同的类型:基本数据类型和引用类型;
int 是java 的基本数据类型,integer 是java 为int 提供的封装类。
java 为每个基本数据类型提供了封装类
基本类型: boolean,char,byte,short,int,long,float,double
封装类型:boolean,character,byte,short,integer,long,float,double
6、&和&&的区别?
答:&&和&都表示与时,区别是&&只要第一个条件不满足,后面条件就不再判断,而&要对所有的条件都进行判断。&还可以用作位运算符,当&操作符两边的表达式不是 boolean 类型时,&表示按位与操作两个操作数中位都为1,结果才为1,否则结果为0。
7、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?
答:区别主要有两点:
a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型。
b.逻辑操作不会产生短路。
8、heap 和stack 有什么区别?
答:
1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由os回收,分配方式倒是类似于链表。
要点:堆,队列优先,先进先出(fifo—first in first out)。栈,先进后出(filo—first-in/last-out)。
9、math.round(11.5) 等于多少? math.round(-11.5)等于多少?
答:math.round(11.5)==12 math.round(-11.5)==-11 round 方法返回与参数最接近的长整数,参数加1/2 后求其floor(向下取整)。
10、swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在string上?
答:switch(ex)中,ex是一个整数表达式。因此传递给switch 和case语句的参数应该是int、short、char 或者byte。long,string 都不能作用在swtich上。
11、编程题: 用最有效率的方法算出2 乘以8 等于几?
答: 2 << 3。
12、数组中有没有length()这个方法? string 中有没有length()这个方法?
答:数组中没有length()这个方法,有length 属性。string中 有length()这个方法。
13、在java 中,如何跳出当前的多重嵌套循环?
答:在最外层循环前加label 标识,然后用break:label 方法即可跳出多重循环。
14、构造器constructor 是否可被override?
答:构造器constructor 不能被继承,因此不能重写overriding,但可以被重载overloading。
15、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,有相同的hash code。java中对于eqauls方法和hashcode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashcode值一定要相同;(2)如果两个对象的hashcode相同,它们并不一定相同。
16、string 类是否可以被继承?
答:string 类是final 类,故不可以被继承。
17、以下二条语句返回值为true 的有:
a:“beijing”==“beijing”;
b:“beijing”.equalsignorecase(new string(“beijing”));
答:a 和b 。equalsignorecase()方法将一个 string 与另一个 string 进行比较时,不考虑大小写。如果两个字符串的长度相等,并且两个字符串中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。equals方法和equalsignorecase方法都是应用十分广泛的方法,两者之间的区别为equals方法在比较的过程中严格区分大小写,而equalsignorecase方法在比较的过程中忽略大小写。
18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会变的。
19、我们在web 应用开发中经常遇到输出某种编码的字符,如iso8859-1,如何输出一个某种编码的字符串?
答:
public string translate(string str) {
string tempstr = "";
try {
tempstr = new string(str.getbytes("iso-8859-1"), "gbk");
tempstr = tempstr.trim();
} catch (exception e) {
system.err.println(e.getmessage());
}
return tempstr;
}
20、string, stringbuffer stringbuilder 的区别。
答:string 的长度是不可变的;stringbuffer 的长度是可变的,如果你对字符串中的内容,需要经常进行修改时,那么使用stringbuffer,如果最后需要string,可以使用stringbuffer 的tostring()方法转换成string;线程安全;stringbuilder是jdk1.5发布的,它和stringbuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。运行速度快慢为:stringbuilder > stringbuffer > string通常应该优先使用stringbuilder 类,由于它不执行同步,所以速度更快。
21、overload 和override 的区别。overloaded 的方法是否可以改变返回值的类型?
答:方法的重写overriding 和重载overloading 是java 多态性的不同表现。重写overriding 是父类与子类之间多态性的一种表现,重载overloading 是一个类中多态性的一种表现。如果在子类中定义的某个方法与其父类中某个方法有相同的名称和参数,我们说该方法被重写了(overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们的参数个数或参数类型不同,则称为方法的重载(overloading)。overloaded 的方法是可以改变返回值的类型。
22、定义类a 和类b 如下:
class a {
int a = 1;
double d = 2.0;
void show() {
system.out.println("class a: a=" + a + "\td=" + d);
}
}
class b extends a {
float a = 3.0f;
string d = "java program.";
void show() {
super.show();
system.out.println("class b: a=" + a + "\td=" + d);
}
}
(1) 若在应用程序的main 方法中有以下语句:
a a=new a();
a.show();
则输出的结果如何?
(2) 若在应用程序的main 方法中定义类b 的对象b:
a b=new b();
b.show();
则输出的结果如何?
答:输出结果为:
1)class a: a=1 d=2.0 ;
2)class a: a=1 d=2.0
class b: a=3.0 d=java program。
23、简述jvm 加载class 文件的原理机制?
答:java中的所有类,都需要由类加载器装载到jvm中才能运行。类加载器本身也是一个类,而它的工作就是把class文件从硬盘读取到内存中。在写程序的时候,我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。jvm 中类的装载是由classloader 和它的子类来实现的,java classloader是一个重要的java 运行时系统组件。它负责在运行时查找和装入类文件的类。
24、char 型变量中能不能存贮一个中文汉字?为什么?
答:可以,因为java默认采用unicode编码,一个char 占2个字节,一个汉字也是占2个字节,所以放一个中文汉字是没问题的。
25、abstract class 和interface 有什么区别?
答:含有 abstract 修饰符的类即为抽象类,抽象类不能创建实例,含有抽象方法的类必须定义为 abstract class。接口是一种特殊的抽象类,接口中的所有方法都必须是抽象的,接口中的方法默认定义为 public abstract 类型,接口中的成员变量类型默认为 public static final。
二者的区别:
(1) 抽象类可以有构造方法,接口中不能有构造方法。
(2) 抽象类中可以有普通成员变量,接口中没有普通成员变量。
(3) 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的方法。
(4) 抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse 不报错,但一般不使用,因为默认类型子类不能继承),接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
(5) 抽象类中可以包含静态方法,在 jdk1.8 之前接口中不能不包含静态方法,jdk1.8 以后可以包含。
(6) 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
(7) 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
26、static nested class(嵌套类)和 inner class(内部类)的不同?
答:nested class 一般是c++的说法,inner class 一般是java的说法。
nested class分为静态static nested class 的和非静态的 inner class。static nested class 是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。
27、java 中会存在内存泄漏吗,请简单描述。
答:会;理论上java因为有垃圾回收机制(gc)不会存在内存泄露问题(这也是java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被gc回收,因此也会导致内存泄露的发生。例如hibernate的session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。
28、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能。不能是native的,本地方法是由本地代码(如c代码)实现的方法,抽象方法是没有实现的,不能是synchronized的,synchronized和方法具体实现细节相关,抽象方法没有方法的实现。不能是static的,static方法是不能被覆盖的,而abstract方法正是要子类去覆盖它。
29、静态变量和实例变量的区别?
答:静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。
30、是否可以从一个static 方法内部发出对非static 方法的调用?
答:不可以, 静态方法只能访问静态变量,实例方法可以访问静态变量和实例变量。
下一篇: 学JAVA的第十九天,抽象类注意事项