JavaSE基础简答50题

Source

JavaSE简答题

1. 面向对象程序的主要结构特点是

第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。
第二:程序中的一切操作都是通过向对象发送消息来实现的,成相应的操作。对象接受到消息后,启动有关方法完相应的操作。

2. 什么是类?什么是对象?对象与类的关系是什么?

对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。对象可以认为是:数据+操作
类是对具有相同数据结构和相同操作的一类对象的描述。
类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
在面向对象程序设计中,总是先声明类,再由类生成对象。类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。

3. 什么是消息?消息具有什么性质?

在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。当对象接收到发向它的消息时,就调用有关的方法,执行相应的操作。
消息是一个对象要求另一个对象执行某个操作的规格的说明,通过消息传递才能完成对象之间的相互请求或相互协作。消息具有以下3个性质:
(1) 同一个对象可以接收不同形式的多个消息,做出不同的响应。
(2) 相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。
(3) 消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以不响应。

4. 什么是方法?消息和方法的关系是什么?

在面向对象程序设计中,要求某一对象作某一操作时,就向该对象发送一个响应的消息,当对象接收到发向它的消息时,就调用有关的方法,执行响应的操作。
方法就是对象所能执行的操作。方法包括界面和方法体两部分。方法的界面也就是消息的模式,它给出了方法的调用协议;方法体则是实现某种操作的一系列计算步骤,也就是一段程序。
消息和方法的关系是:对象根据接收到的消息,调用相应的方法;反过来,有了方法,对象才能响应相应的消息。

5. 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。

6. 简单叙述如何使一个Java源代码程序文件在控制台方式下运行起来。

答:
(1)步骤1:下载并安装JDK;
(2)步骤2:javac 编译 java文件
(3)步骤3:java 运行主程序所在的 class 文件

7. 什么是封装?请举例说明

在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。对象好象是一个不透明的黑盒子,表示对象属性的数据和实现各个操作的代码都被封装在黑盒子里,从外面是看不见的,更不能从外面直接访问或修改这些数据及代码。使用一个对象的时候,只需要知道它向外界提供的接口形式而无需知道它的数据结构细节和实现操作的算法。
封装机制可以将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口让对象去做。

8. 什么是抽象?请举例说明

抽象是对复杂世界的简单表示,抽象强调感兴趣的信息,忽略了不重要的信息。例如,设计一个学籍管理程序的过程中,考察某个学生对象时,只关心他的姓名、学好、成绩等,而对他的身高、体重等信息就可以忽略。
以一般观点而言,抽象是通过特定的实例(对象)抽象共同性质以后形成概念的过程。
抽象是对系统的简化描述或规范说明,它强调了系统中的一部分细节和特性,而忽略了其他部分。抽象包括两个方面:数据抽象和代码抽象(或称为行为抽象)。前者描述某类对象的属性或状况,也就是此类对象区别于彼类对象的特征物理量;后者描述了某类对象的共同行为特征或具有的共同操作。

9. 什么是继承?请举例说明。

继承所表达的是类之间的相关关系,这种关系使得某类对象可以继承另一类对象的特征和能力。现实生活中,继承是很普遍和容易理解的。例如我们继承了父母的一些特征,如种族、血型、眼睛的颜色等,父母是我们所具有的属性的基础。继承所表达的是对象之间相关的关系。这种关系使得某一类可以继承另一个类的特征和能力。

10. 什么是多态性?举例说明。

多态性也是面向对象程序设计的重要特性。它是指不同的对象收到相同的消息时产生不同的行为方式。例如我们同样双击windows系统桌面上的图标时,有的是打开多媒体播放器,有的是打开资源管理器。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接收消息的对象。不同的对象收到的相同的消息做出不同的动作。

11. 什么是方法重载?为什么要使用重载?

方法重载就是方法名称重复,加载参数不同。
在一个Java类中,定义多个同名的方法,如果方法名相同,方法参数不同,包括参数的类型和个数都不同,叫做方法的重载。调用重载方法时,Java 编译器通过检查调用的方法的参数类型和个数选择一个恰当的方法。方法重载常用于创建完成一组任务相似但参数的类型或参数的个数或参数的顺序不同的方法。
方法的重载,既可以发生在普通方法上,也可以发生在构造方法上。方法的重载,既可以发生在同类中,也可以发生在父子类中。
Java方法的重载:返回类型、修饰符可以相同,也可不同。要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两个重载的方法。

12. JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

13. final 在 Java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

14. 普通类和抽象类有哪些区别?

普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。

15. Integer与int的区别?

int是基本数据类型;Integer是int的包装类(封装类); 封装类可将接本数据类型封装后当作对象进行操作,并为各种基本数据类型提供各种转换功能。
例如Integer i = new Integer(10),即可实现将10这个int类型的基本数据类型变量封装,然后当作对象处理,进行诸如类型转换(转换为字符串或者十六进制数);也可通过Integer类中的静态方法或者非静态方法将字符串转换为基本数据类型,例如int i= Integer.parseInt(“10”)。

16. Float 与float的区别?

float是基本数据类型,Float是float包装类(封装类)。封装类可将接本数据类型封装后当作对象进行操作,并为各种基本数据类型提供各种转换功能。
例如Float f = new Float(3.4f);,即可实现将3.4f这个float类型的基本数据类型变量封装,然后当作对象处理,进行诸如类型转换(转换为字符串或者十六进制数);也可通过Float类中的静态方法或者非静态方法将字符串转换为基本数据类型,例如float f = Float.parseFloat(“12.3”)。

17. float f=3.4;是否正确?

答:不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)可能会造成精度损失,因此需要强制类型转换 float f =(float)3.4;
或者写成 float f =3.4f;。

18. Short x=1; x = x+1;是否正确?

答:不正确。1 是int,将int赋值给short变量可能会造成数据损失,因此需要强制类型转换 x = (short)(x+1);

19. path与classpath的区别?

答:
1.path的作用
path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6.0_10\bin\javac TheClass.java。path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径;而java的各种操作命令是在其安装路径中的bin目录下,所以在path中设置了JDK的安装目录后就不用再把java文件的完整路径写出来了,它会自动去path中设置的路径中去找;

2.classpath的作用
classpath是指定你在程序中所使用的类(.class)文件所在的位置,就如在引入一个类时:import javax.swing.JTable这句话是告诉编译器要引入javax.swing这个包下的JTable类,而classpath就是告诉编译器该到哪里去找到这个类(前提是你在classpath中设置了这个类的路径);如果你想要编译在当前目录下找,就加上“.”,如:.;C:\Program Files\Java\jdk,这样编译器就会到当前目录和C:\Program Files\Java\jdk\去找javax.swing.JTable这个类;还提下:大多数人都是用Eclipse写程序,不设classpath也没关系,因为Eclipse有相关的配置;

21. 什么是构造方法?

答:构造方法是完成对象初始化任务的方法,构造方法的名称和类同名,没有返回值类型,尽管构造访法看起来和一般的成员方法没有差别,但它不同于成员方法,构造方法不能直接调用,只能由new作符调用。

22. 构造方法有什么特点和作用?

答:构造方法的特点如下:在new操作符调用类的构造方法后为对象分配内存,确定对象的初始状态,初始化所用变量。在同一一个类中可以定义多个构造方法,名字相同参数不同。创建对象时,可以根据需要选择合适的构造方法初始化对象。

23. Overload 和 Override 有什么区别?

答:
Override : 发生在父类与子类中,方法名称相同,参数列表相同,方法体不同。
Overload : 发生在一个类中,方法名称相同,参数列表不同,方法体不同。

24. final 修饰的特性?

答:
(1)修饰变量: 变量在程序运行期不能被改变;
(2)修饰方法: 方法不能被重写;
(3)修饰类: 类不能被继承。

25. 什么是运行时多态?

答:在类层次结构的不同类中, 将方法名相同但实现功能不同的方法定义为抽象方法。在程序运行时根据程序运行的现场,才可确定一个基类的引用所指向某一个派生类的对象,来调用不同派生类的实现方法,从而实现实现运行时多态。

26. 什么是编译时多态?

答:在类层次结构的不同类中, 将函数名相同但实现功能不同的方法定义为抽象方法。在程序编译时就确定一个基类的引用就可以指向某一个派生类的对象,来调用该派生类的实现方法,从而实现实现编译时多态。

27. 类变量与实例变量的区别?

类变量也叫静态变量,也就是在变量前加了static 的变量;
实例变量也叫对象变量,即没加static 的变量;
区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象。

