关于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"); 这里显示有错。 -----------------------------------------------------------------------------

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏五分钟学算法

每天一算:Contains Duplicate II

1513
来自专栏逸鹏说道

Python3 与 C# 面向对象之~封装

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lessch...

1693
来自专栏Golang语言社区

谈谈Go语言的反射三定律

简介 Reflection(反射)在计算机中表示 程序能够检查自身结构的能力,尤其是类型。它是元编程的一种形式,也是最容易让人迷惑的一部分。 虽然Go语言没...

48911
来自专栏Golang语言社区

Go语言interface详解

interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计...

3719
来自专栏Android干货

源码浅谈(一):java中的 toString()方法

2623
来自专栏ShaoYL

预处理指令--宏定义

3637
来自专栏向治洪

数据结构之串

基本概念 串(string)是由零个或多个字符组成的有限序列,又名叫字符串。形如s="a,b,c.."。ai(1 ≤ i ≤ n)可以是字母、数字或其他字符,i...

2798
来自专栏前端桃园

【前端每日一题 02】在Javascript中什么是伪数组?如何将伪数组转化为标准数组?

1342
来自专栏Script Boy (CN-SIMO)

Qt Quick编程(1)——QML的核心部分ECMAScript

说道QML,不得不先说一下ECMAScript: ECMAScript语言的标准是由Netscape、Sun、微软、Borland等公司基于JavaScript...

4700
来自专栏进击的君君的前端之路

字符串与JSON

6203

扫码关注云+社区

领取腾讯云代金券