Java基础常见问题总结

来源:互联网 发布:零基础学php 编辑:程序博客网 时间:2024/06/05 07:48

二、Java基础部分

1、java中有哪些基本类型?

bbyte、short、int、long、float、double、char、boolean

2、java为什么能够跨平台运行?

因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种中间码”——字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再翻译成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。

3、String是基本数据类型吗?我可不可以写个类继承于String?

不是,Strng是引用类型;String是final的类,是不可以被继承的。

4、谈谈&和&&的区别?

  &和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作.。

5、Switch语句里面的条件可不可以是byte、long、String?使用时候还应注意什么?

switch里面的条件必须是能隐式的转化成为Int的故long和String不行,byte可以;使用Switch时候还应注意它的穿透,即每个case后要跟break;

6、short s1=1;s1=s1+1;有什么错?short s1 = 1;s1+=1 有什么错?

  对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
  对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

7、char为什么能存贮一个汉字?

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了全世界所  有的字体。

8、用最效率的办法算出2乘以8等于几

2<<3  位移运算是最底层的运算,他直接操作的是二进制,故效率最快。

9、final修饰变量时,该变量是对象时,对象的值可不可以改变?

final修饰的变量指的是引用不可变,对象的值是可以改变的。

10、静态变量和实例变量的区别?

静态变量也称为类变量,归全类共有,它不依赖于某个对象,可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对象才能访问到它。

11、面向对象的基本特征是什么?
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2)继承:子类拥有父类一切非私有的属性和方法。
3)封装:封装是把过程和数据包围封装起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装        的对象,这些对象通过一个受保护的接口访问其他对象。
4)多态性:同一种事物的不同种表现形式。

什么是类,什么是对象?
类:基于相同属性和行为一系列的事物  是对象的模板
对象  :客观存在 类的具体实例

12、作用域public,private,protected,以及不写时的区别?

    作用域        当前类        同包       子孙类       其他
    public                                      
    protected                                   ×
    default                            ×         ×
    private                   ×         ×         ×
    不写时默认为default。

13、Overload和Override的区别。

(Overload)重载:发生在同一个类之中,方法名相同、参数列表不同,与返回值无关、与final无关、与修饰符无关、与异常无关。
(Override)重写:发生在子类和父类之间,方法名相同、参数列表相同、返回值相同、不能是final的方法、重写的方法不能有比父类方法更为严格的修饰符权限、重写的方法所抛出的异常不能比父类的更大。
如果父类私有的方法,子类拥有方法签名相同的方法,子类不属于重写父类的方法,该方法属于子类的新方法。

14、构造器可不可以被重载或重写?

构造器不能被继承,故不能被重写、但可以被重载。

15、Java中有没有多继承?

java中没有多继承,但是可以多实现,即一个类实现多个接口。
虽然没有多继承,但是java中接口可以近似的实现多继承,那就是接口;接口和接口之间可以进行多继承。

16、抽象类和接口的区别?

1)抽象类继承与object,接口不继承object.
2)抽象类有构造器,接口中没有构造器。
3)抽象类中可以有普通成员变量和常量,接口中只能有常量,而且只能是public static final 不写默认。
4)抽象类中可以有抽象方法,也可以由普通的方法,接口中只能有抽象的方法而且修饰符只能是public abstract 不写默认。
5)抽象类中可以有final的方法,接口中不能有final的方法。
6)抽象类只能是单继承,多实现,接口是可以多继承其他接口,但是不能实现接口,和不能继承其他类。
7)抽象类中可以有静态的方法,接口中不可以。

17、java中实现多态的机制是什么?

重写、重载、父类的声明指向子类的对象。

18、int和integer的区别?

int是java的基本数据类型,integer是1.4版本后提供的基本类型包装类,当两者作为成员变量时,初始值分别为;int是0;integer是null;其中integer提供了一些对整数操作的方法,还定义了integer型数值的最值,其他基本类型也有对应的包装类,基本类型包装类的出现,使得java完全面向对象.

19、String和StringBuffer的区别?StringBuffer和StringBuilder区别?

  String是不可变的,对String类的任何改变都会返回一个新的String    对象。
  StringBuffer是可变的,对StringBuffer中的内容修改都是当前这个对象。
  String重写了equals方法和hashCode方法,StringBuffer没有重写equals方法。String是final的类。StringBuffer不是。
