当前位置:  技术问答>java相关

这两个例子并没有编译出错啊,为什么SCJP的答案说编译出错???

    来源: 互联网  发布时间:2015-02-14

    本文导语:  class Base {} class Sub extends Base {} class Sub2 extends Base {} public class t  {  public static void main(String argv[])  {   Base b = new Base();   Sub s = (Sub)b;     } } Runtime Exception Without the cast to sub you would get a comp...

class Base {}
class Sub extends Base {}
class Sub2 extends Base {}

public class t 
{

 public static void main(String argv[])
 {
  Base b = new Base();
  Sub s = (Sub)b;
  
 }
}
Runtime Exception

Without the cast to sub you would get a compile time error. The cast tells the compiler that you really mean to do this and the actual type of b does not get resolved until runtime. Casting down the object hierarchy as the compiler cannot be sure what has been implemented in descendent classes. Casting up is not a problem because sub classes will have the features of the base classes. This can feel counter intuitive if you are aware that with primitives casting is allowed for widening operations (ie byte to int).
但我编译没错啊。
-----------------------------------------------
public class t 
{
 static int i;
 public static void main(String argv[])
 {
  System.out.println(i);
  
 }
}
Class level variables are always initialised to default values. In the case of an int this will be 0. Method level variables are not given default values and if you attempt to use one before it has been initialised it will cause the Error Variable i may not have been initialized 
但我编译运行得到 0 。
------------------------------------------------

|
你对 Java 的理解可能没错,但是对英文的理解可能有错。 :)
1、Without the cast to sub you would get a compile time error. 
参考译文:如果没有(显式)到 sub 的 cast 的话,你将会得到一个编译错误。
注意 would 的用法,虚拟语态。这句话的意思其实是,例子中因为有 cast 到 sub,所以不会有编译错误!

2、Class level variables are always initialised to default values. In the case of an int this will be 0. Method level variables are not given default values and if you attempt to use one before it has been initialised it will cause the Error Variable i may not have been initialized 
参考译文:类级别的变量总是被初始化成缺省值。在这种情况(即例子情况)下 int 会是 0。在类的方法一级的变量是不会被赋初值的,如果你在变量被初始化前使用它,将会得到一个错误:变量 i 可能未被初始化。

看样子你还是应该同时也补习一下英文呀,否则小心理解得正好相反可就糟了。 :)



-----------------------------------------------
public class t 
{
static int i;
public static void main(String argv[])
{
  System.out.println(i);
  
}
}
Class level variables are always initialised to default values. In the case of an int this will be 0. Method level variables are not given default values and if you attempt to use one before it has been initialised it will cause the Error Variable i may not have been initialized 

|
第一个 一定错  sub继承base   
第2个  默认为0

|

第一个错是运行时间错,编译当然可以过去了。因为基类转型付给子类是不允许的。


|
第一个:可以向上转型,但不能向下转型。
如果
Sub a=new Base();
Base b=(Sub)a;
是可以的
想想:
class 动物:
class 人 extends 动物;
如果
动物 a=new 动物();
人 b=(人)a;
那么b就缺少人的部分,不能正常操作
但是
人 a=new 人();
动物 b=(动物)a;
b就指向a中的动物部分,可以正常操作

第二个:类里的变量都有初值,但方法里的变量就没有初值。


|
2题应该是d阿,member variable都可以有一个缺省的初始化值的。

第一道题就不是太明白,这不是narrow casting 么 

|
1 是c 因为不能把父类cast成子类,否则虽然通过了编译,但
会导致一个 ClassCastException(是RunTimeException的子类)

2我作了试验了,是d。。。。。。书上。。。(咬咬牙)。。。
是不是书上。。。错了。。嘻嘻

|
我可以100%肯定:
第一题答案是
c.Runtime Exception (answer:right)
  因为,子类才能赋值给父类(这当然是对的)这条规则是在runtime时候才体现出来的,编译时只要casting转换正确就行。

第二题答案是
d.0
  因为,如大家所说,i是class variable, 故不仅有缺省值,而且可以直接引用。一般是用t.i引用,但这里是在自己的main函数里,所以可以把t.i简写为i。

清楚了吗?
我刚考完scjp。
模拟题上有些答案也会错的。


|
谁说基类转型付给子类是不允许的。

你试试java的这两个类。

Graphics 和 Graphics2D;

