• 关于Java面向对象的分析题


    分析程序看有没有问题,如果有,说出原因即可。
    -----------------------------------------------------------------------------
    1.

    abstract class Name {
       private String name;
       public abstract boolean isStupidName(String name) {}    //有方法体,但方法体为空。会报错。
    }

    错误。
      抽象方法必须以分号结尾,且不带花括号。
      在Java中,一个没有具体的方法体的方法应该定义为抽象方法。
      而在一个类中如果有抽象方法,该类必须定义为抽象类。
    -----------------------------------------------------------------------------
    2.

    public class Something {
       void doSomething () {
           private String s = "";
           int l = s.length();
       }
    }

    错误。
      局部变量前不能放置任何访问修饰符 (private,public和protected)。
      final可以用来修饰局部变量。被final修饰的局部变量变为常量了。
    -----------------------------------------------------------------------------
    3.

    abstract class Something {
       private abstract String doSomething ();
    }

    错误。
      抽象的方法不能以private修饰。
      抽象的方法就是让子类implement(实现)具体细节的,怎么可以用private把抽象的方法封锁起来呢?
      (同理,抽象的方法前不能加final)。
    -----------------------------------------------------------------------------
    4.

    public class Something {
       public int addOne(final int x) {
           return ++x;
       }
    }

    错误。
      int x被final修饰,意味着x不能在addOne 方法中被修改。
    -----------------------------------------------------------------------------
    5.

    public class Something {
       public static void main(String[] args) {
           Other o = new Other();
           new Something().addOne(o);
       }
       public void addOne(final Other o) {
           //o = new Other();    //对象o重新指向了新的地址值,但是对象o是被final修饰了,所以这句会报错!
           o.i++;    //正确
       }
    }
    
    class Other {
       public int i;
    }

    正确。

      在addOne 方法中,参数o被修饰成final。
      如果在addOne 方法里我们修改了o的引用(比如: o = new Other();),那么如同上例这题也是错的。
      但这里修改的是o的成员变量i(member vairable),而o的引用(reference)并没有改变。
    -----------------------------------------------------------------------------
    6.

    1 class Something {
    2     int i;
    3     public void doSomething() {
    4         System.out.println("i = " + i);
    5     }
    6 } 

    正确。
      输出的是"i = 0"。int i属于成员变量/实例变量(instant variable)。成员变量有缺省值(default value)。int i的缺省值是0。
    -----------------------------------------------------------------------------
    7.

    class Something {
        final int i;
        public void doSomething() {
            System.out.println("i = " + i);
        }
    }

    错误。
      被final修饰的成员变量没有默认值(default value),必须在构造器(constructor )结束之前被赋予一个明确的值。
      即在定义被final修饰的成员变量时就给值,例如final int i = 0;
    -----------------------------------------------------------------------------
    8.

    public class Something {
        public static void main(String[] args) {
            Something s = new Something();
            System.out.println("s.doSomething() returns " + doSomething());
        }
        public String doSomething() {
            return "Do something ...";
        }
    }

    错误。
      看上去在main里调用doSomething()没有什么问题,毕竟两个方法都在同一个class里。
      但仔细看,main方法是static的。静态的方法不能直接调用非静态的方法。
      可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。
      同理,静态方法(static method)不能访问非静态成员变量(non-static instant variable)。
    -----------------------------------------------------------------------------
    9.

    此处,Something类的文件名叫OtherThing.java
    class Something {
        private static void main(String[] something_to_do) {        
            System.out.println("Do something ...");
        }
    }

    正确。
      从来没有人说过Java的Class名字必须和其文件名相同。但public class A {} 的名字必须和文件名相同。
    -----------------------------------------------------------------------------
    10.

    interface  A {    //因为接口的所有成员变量的默认修饰符都是:public static final
       int x = 0;
    }
    class B { int x = 1; }
    class C extends B implements A { public void pX() { System.out.println(x); } public static void main(String[] args) { new C().pX(); } }

    错误。
      在编译时会发生错误(错误描述不同的JVM有不同的信息),
      意思就是未明确的x调用,两个x都匹配(就像在同时import java.util和java.sql两个包时直接声明Date一样)。
      对于父类的变量,可以用super.x来明确调用,而接口的成员变量(属性)默认隐含修饰符为public static final int x = ;可以通过A.x来明确调用。
    -----------------------------------------------------------------------------
    11.

    interface Playable {    //因为接口的所有成员方法的默认修饰符都是:public abstract
        void play();    //完整形式为:public abstract void play();
    }
    interface Bounceable { void play(); }
    interface Rollable extends Playable, Bounceable { //因为接口的所有成员变量的默认修饰符都是:public static final Ball ball = new Ball("PingPang"); //这是成员变量。完整形式为:public static final Ball ball = new Ball("PingPang"); } //即ball是一个最终变量(常量),其类型是引用数据类型,也即ball不能再new了。

    class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } }

    错误。
      接口可以多继承,即接口可以继承多个接口。
      任何在接口里声明的接口变量,也可称成员变量,默认的修饰符为public static final。
      也就是说: Ball ball = new Ball("PingPang");是成员变量,实际上是 public static final Ball ball = new Ball("PingPang");。
      在Ball类的play()方法中,"ball = new Ball("Football");"改变了ball的引用,而这里的ball来自Rollable 接口,
      Rollable 接口里的ball是public static final的,final修饰的对象是不能被改变引用(reference)的。
      因此编译器将在 ball = new Ball("Football"); 这里显示有错。
    -----------------------------------------------------------------------------

  • 相关阅读:
    Linux 进程终止后自动重启
    (转) Android中ViewStub组件使用
    (转)android UI进阶之用ViewPager实现欢迎引导页面
    (转)android UI进阶之实现listview的分页加载
    (转)android UI进阶之实现listview的下拉加载
    (转)android UI进阶之弹窗的使用(2)实现通讯录的弹窗效果
    学习网址
    (转)android UI进阶之实现listview中checkbox的多选与记录
    (转)android UI进阶之自定义组合控件
    (转)Android里merge和include标签的使用
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8456875.html
Copyright © 2020-2023  润新知