您好,欢迎访问三七文档
1、抽象类和接口的区别,什么时候用?接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的;另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法(一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现)。还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.2、abstractclassName{privateStringname;publicabstractbooleanisStupidName(Stringname){}}这有何错误?abstractmethod必须以分号结尾,且不带花括号3、abstractclassSomething{privateabstractStringdoSomething();}这有何错误?abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstractmethod封锁起来呢?(同理,abstractmethod前不能加final)4、interfaceA{intx=0;}classB{intx=1;}classCextendsBimplementsA{publicvoidpX(){System.out.println(x);}publicstaticvoidmain(String[]args){newC().pX();}}这有何错误?在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时importjava.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为publicstaticfinal.所以可以通过A.x来明确。5、interfacePlayable{voidplay();}interfaceBounceable{voidplay();}interfaceRollableextendsPlayable,Bounceable{Ballball=newBall(PingPang);}classBallimplementsRollable{privateStringname;publicStringgetName(){returnname;}publicBall(Stringname){this.name=name;}publicvoidplay(){ball=newBall(Football);System.out.println(ball.getName());}}这有何错误?interfaceRollableextendsPlayable,Bounceable没有问题。interface可继承多个interfaces,所以这里没错。问题出在interfaceRollable里的Ballball=newBall(PingPang);。任何在interface里声明的interfacevariable(接口变量,也可称成员变量),默认为publicstaticfinal。也就是说Ballball=newBall(PingPang);实际上是publicstaticfinalBallball=newBall(PingPang);。在Ball类的Play()方法中,ball=newBall(Football);改变了ball的reference,而这里的ball来自Rollableinterface,Rollableinterface里的ball是publicstaticfinal的,final的object是不能被改变reference的。因此编译器将在ball=newBall(Football);这里显示有错。6、classA{protectedintmethod1(inta,intb){return0;}}WhichtwoarevalidinaclassthatextendsclassA?(AC)A.publicintmethod1(inta,intb){return0;}B.privateintmethod1(inta,intb){return0;}C.privateintmethod1(inta,longb){return0;}D.publicshortmethod1(inta,intb){return0;}E.staticprotectedintmethod1(inta,intb){return0;}7、publicclassOuter{publicvoidsomeOuterMethod(){//Line3}publicclassInner{}publicstaticvoidmain(String[]argv){Outero=newOuter();//Line8}}WhichinstantiatesaninstanceofInner?(AE)newInner();//Atline3B.newInner();//Atline8C.newo.Inner();//Atline8D.newOuter.Inner();//Atline8E.newOuter().newInner()//Atline88、AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?AnonymousInnerClass(匿名内部类)不能extends其他类,但它可以是其他类的子类。匿名内部类可以实现接口9、面向对象的基本特征有哪些方面1.抽象2.继承3.封装4.多态性10、处理字符串时,操作符==和方法equals()的区别。字符串属于对象;在对象比较中==比较的是内存对象,也就是是不是同一个对象;而equals比较的内容是否相等11、内部类可以引用他包含类的成员吗?有没有什么限制?一个普通内部类可以访问他的外部类的所有的成员,没有任何限制;反之外部类不能直接访问内部类的成员;内部类变量的其作用范围只在内部类内部;12、写一个Money类,包含金额和币种两个属性,以及加、减两个方法。publicclassMoneyClass{privateBigDecimalmoney;privateShorttype;publicBigDecimalgetMoney(){returnmoney;}publicvoidsetMoney(BigDecimalmoney){\this.money=money;}publicShortgetType(){returntype;}publicvoidsetType(Shorttype){this.type=type;}//加publicvoidadd(MoneyClassoperand)throwsCurrencyExcepiton{if(operand.money==null||this.money==null){thrownewNullPointerException();}this.money.add(operand.money);}//减publicvoidsubtract(MoneyClassoperand)throwsCurrencyExcepiton{if(operand.money==null||this.money==null){thrownewNullPointerException();}this.money.subtract(operand.money);}}//自己定义的异常类型classCurrencyExcepitonextendsException{@OverridepublicStringtoString(){return货币操作出现异常:货币类型不一致;}}13、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。用try来指定一块预防所有异常的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的异常的类型。throw语句用来明确地抛出一个异常。throws用来标明一个成员函数可能抛出的各种异常。Finally为确保一段代码不管发生什么异常都被执行一段代码。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。14、是否可以从一个static方法内部发出对非static方法的调用?不可以.从类的加载顺序上来说,静态方法或静态变量是最先被加载到内存的,此时内存中还没有非静态的方法,所以无法调用;使用静态方法时候,要注意以下几点:a.在静态方法中只能直接调用同类中的其他静态方法或静态变量,而不能直接调用非静态的方法或变量;b.静态方法不能以任何方法引用this或supper关键字15、final,finally,finalize的区别。final,修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally,在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话),如果try代码中有return语句时,也会先执行finally,再执行return。finalize,方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。16、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?既不是通过==也不是通过equals()方法,而是通过iterator()方法来区分重复纪录的;17、StaticNestedClass(静态内部类)和InnerClass(内部类)的不同静态内部类不能访问外部类的实例变量,既不能共享外部类的实例变量。静态内部类不是内部类,而是两个类之间的隐含关系。18、GC是什么?为什么要有GC?(基础)。垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?GC是垃圾收集器。当一个对象的引用丢失后,即没有地方再引用了该对象,这个对象将成为垃圾。但这样的对象仍在内存中,占据内存资源,虚拟机会按一定的方式启动垃圾收集器来回收这些对象占据的内存。如果想通过程序去回收内存,可以通过System.gc()或Runtime.getRuntime().gc()方法通知虚拟机进行垃圾回收,但并不一定马上就会执行垃圾回收,也就是不能强制立即执行
本文标题:面向对象试题
链接地址:https://www.777doc.com/doc-1960785 .html