Graphics2D是Graphics的子类。

但是可以这样:(Graphics2D)(new Graphics())

不信你试试!!!!!!!!!!!

    
 
 

您可能感兴趣的文章:

  • 两个类分别放到两个文件中,如何编译
  • 求助arm-linux-gcc-3.4.1 如何交叉编译具有两个依赖库的文件?
  • 请问怎么用aCC同时编译两个.c文件
  • 自编译的helloworld程序不能同时在两个linux系统中执行????
  • 怎样用gcc编译在不同两个文件夹下的程序?
  • jbuilder5 编译器,为什么光标总停在实际上所指字符的前面两个字符前,在哪里改变一下设置,谢谢
  • 从网上载了个C++程序的源代码,包含38个.cpp和.h,还有makefile.in和makefile.am两个文件,但无configure和makefile.请问怎么编译?谢谢!
  • 最近看apue,程序4-10中,编译时,使用两个宏major和minor来访问主次设备号,没有定义是怎么回事,应该怎么解决呢?
  • jb写的一个javabean,编译说有两个错误,请大虾看代码
  • 如何编译两个java文件?如sphere.java,createspheres.java
  • 有两个:1.class与2.java,2.java继承1.class类,要把2.java编译成2.class给如何书写!
  • PHP编译安装中遇到的两个错误和解决方法
  • 各位大侠,我想编译一个多文件内核模块,但是无论怎么编,tcp_phas.c这个文件总是不编译(我在这个里面写上乱行不报错),下面是两个方法,请指教。
  • 编译内核后出现两个主要问题: 声卡没声,不能挂载windows分区
  • 真的有点灰心了,学java两个月才,最近在用jb6+weblogic6.1学习servlet,可使无论如何都无法运行,就连一个小小的.java格式的servlet程序我都没办法编译成.class文件,真的对java有点灰心了.....
  • 紧急!!!这个问题为什么出错,我想是不应该的啊两个“ON”应该是相同的才对啊结果。。。。。
  • 相同的两个东东一个对一个错(高手,低手都...完了csdn出错上次的)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • PHP中比较两个字符串找出第一个不同字符位置例子
  • C#使用ping命令的两个例子
  • 请问idltojava和idlj两个命令是什么关系,是否就是一样,为什么我用idlj做出来的东西跟例子上说的不一样????在线给分!
  • python中合并两个文本文件并按照姓名首字母排序的例子
  • Python对两个有序列表进行合并和排序的例子
  • 请教:两个EJB这间怎样互相调用?给个例子好不?
  • sql server中两个日期相减的例子
  • C++ MultiMaps 成员 swap():交换两个multimaps
  • 急!有两个char buf[]里面是两个日期(2004-08-02),怎样判断两个日期之间的天数?(只能用标准C)
  • C++ Lists(链表) 成员 merge():合并两个list
  • 一个Statement不能同时打开两个ResultSet?为了同时打开两个,可以考虑建立两个Statement?甚至两个Connection?
  • C++ Lists(链表) 成员 swap():交换两个list
  • Keepalived 能配两个虚拟ip吗,匹配两个数据库实例?
  • java/j2ee iis7站长之家
  • 可以有其他两个类的实例同时调用一个java实例的两个方法吗?
  • C++ Vectors 成员 swap():交换两个Vector
  • 两个域名,两个端口,一个服务器……
  • C++ Lists(链表) 成员 splice():合并两个list
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • C++ Strings(字符串) 成员 swap():交换两个字符串的内容
  • 下载了jbuilder5,是rar格式的,解开后有两个文件,一个是rsc-jb5.bin,一个是rsc-jb5.cue,据说这两个文件是刻光盘的,请问谁知道怎么刻?不会用这两个文件直接安装吧?谢谢!
  • C++ Strings(字符串) 成员 compare():比较两个字符串
  • 基础问题,刚学的!请教,两个日期格式变量,我要求两个日期之间的天数,怎么求?
  • cocos2d中CCSpriteFrameCache文件同时存在两个plist的问题解决
  • 主进程有两个线程,fork子进程后复制主进程两个线程的内存么?
  • 我机器上安装了linux和win2000两个系统,请问如何在两个系统之间切换。
  • linux字符模式下怎样可以运行两个任务(开两个终端)
  • 听说,初学JAVA有两个开源程序是必看的,请问是哪两个。在那里下载?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3