软件产品的公司中,code review是很多程序员必须要做的一项工作,为了提升我们看代码的能力,可以通过做一些小测验,锻炼一下。我准备了一些简单的测验题目,有兴趣的朋友可以试一试。(不收费的~)

1、关于抽象方法的定义

abstract class Name {private String name;public abstract boolean isStupidName(String name) { }
}

以上代码是否正确,如果不正确请指出?

错误。abstract method必须以分号结尾,且不带花括号。

2、关于局部变量的定义

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

以上代码是否正确,如果不正确请指出?

错误。局部变量前不能放置任何访问修饰符(public、protected、private)。final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

3、又是关于抽象方法的定义

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

这好像没什么错了吧?

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

4、关于final修饰符的使用

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

这个比较明显。

错误。int x被修饰成final,意味着x不能在addOne method中被修改。

5、又是关于final修饰符的使用

public class Something {public static void main(String[] args) {Other obj = new Other();new Something().addOne(obj);}public void addOne(final Other obj) {obj.i++;}
}
class Other {public int i;
}

和上面的很相似,都是关于final的问题,这有错吗?

正确。在addOne method找那个,参数obj被修饰成final。如果在addOne method里我们修改了obj的reference(比如 obj = new Other();),那么如同上例这题也是错的。但这里修改的是obj的member variable(成员变量),而obj的reference并没有改变。

6、关于成员变量的默认值

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

有什么错呢?看不出来了吧。

正确。输出的是“i = 0"。int i属于instant variable(实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

7、用final修饰的成员要初始化

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

和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?

错误。final int i是个final的instant variable(实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor(构造器)结束之前被赋予一个明确值。可以修改为”final int i = 0;“。

8、关于static方法中访问non-static成员

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里call doSomething没什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接class non-static methods。可改成"System.out.println(“s.doSomething() returns " + s.doSomething());”。同理,static method不能访问non-static instant variable。

9、关于java文件名与类名之间的关系

在一个文件名为OtherThing.java的文件中定义的class代码如下:

class Something {private static void main(String[] something_to_do) {System.out.println("Do something ...");}
}

这个好像很明显。

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

10、本文最难一题

interface Playable {void play();
}interface Bounceable {void play();
}interface Rollable extends Playable, Bounceable {Ball ball = new Ball("PingPang");
}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.geetName());}
}

这个错误不容易发现。

错误。”interface Rollable extends Playable, Bounceable“没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball(“PingPang”);"。任何在interface里声明的interface variable(接口变量,也可称成员变量),默认为public static final。也就是说"Ball bal = new Ball(“PingPang”);"实际上是”public static final Ball bal = new Ball(“PingPang”);“。在Ball类的Play()方法中,”ball = new Ball(“Football”);“改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在”ball = new Ball(“Football”);“这里显示有错。

嗨!Java Coder,考考你们看代码的眼力相关推荐

  1. (开包即用,不用看代码!)借助Docker自动构建Java(Oracle)镜像

    开包即用,不用看代码! 如果着急使用可以直接使用我构建的镜像,请从配置镜像源开始看 Docker中的Java Java可能是程序员最常用的运行时环境了, 即使你不开发Java程序,大量的开发工具也需要 ...

  2. 收藏|Java程序员必看的几本基础书籍和常用工具

    java程序员必看基础书籍和工具 1计算机基础 1.<深入理解计算机系统> 著名的CSAPP,从c语言到汇编语言到硬件再到操作系统,写得非常好.是一本能帮助深入理解计算机系统的书.基本上把 ...

  3. php自动加载指定类,PHP自动加载类-Java架构师必看

    test.php 当前目录下有j.phpPHP test.php function __autoload($class_name) { require_once $class_name . '.php ...

  4. 零基础学Java有哪些必看书?推荐这5本

    零基础学Java初学者,想要入门,应该多看一些关于Java的书,先充实理论基础.然而Java的技术知识是海量的,市面上关于Java的书令人眼花缭乱,零基础的小白完全不知道该看哪本书.那么,零基础学Ja ...

  5. Java多线程之多线程工程代码编写思维方式

    Java之多线程的工程代码编写思维方式 题目:三个售票员卖出30张票,用线程模拟. 前言: 本文涉及synchronized.Lock和拉姆达表达式(Lambda Expressions),前两知识点 ...

  6. java url 处理,URL处理-Java架构师必看

    完整URL地址:http://username:password@hostname/path?ar网络 协议:http:// 用户名和密码: username:password  以:将两者分隔 主机 ...

  7. java处理图像库函数_图象处理详解-Java架构师必看

    作者:未知    请与本人联系 在使用ASP的时候,我们时常要借助第三方控件来实现一些图象功能.而数据库 作者:未知     请与本人联系 在使用ASP的时候,我们时常要借助第三方控件来实现一些图象功 ...

  8. Java架构师必看的10本书

    转载自 Java架构师必看的10本书 1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解: ...

  9. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

最新文章

  1. logging 模块
  2. 台式机自动关机+自动重启问题
  3. 苹果系统更新服务器繁忙,如何解决升级MacOS 10.13时的常见问题
  4. C#的多线程机制探索7
  5. SQL Server 2005 Analysis Services实践(一)
  6. ue4小白人骨骼定义_【Blender】用SkinModifier+骨骼顶点“灵活”快速创建雕刻需要用的基本人物模型...
  7. 无废话C#设计模式系列文章
  8. 四十三、配置防盗链、访问控制Directory、访问控制FilesMatch
  9. 锐捷计算机教室排顺序,大学四年说话最多的一堂课是在锐捷智慧教室
  10. 查看oracle磁盘组空间,shell脚本检查oracle中的ASM磁盘组空间并发送邮件
  11. 2020年全国大学生数学建模竞赛应该如何准备
  12. 推荐14个可以展示你代码的网站
  13. cpu上干硅脂怎么清理_如何去除CPU上原来的硅脂
  14. Oracle中根据注释来查表名
  15. 浅学一点空间转换3D和动画知识
  16. 使用openSSL制作SSL证书
  17. java 时间间隔 工作日_计算Java中两个日期之间的工作日数
  18. 云计算为什么发展_为什么快速发展的公司需要云计算? 第1部分
  19. mysql lucene 索引区别_MySQL和Lucene索引对比分析
  20. Fight Over Ringtone Firm Heats Up

热门文章

  1. db2嵌套查询效率_嵌套查询与连接查询的性能
  2. 判断点在线段的左边还是右边 判断线段是否相交
  3. zzulioj1017C语言答案,郑州轻工业大学oj题解(c语言)1017,1018 if典型题
  4. 获取当前日期是一年中的第几周
  5. 【荐书】互联网电商系统的大数据方案书籍
  6. ESP8266一直重启问题及解决(ets Jan 8 2013,rst cause:2, boot mode:(3,6))
  7. 【DIY】多模式51单片机心形流水灯+呼吸灯+蜂鸣器音乐
  8. JS 定时器的4种写法及介绍
  9. JavaScript进阶(二)
  10. 精英845主板问题!