| 本帖最后由 杨_扬 于 2012-7-15 10:20 编辑 
 找不到前面几期的同学可以去访问我的博客
 http://blog.csdn.net/crazybass81
 
 
 不知道上一期的题目有多少人仔细做了,如果上一期的问题都能做对,基本上继承中的转型部分的知识可以说就已经掌握了。
 继承是面向对象的一个重要属性,我相信一些公司也很爱用这样的问题来考察应聘者JAVA的基本功,我建议大家认真的做一下26,28,29这三题,然后再看答案,有不明白的地方也很正常,老毕的视频大部分我没看过,我想应该会对转型这么具有迷惑性的重要基础知识有很全面的了解吧,如果视频里说的不清楚,可以去看《JAVA编程思想》里面讲的很透彻。
 提到这本书,我不建议零基础的学生去看,如果不是对JAVA代码非常熟悉的人看了会觉得很生涩。还有那本《JAVA2核心技术:卷I 卷II》我也不建议初学者看,这本书翻译的不好,看起来挺费劲。
 其实对于初学者来说,太过于理论的书籍都不适合,虽然说原理很重要,但是对于想快速通过黑马的入学考试的同学而言能写出代码来才是硬道理,所以我建议
 1.  找本中国人写的JAVA书,张孝祥老师的零基础的JAVA学习的书就很好,读起来也流畅
 2.  对照老毕的视频
 3.  如果想把基础打的很牢
 先看老毕的视频,之后去看张孝祥老师的书中对应的内容,这两者都已经融会贯通了之后,再去把我上面提到的哪两本英文书的有关内容看看,书里面的代码没有阅读难度(说真的,老外书里的例子并不直观,老外作者在写书的时候往往会想我要编一个怎么样的例子让读者觉得好玩,而不是说我要用一个怎么样的例子尽可能简单的去说明现象)。
 4.《JAVA编程思想》这本书每一个知识点(小节)都配有练习题,自己独立完成。
 以上四点都做到了,那你的JAVA基本功算是没问题了。
 
 上期答案
 第二十六题
 1. interface A {public void aMethod(); }
 2. interface B {public void bMethod(); }
 3. interface C extends A,B { public void cMethod(); }
 4. class D implements B {
 5.      public void bMethod(){}
 6. }
 7. class E extends D implements C {
 8.      public void aMethod(){}
 9.      publicvoid bMethod(){}
 10.    public void cMethod(){}
 11. }
 What is the result?
 A. 因为第3行存在问题,因此编译失败.
 B. 因为第7行存在问题,因此编译失败.
 C. 因为第9行存在问题,因此编译失败.
 D. 如果你使用D e = new E()创建了一个类D的实例并调用bMethod()方法,则将调用在第5行处定义的bMethod()
 E. 如果你使用D e = (D)(new E())创建了一个类D的实例并调用bMethod()方法,则将调用在第5行处定义的bMethod()
 F. 如果你使用D e = (D)(new E())创建了一个类D的实例并调用bMethod()方法,则将调用在第9行处定义的bMethod()
 答案:F
 知识点:
 继承与转型。在new E()的时候类,JVM会在堆内存中生成一个引用,而在栈内存中为类的实例开辟内存空间。在堆内存中的这个引用实际上可以理解为是一个指针数组,分别指向栈内存中用来存放属性的地址和用来存放方法的方法入口地址(方法指针)。此时,无论如何转型,这些指针是不会发生改变的,所以答案F中,尽管向上转型为D类的实例,但是在调用方法的时候还是调用在类E中声明的方法。
 这里,对于只学过JAVA的同学,我想说,回去看看C吧,理解尽可能多一些的中、低层机制对编程是有好处的,尤其是在做优化的时候。另外,总听别人说JAVA好,简单,没有指针。我想说,JAVA的开发者并不是为了简化语法而不用指针,而是他们觉得指针不安全,这里说的不安全不是说你用起来不安全,而是说容易给程序留下漏洞。
 任何高级语言编译到最后都是编程汇编进而是字节码,JAVA封装的再好,他的基本原理还是那样。其实,从1945年到现在计算机的原理就没变过。
 
 第二十七题
 一下哪段代码诠释了“人类有一个最好的朋友—狗”(Man has a best friend who is a Dog)
 A. class Man extendsDog { }
 B. class Manimplements Dog { }
 C. class Man {private BestFriend dog; }
 D. class Man {private Dog bestFriend; }
 E. class Man {private Dog<bestFriend>; }
 答案:D
 BestFriend是属性,Dog是类型,换句话说就是Man这个类有一个bestFriend属性,属性的类型是Dog。
 
 第二十八题
 有如下代码
 31. class Foo {
 32.   public int a = 3;
 33.   public void addFive() { a += 5;System.out.print("f "); }
 34. }
 35. class Bar extends Foo {
 36.   public int a = 8;
 37.   public void addFive() { this.a += 5;System.out.print("b " ); }
 38. }
 执行一下三行代码
 Foo f = new Bar();
 f.addFive();
 System.out.println(f.a);
 结果是什么?
 A. b 3
 B. b 8
 C. b 13
 D. f 3
 E. f 8
 F. f 13
 G. 编译失败.
 H. 抛出异常.
 答案:A
 知识点:
 依然是继承和转型方面的问题,很乱很坑爹,如果你认为答案是C,证明你也挺不错的。
 
 第二十九题
 11. class Animal {public String noise() { return "peep"; } }
 12. class Dog extends Animal {
 13.   public String noise() { return "bark"; }
 14. }
 15. class Cat extends Animal {
 16.   public String noise() { return "meow"; }
 17. } ...
 30. Animal animal =new Dog();
 31. Cat cat =(Cat)animal;
 32.System.out.println(cat.noise());
 以上代码执行的结果是
 A. peep
 B. bark
 C. meow
 D. 编译失败.
 E. 抛出异常.
 答案:E
 程序第32行会抛出一个ClassCastException,这是向上,向下转型的基本概念,做错的去把向上,向下转型的规则背下来就行了,没什么需要解释的。
 
 第三十题
 1. class Super {
 2.      private int a;
 3.      protected Super(int a) { this.a = a; }
 4. } ...
 11. class Sub extends Super {
 12.   public Sub(int a) { super(a); }
 13.   public Sub() { this.a = 5; }
 14. }
 一下哪两种修改可以使得以上代码编译通过 (Choose two.)
 A. Change line 2 to:public int a;
 B. Change line 2 to:protected int a;
 C. Change line 13 to: public Sub() { this(5); }
 D. Change line 13 to: public Sub() { super(5); }
 E. Change line 13 to: public Sub() { super(a); }
 答案 CD
 知识点:
 父类只有一个有参的构造方法,子类的无参构造方法必须给父类的构造方法传递一个参数,因此C,D都可以,C是说在子类的无参构造方法中调用自己的有参构造方法并给父类的构造方法传递一个参数,D更直接,直接给父类传个参数。
 ----------------------------------------------------------分割线---------------------------------------------------------
 本期问题
 第三十一题:
 1. public class Base {
 2.         public static final String FOO = "foo";
 3.         public static void main(String[] args) {
 4.                 Base b = new Base();
 5.                 Sub s = new Sub();
 6.                 System.out.print(Base.FOO);
 7.                 System.out.print(Sub.FOO);
 8.                 System.out.print(b.FOO);
 9.                 System.out.print(s.FOO);
 10.                 System.out.print(((Base)s).FOO);
 11.         } }
 12. class Sub extends Base {public static final String FOO="bar";}
 上面这段代码的运行结果是:
 A. foofoofoofoofoo
 B. foobarfoobarbar
 C. foobarfoofoofoo
 D. foobarfoobarfoo
 E. barbarbarbarbar
 F. foofoofoobarbar
 G. foofoofoobarfoo
 
 第三十二题:
 1. package geometry;
 2. public class Hypotenuse {
 3.         public InnerTriangle it = new InnerTriangle();
 4.         class InnerTriangle {
 5.                 public int base;
 6.                 public int height;
 7.         }
 8. }
 下面描述的内容那个是正确的?
 A. 任何类都可以访问属性base.
 B. 任何类都不可以访问属性base .
 C. 只有属于 geometry 包的类可以访问属性base.
 D. 只有Hypotenuse的子类可以访问base的属性.
 
 第三十三题:
 2. public class Hi {
 3.         void m1() { }
 4.        protected void m2() { }
 5. }
 6. class Lois extends Hi {
 7.         // 此处插入代码
 8. }
 在第七行处插入哪几个选项中的代码都可以使得程序编译通过? (选择4个.)
 A. public void m1() { }
 B. protected void m1() { }
 C. private void m1() { }
 D. void m2() { }
 E. public void m2() { }
 F. protected void m2() { }
 G. private void m2() { }
 
 第三十四题:
 以下哪两个选项中的代码可能会引发StackOverflowError?
 A. int []x = {12345};
 for(int y = 0; y < 6; y++)
 System.out.println(x[y]);
 B. static int[] x = {7654};
 static { x[1] = 8;
 x[4] = 3; }
 C. for(int y = 10; y < 10; y++)
 doStuff(y);
 D. void doOne(int x) { doTwo(x);}
 void doTwo(int y) { doThree(y); }
 void doThree(int z) { doTwo(z); }
 E. for(int x = 0; x < 1000000000; x++)
 doStuff(x);
 F. void counter(int i) { counter(++i); }
 
 第三十五题:
 11. class A {
 12.                 public void process() { System.out.print("A"); }
 13.class B extends A {
 14.                 public void process() throws IOException {
 15.                         super.process();
 16.                        System.out.print("B");
 17.                         throw new IOException();
 18.                 }
 19.           public static void main(String[] args) {
 20.                         try { new B().process(); }
 21.                         catch (IOException e) { System.out.println("Exception"); }
 22.            }
 以上代码运行的结果是?
 A. Exception
 B. ABException
 C. 因为在第20行有错误,因此编译失败.
 D. 因为在第14行有错误,因此编译失败.
 E. 程序运行时,抛出NullPointerException.
 
 |