String创建的字符串是在常量池中,创建的变量初始化一次,如果再对该字符串改变会产生新的字符串地址值,StringBuffer是在堆中创建对象,当对字符串改变时不会产生新的字符串地址值,如果对字符串进行频繁修改的话建议使用StringBuffer,以节省内存。
StringBuffer和StringBuilder,StringBuffer是线程安全的,StringBulider是线程不安全的。当不考虑并发问题时候,请使用StringBulider。

20、String s=new String(xyz);创建了几个String Object?

两个对象,一个是"xyx",一个是指向"xyx"的引用对象s。

21、数组中有没有length()方法,String中有没有length()方法?

数组中没有length()方法,但是有length属性,String中有length()方法

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

这道题很有争议,我是通过debug模式分为两种情况进行测试的.
 1)finally中没有return时候:
会先执行try里面的,return会执行但是没有真正的return此时去执行了finally里面的,然后再返回来执行return.
2)finally中有return时候(其实这种情况不符合编程规范,会报黄线警告):
会先执行try里面的,return会执行但是没有真正的return此时去执行了finally里面的,然后执行finally里面的return,直接返回。

23、final, finally, finalize的区别。

final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
内部类要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

24、==和equals的区别?

需要分情况,基本数据类型和引用类型
==比较的是两个变量的内容和在内存中的地址值是否全部相等,如果要比较两个基本数据类型那必须用==
equals如果没有重写,则和==的意义一样,如果重写了,则会会按照重写的内容进行比较,javaBean规定当重写equals时候必须重写hashCode,如果不重写会出现对象相同但是hashCode不同,这样会出现问题,eg:HashSet存储元素时候是按照hashCode,如果重写equals不重写hashCode会导致同一个对象,存储了两次。

25、error和exception有什么区别?

异常与错误的区别
异常是程序员设计和实现 程序时出现的问题,是可以避免的,可以被程序员捕获,错误是硬件等方面的问题,无法被捕获的

26、heap和stack有什么区别。

java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

27、GC是什么? 为什么要有GC?

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

28、什么是内部类?分为哪几种?

内部类是指在一个外部类的内部再定义一个类。内部类作为外部类的一个成员,并且依附于外部类而存在的。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。
内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类。

29、为什么需要内部类?

典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。
使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了多重继承

30、内部类可以引用它的包含类的成员吗?有没有什么限制?

完全可以。如果不是静态内部类,那没有什么限制!fd
如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,例如,下面的代码:
class Outer
{
       static int x;
       static class Inner
       {
              void test()
              {
                     syso(x);
              }
       }
}
答题时,也要能察言观色,揣摩提问者的心思,显然人家希望你说的是静态内部类不能访问外部类的成员,但你一上来就顶牛,这不好,要先顺着人家,让人家满意,然后再说特殊情况,让人家吃惊。

31、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

可以继承其他类或实现其他接口。不仅是可以,而是必须!

32、使用java命令查看java虚拟机版本

javaversion

33、数字转字符有多少种方式,分别是什么

1)String.valueOf()
2)""  + 数字
3)Integer.toString()

34、Java创建对象有几种方式

1)new关键字
2)反射
3)克隆
4)反序列化

35、写一个反序列化实例

2.序列化与反序列化  对象流
   读写对象的 序列化 反序列化  
ObjectInputStream 反序列化

ObjectOutputStream 序列化
    序列化 ->就是把对象写入到文件中去保存 

     反序列化->就是把文件中的对象读取到内存中去

java.io.Serializable 接口 可序化接口
一个对象要实现 序列化与反序列化这个对象的类就必须实现Serializable 接口
序列化只能对类的成员属性,不能对类的static成员进行
eg:将person对象写入到文件中,然后从文件中读取对象到内存中去
public static void main(String[] args) {
                   try {
                             Person p = new Person(1, "张三丰", "男");
                             ObjectOutputStream objOut = new ObjectOutputStream(
                                                new FileOutputStream(new File("E:\\培训\\java\\object.txt")));
                             objOut.writeObject(p);
                             objOut.flush();
                             objOut.close();
                   } catch (Exception e) {
                             e.printStackTrace();
                   }
                   try {
                             ObjectInputStream inObj = new ObjectInputStream(
                                                new FileInputStream(new File("E:\\培训\\java\\object.txt")));
                             Person person = (Person) inObj.readObject();
                             System.out.println(person);
                             System.out.println(person.num);//
                   } catch (Exception e) {
                             e.printStackTrace();
                   }
原创粉丝点击