A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liupeng_hm 黑马粉丝团   /  2017-7-12 17:23  /  1624 人查看  /  0 人回复  /   3 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 liupeng_hm 于 2017-7-23 16:45 编辑

JavaSE阶段面试题汇总<一>

PS:这只是部分面试题,后期如果有这个板块的面试题还会持续更新!!!
1、面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2String是最基本的数据类型吗?
基本数据类型包括byteintcharlongfloatdoublebooleanshort
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer
3int Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Intjava的原始数据类型,Integerjavaint提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
4String StringBuffer的区别
JAVA平台提供了两个类:StringStringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
5&&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算
符两边的表达式的结果都为 true 时,整个运算结果才为 true,否
则,只要有一方为 false,则结果为 false。
&&还具有短路的功能,即如果第一个表达式为 false,则不再计
算第二个表达式,例如,对于 if(str != null && !str.equals(“”))
表达式,当 str 为 null 时,后面的表达式不会执行,所以不会出现
NullPointerException 如果将&&改为&,则会抛出
NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33
&& ++y>0)不会增长
&还可以用作位运算符,当&操作符两边的表达式不是 boolean
类型时,&表示按位与操作,我们通常使用 0x0f 来与一个整数进行&
运算,来获取该整数的最低 4 个 bit 位,例如,0x31 & 0x0f 的结果为0x01
6final, finally,finalize的区别。
  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
       finally是异常处理语句结构的一部分,表示总是执行。
       finalizeObject类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
7OverloadOverride的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载OverloadingJava多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)Overloaded的方法是可以改变返回值的类型。
8errorexception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
9short s1 = 1; s1 =s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)
10Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math.round(11.5)==12
Math.round(-11.5)==-11
round方法返回与参数最接近的长整数,参数加1/2后求其floor.
11String s = newString("xyz");创建了几个String Object?
两个,一个是new出来的对象在堆中存放,一个是字符串常量在方法区的常量池存放。

12、在JAVA中如何跳出当前的多重嵌套循环?
    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,
ok:
   for(int i=0;i<10;i++)
   {
         for(int j=0;j<10;j++)
         {
               System.out.println(“i=” + i + “,j=” + j);
               if(j == 5) break ok;
         }
   }
另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
int arr[][] = {{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length && !found;i++)
   {
         for(int j=0;j<arr.length;j++)
         {
               System.out.println(“i=” + i + “,j=” + j);
               if(arr[j]  == 5)
               {
                     found = true;
                     break;
               }
         }
   }
13switch语句能否作用在byte上,能否作用在long上,能否作用在String?            * switch可作用于char byte short int
           * switch可作用于char byte short int对应的包装类
           * switch不可作用于long double float boolean,包括他们的包装类
           * switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
           * switch中可以是枚举类型
14、char  型变量中能不能存贮一个中文汉字? ?为什么
      
char 型变量是用来存储 Unicode 编码的字符的,unicode 编码字
      符集中包含了汉字,所以,char 型变量中当然可以存储汉字啦。不
      过,如果某个特殊的汉字没有被包含在 unicode 编码字符集中,那
      么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode
      编码占用两个字节,所以,char 类型的变量也是占用两个字节。

15、try {} 里有一个 n return 语句,那么紧跟在这个语句,那么紧跟在这个 y try  后的  finally {} 里的 e code 会不会被执行,什么时候被执行,在会不会被执行,什么时候被执行,在 n return  前还是后? ?

public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test() {
int x = 1;
try{
return x;
}finally{
++x;
}
}
}
---------执行结果 ---------
运行结果是 1,为什么呢?主函数调用子函数并得到结果的过程,
好比主函数准备一个空罐子,当子函数要返回结果时,先把结果
放在罐子里,然后再将程序逻辑返回到主函数。所谓返回,就是
黑马程序员
子函数说,我 不运行了,你主函数继续运行吧,这没什
么结果可言,结果是在说这话之前放进罐子里的。
16、"=="和 和 equals  方法究竟有什么区别(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区
别自然就出来了,混在一起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变
量所对应的内存中所存储的数值是否相同,要比较两个基本类型的
数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块
内存,对象本身占用一块内存(堆内存),变量也占用一块内存,
例如 Objet obj = new Object();变量 obj 是一个内存,new Object()
是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对
象占用的那块内存的首地址。对于指向对象类型的变量,如果要比
较两个变量是否指向同一个对象,即要看这两个变量所对应的内存
中的数值是否相等,这时候就需要用==操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同,就
好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条 new 语句创建了两个对象,然后用 a,b 这两个变量分别指向
了其中一个对象,这是两个不同的对象,它们的首地址是不同的,
即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,
黑马程序员
而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,
例如,String input = …;input.equals(“quit”),许多人稍不
注意就使用==进行比较了,这是错误的,随便从网上找几个项目实
战的教学视频看看,里面就有大量这样的错误。记住,字符串的比
较基本上都是使用 equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类
的 equals 方法,Object 类的 equals 方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义 equals 方法,它默认的 equals
方法(从 Object 类继承的)就是使用==操作符,也是在比较两个变
量指向的对象是否是同一对象,这时候使用 equals 和使用==会得到
同样的结果,如果比较的是两个独立的对象则总返回 false。如果你
编写的类希望能够比较该类创建的两个实例对象的内容是否相同,
那么你必须覆盖 equals 方法,由你自己写代码来决定在什么情况即
可认为两个对象的内容是相同的
17、StringBuffer 与 与 StringBuilder  的区别
StringBuffer 和 StringBuilder 类都表示内容可以被修改的字
符串,StringBuilder 是线程不安全的,运行效率高,如果一个
字符串变量是在方法里面定义,这种情况只可能有一个线程访问
它,不存在不安全的因素了,则用 StringBuilder。如果要在类
里面定义成员变量,并且这个类的实例对象会在多线程环境下使
用,那么最好用 StringBuffer
18
下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
答:对于如下代码:
     String s1 = "a";
     String s2 = s1 + "b";
     String s3 = "a" + "b";
     System.out.println(s2 == "ab");
     System.out.println(s3 == "ab");
     第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
     题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s = "a" + "b" + "c" + "d";
System.out.println(s == "abcd");
最终打印的结果应该为true

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马