面向对象程序设计课程题库理论_第1页
面向对象程序设计课程题库理论_第2页
面向对象程序设计课程题库理论_第3页
面向对象程序设计课程题库理论_第4页
面向对象程序设计课程题库理论_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java 基础回顾说明Java 和面向对象本身包罗万象,我们回顾的重点是基础知识。以下是问题和参考答案,完全对很难,发现一个“原则上的”错误,期末加 2 分。1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的Java 与模式或设计模式精解中关于桥梁模式的部分)。 - 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。 - 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。2、访问修饰符 public,private,protected,以及不写(默认)时的区别? 答:修饰符 当前类 同 包 子 类 其他包修饰符 当前类 同 包 子 类 其他包public protected default private 类的成员不写访问修饰时默认为 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 Puppyint puppyAge;public Puppy(String name)/ 这个构造器仅有一个参数:nameSystem.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.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.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 AB()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)而且文件名必须和公开类的类名完全保持一致

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论