28. 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化

29. equals和==区别?

==是一种关系运算符,用来比较两个属性是否相等。如果比较的是基本类型,则是比较他们的值是否相等,如果比较的是对象,则是比较他们在内存中的地址是否相等。
equals是Object类中的一个方法,只能用来比较对象,不能比较基本类型。如果在对象中需要使用该方法,需要先对它进行重写,同时还要重写hashcode()方法。

30. “a==b”和“a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于比较两个不同对象的值是否相等。

31. 组合、聚合和关联有什么区别?

如果两个对象彼此有关系,就说他们是彼此相关联的。
组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。如:组合中,一个对象是另一个的拥有者,如果对象 A 是由对象 B 组合的,则 A 不存在的话,B一定不存在;而聚合则是指一个对象使用另一个对象,如果 A 对象聚合了一个对象 B,则即使 A 不存在了,B 也可以单独存在。

32. 什么是变长参数?变长参数的使用有哪些注意事项?

答:变长参数是指方法被调用时可以接受一个或多个值的参数变量。
变长参数的使用,使用时要注意,变长参数必须是最后一个参数,一个方法不能定义多个变长参数。还要避免带有变长参数的方法重载,写出两个不同的方法名即可。

33. 什么是Java中的泛型? 使用泛型的好处是什么?

泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用时传入具体的类型(类型实参)。

34. Java中泛型的本质是什么?

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

35. 简述面向对象的三大特征。

答:
(1) 封装。把客观事物封装成抽象的类。并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
(2) 继承。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
(3) 多态。允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

36. 什么是方法重载?

Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同。
调用方法时通过传递给它们的不同个数和类型的参数,以及传入参数的顺序来决定具体使用哪个方法。

37. 什么是多态?

为不同数据类型的实体提供统一的接口,不同的子类在继承父类后分别都实现或重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。当你闷 类的引用指向不同的子类对象后,响应相同的消息就会做出不同的动作。

38. 抽象类与接口的区别主要有哪些?

抽象类允许包含非抽象方法,而接口是不允许的;
抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
抽象类可以有构造函数;接口不能有。
实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
抽象类中的成员变量可以实现多个权限 public private protected final等,接口中只能用 public static final修饰
访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

39. 简述方法重写与方法重载的区别。

答:方法重写描述的是父类和子类的方法关系,而方法重载描述的是同一个类中多个同名方法的方法关系。除此之外方法重写和方法重载还有:Override 关键字、参数类型和参数个数、返回类型、抛出异常和权限控制符等不同点。

40. Error和Exception的区别

答:Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。如java.lang.StackOverFlowError和Java.lang.OutOfMemoryError。对于这类错误,Java编译器不去检查他们。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和预防,遇到这样的错误,建议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

41. 构造方法和成员方法有什么区别?

答:A. 格式区别 构造方法名和类名相同,并且没有返回值,也没有返回值类型,连void都没有 普通成员方法可以任意起名,必须有返回值类型,可以没有返回值 B. 作用区别 构造方法用于创建对象,并进行初始化值 普通成员方法是用于完成特定的功能 C. 调用区别 构造方法是在创建对象时被调用的,一个对象的建立,只调用一次相应的构造函数 普通成员方法是创建好的对象调用,一调用多次

42. 简述静态代码块与非静态代码块的不同之处。

静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

43. 你选择使用接口或抽象类的依据是什么?

接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

44. ArrayList 和 LinkedList 的区别是什么?

数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。

45. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法?

答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过 new 关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的 100、"hello"和常量都是放在静态区中。
栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。

46. 构造方法和成员方法有什么区别?

答:A. 格式区别 构造方法名和类名相同,并且没有返回值,也没有返回值类型,连void都没有 普通成员方法可以任意起名,必须有返回值类型,可以没有返回值 B. 作用区别 构造方法用于创建对象,并进行初始化值 普通成员方法是用于完成特定的功能 C. 调用区别 构造方法是在创建对象时被调用的,一个对象的建立,只调用一次相应的构造函数 普通成员方法是创建好的对象调用,一调用多次

47. 简述string和stringbuffer的区别?

答:String而是一个类,它被用来表示字符序列,其字符本身符合 Unicode 标准,初始化方式有两种。而StringBuffer是一个具有对象引用传递特点的字符串对象,可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。