面向对象程序设计课程题库理论.docx

上传人:小** 文档编号:13338094 上传时间:2020-06-15 格式:DOCX 页数:19 大小:91.33KB
返回 下载 相关 举报
面向对象程序设计课程题库理论.docx_第1页
第1页 / 共19页
面向对象程序设计课程题库理论.docx_第2页
第2页 / 共19页
面向对象程序设计课程题库理论.docx_第3页
第3页 / 共19页
点击查看更多>>
资源描述
Java 基础回顾说明Java和面向对象本身包罗万象,我们回顾的重点是基础知识。以下是问题和参考答案,完全对很难,发现一个“原则上的”错误,期末加2分。1、面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。- 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的Java与模式或设计模式精解中关于桥梁模式的部分)。- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是A系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。2、访问修饰符public,private,protected,以及不写(默认)时的区别?答:修饰符当前类同包子类其他包publicprotecteddefaultprivate类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。3、String 是最基本的数据类型吗?答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。4、java中类的属性和方法是什么?答:你可以把类比作一类事物,比如人类就是一个大类,而一个具体的人,比如小明,就是人类里面的一个对象。这个对象有眼睛、鼻子、耳朵这些器官,这些被称为对象的属性。这个人会跑,会跳会吃饭,这是人的动作,被称为对象的方法5、属性和方法是类的两个重要的组成部分,请具体说明属性和方法,并举例。属性和方法是类的两个重要的组成部分,其中,属性提供灵活的机制来读取,编写或计算私有字段的值,而方法则以一部分代码构成代码块的形式存在,用来实现一部分特定的功能。你可以把类比作一类事物,比如人类就是一个大类,而一个具体的人,比如小明,就是人类里面的一个对象。这个对象有眼睛、鼻子、耳朵这些器官,这些被称为对象的属性。这个人会跑,会跳会吃饭,这是人的动作,被称为对象的方法。具体而言,属性是一种用于访问对象或类的特性的成员。属性可以包括字符串的长度、字体的大小、窗体的标题和客户的名称。方法是一种用于实现可以由对象或类执行的计算或操作的成员。方法在类或结构中声明,声明时需指定访问级别、返回值、方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表明方法没有参数。举例:class People /属性 private String name; /名字private String sex; /性别 /方法public void eat(Food food) /吃 food 是 食物类6、int 和 Integer 哪个会占用更多的内存?答:Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。7、什么是开发平台?答:在软件开发的过程中,我们需要很多的工具来辅助我们的工作,不可能什么都从头自己做。我们把编程的环境和相应的辅助工具统称为开发环境,开发平台就是用来提供这个开发环境的。比如,车床工人需要一个车床才能工作一样。同样,Java 是一种开发平台Java 不单纯是一个编程的语言,它自身提供了一系列开发 Java 所需要的环境和工具,来进行编译、解释、文档生成、打包等。8、浅析JDK,JRE与JVM的含义和联系。答:JDK(Java Development Kit)是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。JRE(Java Runtime Environment)是指Java的运行环境,是面向Java程序的使用者,而不是开发者。JVM(Java Virtual Machine)是java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。如果安装了JDK,会发现你的电脑有两套JRE,一套位于Javajdkjre ,另外一套位于 Javajre目录下,后面这套比前面那套少了Server端的Java虚拟机。jdk的bin下有各种java程序需要用到的命令,与jre下的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,因为jre只是一个运行环境而已,与开发无关,正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。JRE的地位就像一台PC机一样,我们写好的Win32应用程序需要操作系统帮我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后,如果分别在硬盘上的两个不同地方安装了两套JRE,那么你可以想象你的电脑有两台虚拟的Java PC机,都具有运行Java程序的功能。所以我们可以说,只要你的电脑安装了JRE,就可以正确运行Java应用程序。9、举例说明如何定义和使用一个类,核心代码需注释含义。public class Puppy int puppyAge; public Puppy(String name) / 这个构造器仅有一个参数:name System.out.println(Passed Name is : + name ); / 设置年龄 public void setAge( int age ) puppyAge = age; / 获取年龄 public int getAge( ) System.out.println(Puppys age is : + puppyAge ); return puppyAge; public static void main(String args) /* 创建对象 */ Puppy myPuppy = new Puppy( tommy ); /* 通过方法来设定age */ myPuppy.setAge( 2 ); /* 调用另一个方法获取age */ myPuppy.getAge( ); /*你也可以像下面这样访问成员变量 */ System.out.println(Variable Value : + myPuppy.puppyAge ); 10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?答:Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行下取整。11、JAVA中构造方法,实例方法,类方法,有什么区别?答:构造方法, 是用来构造类的对象的,方法名和类名相同没有返回值。一般用 new 构造方法名() 来创建该类的对象。在不写构造方法的情况下会有一个默认的无参构造方法。实例方法, 简单地说就是可以通过类的实例(某个对象)调用的方法,也就是我们正常情况下使用的方法。实例方法也称成员方法。类方法, 简单地说就是直接可以用类名调用的方法,也就是被关键字static修饰的方法,它不需要创建类的对象来调用该方法。12、描述 以下Test 类的基本运行顺序。1. public class Test 2. private String name;3. private int age;4.5. public Test() 6. name = Tom;7. age = 20;8. 9. public static void main(String args) 10. Test t = new Test();11. System.out.println(t.name + 的年龄是 + t.age );12. 13. 答:运行的基本顺序是:(1)先运行到第 9 行,这是程序的入口。(2)然后运行到第 10 行,这里要 new 一个 Test,就要调用 Test 的构造方法。(3)就运行到第 5 行,注意:可能很多人觉得接下来就应该运行第 6 行了,错!初始化一个类,必须先初始化它的属性。(4)因此运行到第 2 行,然后是第 3 行。(5)属性初始化完过后,才回到构造方法,执行里面的代码,也就是第 6 行、第 7 行。(6)然后是第8行,表示 new 一个 Test 实例完成。(7)然后回到 main 方法中执行第 11 行。(8)然后是第 12 行,main方法执行完毕。13、数组有没有length()方法?String有没有length()方法?答:数组没有length()方法,有length 的属性。String 有length()方法。JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆。15、构造器(constructor)是否可被重写(override)?答:构造器不能被继承,因此不能被重写,但可以被重载。17、是否可以继承String类?答:String 类是final类,不可以被继承。继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。18、初始化子类必先初始化父类,请通过下面的Test类描述父类和子类之间的初始化顺序和运行顺序.1. public class Test extends Parent 2. private String name;3. private int age;4. public Test() 5. name=Tom;6. age=20;7. 8. public static void main(String args) 9. Test t = new Test();10. System.out.println(t.name + 的年龄是 + t.age);11. 12. 13. class Parent 14. private int num = 1;15. public Parent() 16. System.out.println(现在初始化父类);17. 18. public void test() 19. System.out.println(这是父类的test方法);20. 21. 答:上述类的基本运行顺序是:(1)先运行到第 8 行,这是程序的入口。(2)然后运行到第 9 行,这里要 new 一个 Test,就要调用 Test 的构造方法。(3)就运行到第 4 行,注意:初始化子类必先初始化父类。(4)要先初始化父类,所以运行到第 15 行。(5)然后是第 14 行,初始化一个类,必须先初始化它的属性。(6)然后是第 16 行。(7)然后是第 17 行,表示父类初始化完成。(8)然后是回到子类,开始初始化属性,因此运行到第 2 行,然后是第 3 行。(9)子类属性初始化完过后,才回到子类的构造方法,执行里面的代码,也就是第 5、6 行。(10)然后是第7 行,表示 new 一个 Test 实例完成。(11)然后回到 main 方法中执行第 10 行。(12)然后是第 11 行。19、String和StringBuilder、StringBuffer的区别?答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?答:重写是子类的方法覆盖父类的方法,要求方法名和参数都相同;重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同,最常见的重载的例子就是类的构造函数。方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。21、关键字 super用途是什么?答:答:可被用来引用该类的父类,它被用来引用父类的成员变量或方法。父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用super来显示。使用super调用父类的构造方法时,无论是 super 还是 this,都必须放在构造方法的第一行。通常,可通过从子类构造方法的第一行调用关键字 super 的手段,调用一个的父类构造方法作为子类初始化的一部分。要控制具体的构造方法的调用,必须给 super()提供合适的参数。当不调用带参数的 super时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。22、char 型变量中能不能存贮一个中文汉字,为什么?答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。23、抽象类(abstract class)和接口(interface)有什么异同?答:抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。25、StringBuffer和String、 StringBuilder的区别?答:StringBuffer类和String、StringBuilder一样,也用来代表字符串,String类是不可变类,任何对String的改变都 会引发新的String对象的生成;而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对 象.StringBufferd类与StringBuilder的原理和操作基本相同。区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。StringBuilder效率要略高于 StringBufferd。27、阐述静态变量和实例变量的区别。答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。29、下面的程序有错误?请改正并说明错误原因。class A A(String myStr) class B extends A B() public class Main public static void main(String args) Scanner scanner = new Scanner(System.in); 答:B类是A类的子类,会自动调用父类的构造函数。但是,A类没有定义无参构造方法,程序无法编译通过。通常,如果设计一个类的目的是为了被继承,最好实现一个无参构造方法,这样可以避免编译错误。当调用无参数的 super时,缺省的父类构造方法(即,不带参数的构造方法)被隐含地调用。在这种情况下,如果没有缺省的父类构造方法,将导致编译错误。30、什么是枚举类型?为什么需要枚举类型?请说明和举例.答:枚举类型 enum 是一种新的类型,在 JDK5.0 加入,允许用常量来表示特定的数据集。这些数据是分配时预先定义的值的集合,而且全部都以类型安全的形式来表示。在枚举类型没有加入到 Java 前,我们要想表达常量的集合,通常采用如下的方式:public class Test public static final int A = 1;public static final int B = 2;public static final int C = 3;public static final int D = 4;public static final int E = 5;那么我们在使用的时候就采用如下代码:Test.A 或者 Test.B 之类的代码。但是在这样做的时候,我们需要记住这类常量是 Java 中 int 类型的常量,这意味着该方法可以接受任何 int 类型的值,即使它和 Test 中定义的所有级别都不对应。因此需要检测上界和下界,在出现无效值的时候,可能还要包含一个 IllegalArgumentException。而且,如果后来又添加另外一个级别(例如 TEST.F,那么必须改变所有代码中的上界,才能接受这个新值。换句话说,在使用这类带有整型常量的类时,该解决方案也许可行,但并不是非常有效。枚举就为处理上述问题提供了更好的方法。把上面的例子改成用枚举的方式:public class Test public enum StudentGrade A, B, C, D, E, F;可以采用如下的方式进行使用public class Test public enum StudentGrade A, B, C, D, E, F;public static void main(String args) System.out.println(学生的平均成绩 为 = + StudentGrade.B);上面的示例都相当简单,但是枚举类型提供的东西远不止这些。您可以逐个遍历枚举值,也可以在switch语句中使用枚举值,枚举是非常有价值的。31、Java 中的构造器链是什么?答:当你从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。33、一个.java源文件中是否可以包含多个类(不是内部类)?有什么限制?答:可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?答:可以继承其他类或实现其他接口,在Swing、javaFX编程和Android开发中常用此方式来实现事件监听和回调。35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。36、Java 中的final关键字有哪些用法?答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。37、什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。不可变对象对于缓存是非常好的选择,因为你不需要担心它的值会被更改。不可变类的另外一个好处是它自身是线程安全的,你不需要考虑多线程环境下的线程安全问题。要写出这样的类,需要遵循以下几个原则:1.将类声明为final,所以它不能被继承2.将所有的成员声明为私有的,这样就不允许直接访问这些成员3.对变量不要提供setter方法4.将所有可变的成员声明为final,这样只能对它们赋值一次5.如果类中包含mutable类对象,那么返回给客户端的时候,返回该对象的一个拷贝,而不是该对象本身(该条可以归为第一条中的一个特例)当然不完全遵守上面的原则也能够创建immutable的类,比如String的hashcode就不是final的,但它能保证每次调用它的值都是一致的,无论你多少次计算这个值,它都是一致的,因为这些值的是通过计算final的属性得来的!下面是一个例子:public final class Contacts private final String name; private final String mobile; public Contacts(String name, String mobile) this.name = name; this.mobile = mobile; public String getName() return name; public String getMobile() return mobile; 38、数据类型之间的转换:- 如何将字符串转换为基本浮点类型?请举例答:调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;例如:String s=123.456;double num;num=Double.parseDouble(s);- 如何将字符串转为日期型?请举例一种方法是将字符串例如:String date=2006-11-23SimpleDateFormat df =new SimpleDateFormat(yyyy-MM-dd); java.util.Date cDate = df.parse(date); java.sql.Date dd = new java.sql.Date(cDate.getTime();39、如何实现字符串的反转及替换?答:方法很多,可以自己写实现也可以使用String或StringBuffer/StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:public static String reverse(String originStr) if(originStr = null | originStr.length() = 1) return originStr; return reverse(originStr.substring(1) + originStr.charAt(0);40、浅析Java中的final关键字, 并举例说明?在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类。在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。1.修饰类: 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。2.修饰方法:使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“因此,如果只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。注:类的private方法会隐式地被指定为final方法。3.修饰变量:是final用得最多的地方。对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。举个例子:上面的一段代码中,对变量i和obj的重新赋值都报错了。41、日期和时间:- 如何取得年月日、小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?答:问题1:创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值。Java 8中可以使用java.time.LocalDateTimel来获取,代码如下所示。public class DateTimeTest public static void main(String args) Calendar cal = Calendar.getInstance(); System.out.println(cal.get(Calendar.YEAR); System.out.println(cal.get(Calendar.MONTH); / 0 - 11 System.out.println(cal.get(Calendar.DATE); System.out.println(cal.get(Calendar.HOUR_OF_DAY); System.out.println(cal.get(Calendar.MINUTE); System.out.println(cal.get(Calendar.SECOND); / Java 8 LocalDateTime dt = LocalDateTime.now(); System.out.println(dt.getYear(); System.out.println(dt.getMonthValue(); / 1 - 12 System.out.println(dt.getDayOfMonth(); System.out.println(dt.getHour(); System.out.println(dt.getMinute(); System.out.println(dt.getSecond(); 问题2:以下方法均可获得该毫秒数。Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();Clock.systemDefaultZone().millis(); / Java 8问题3:代码如下所示。Calendar time = Calendar.getInstance();time.getActualMaximum(Calendar.DAY_OF_MONTH);问题4:利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。import java.text.SimpleDateFormat;import java.time.LocalDate;import java.time.format.DateTimeFormatter;import java.util.Date;class DateFormatTest public static void main(String args) SimpleDateFormat oldFormatter = new SimpleDateFormat(yyyy/MM/dd); Date date1 = new Date(); System.out.println(oldFormatter.format(date1); / Java 8 DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern(yyyy/MM/dd); LocalDate date2 = LocalDate.now(); System.out.println(date2.format(newFormatter); 42、打印昨天的当前时刻。答:import java.util.Calendar;class YesterdayCurrent public static void main(String args) Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); System.out.println(cal.getTime(); 在Java 8中,可以用下面的代码实现相同的功能。import java.time.LocalDateTime;class YesterdayCurrent public static void main(String args) LocalDateTime today = LocalDateTime.now(); LocalDateTime yesterday = today.minusDays(1); System.out.println(yesterday); 45、Error和Exception有什么区别?答:Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。46、try和finallytry里有一个return语句,那么紧跟在这个try后的finally里的代码会不会被执行,什么时候被执行?在return前还是后?在finally中改变返回值可以吗?答:会执行,在方法返回调用者前执行。在finally中改变返回值可以吗?可以,但在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,强烈建议将此项设置为编译错误。47、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?答:Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理; try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常; throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行.finally在异常处理时提供finally块来执行所有清除操作。主要与try-catch-finally配合使用。finally语句块的作用是无论出现什么情况,finally块中的语句一定会被执行,并且是在return之前执行。48、什么是Object类?答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。当然,数组也继承了Object类。然而,接口是不继承Object类的。49、列出一些你常见的运行时异常?答:- ArithmeticException(算术异常)- ClassCastException (类转换异常)- IllegalArgumentException (非法参数异常)- IndexOutOfBoundsException (下标越界异常)- NullPointerException (空指针异常)- SecurityException (安全异常)50、阐述final、finally、finalize的区别。答:- final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。- finally:通常放在trycatch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。- finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。51、类ExampleA继承Exception,类ExampleB继承ExampleA。有如下代码片断:try throw new ExampleB(b) catch(ExampleA e) System.out.println(ExampleA); catch(Exception e) System.out.println(Exception);请问执行此段代码的输出是什么?答:输出:ExampleA。(根据里氏代换原则能使用父类型的地方一定能使用子类型,抓取ExampleA类型异常的catch块能够抓住try块中抛出的ExampleB类型的异常)52、euqals()函数是用来做什么的?为什么不用“=”运算符来判断两个对象是否相等呢?答:equals()函数可以用来检查一个对象与调用这个equals()的这个对象是否相等。答:虽然“=”运算符可以比较两个数据是否相等,但是要来比较对象的话,恐怕达不到预期的结果。就是说,“=”通过是否引用了同一个对象来判断两个对象是否相等,这被称为“引用相等”。这个运算符不能通过比较两个对象的内容来判断它们是不是逻辑上的相等。53、阐述ArrayList的存储性能和特性。答:ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。补充:遗留容器中的Properties类和Stack类在设计上有严重的问题,Properties是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个Hashtable并将其两个泛型参数设置为String类型,但是Java API中的Properties直接继承了Hashtable,这很明显是对继承的滥用。这里复用代码的方式应该是Has-A关系而不是Is-A关系,另一方面容器都属于工具类,继承工具类本身就是一个错误的做法,使用工具类最好的方式是Has-A关系(关联)或Use-A关系(依赖)。同理,Stack类继承Vector也是不正确的。Sun公司的工程师们也会犯这种低级错误,让人唏嘘不已。54、import,package的用法和用途认为 import跟C/C+ 的#include 相似,这是错误的观念。请详细说明Java中import,package的用法和用途。答:package名称就像是我们的姓,而 class 名称就像是我们的名字。package名称有很多,就好像是复姓。比如说java.lang.String,就是复姓java.lang,名字为String的类别;java.io.InputStream则是复姓java.io,名字为InputStream的类别。Java会使用package这种机制的原因也非常明显,就像我们取姓名一样,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的Java类别数量,恐怕比杭州人口还多,而且还不断的在成长当中,如果类别不使用套件名称,那在用到相同名称的不同类别时,就会產生极大的困扰。幸运的是,Java的套件名称我们可以自己取,不像人的姓没有太大的选择(所以有很多同名同姓的),如果依照Java的规范来取套件名称,那理论上不同人所取的套件名称不会相同,也就不会发生名称冲突的情况。可是问题来了,因为很多套件的名称非常的长,在写程序时,会多打好多字,花费不少时间,比如说:java.io.InputStreamis=java.lang.System.in;java.io.InputStreamReaderisr=newjava.io.InputStreamReader(is);java.io.BufferedReaderbr=newjava.io.BufferedReader(isr);实在是不美观又麻烦。於是,Java大人想了一个办法,就是import。这个import就是在程序一开头的时候,先说明程序中会用到那些类别的简称,也就是只称呼名字,不称呼他的姓。首先,在代码开头写:importjava.lang.System;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.BufferedReader;这几行说明了这四个姓名的类别,在程序中只用他的名字来称呼,所以当程序中提到System就是指java.lang.System,而InputStream就是指java.io.InputStream,依此类推。於是原来的程序就变成:InputStream=System.in;InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);这样看起来是不是清爽多了呢?如果这些类别用的次数很多,那就更能体会到import的好处了。可是这样还是不够,因为懒是人的天性,还是会有人觉得打太多import了也很浪费时间,於是Java姐姐又提供了一个方法:importjava.lang.*;importjava.io.*;意思就是,等一下程序中提到的没有姓名的类别,不是姓java.lang,就是姓java.io,如果这两个裡面有同样名字的类别,而不幸的你又只用名字称呼这个类别,那编译器仍然会跟你抱怨,因为它还是不知道你说的这个类别指那一个姓的类别。那可不可以再懒一点呢,只写:import java.*;历史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓java.io 而不是姓 java。就像姓诸葛的人应该不会喜欢你称他為诸先生吧。差不多了,天亮了.55、设计GUI程序时,大部分事件监听器(处理器)都作为匿名内部类来实现。那么什么是匿名类?什么情况下需要使用匿名内部类?有什么好处?答:Java内部类是指在一个外部类的内部再定义一个类;而匿名内部类就是没有名字的内部类。如果满足下面的一些条件,使用匿名内部类是比较合适的:l 只用到类的一个实例。 l 类在定义后马上用到。 l 类非常小(4行代码以下) l 给类命名并不会导
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!