黑马程序员技术交流社区

标题: 关于super的小问题 [打印本页]

作者: 忧伤    时间: 2013-9-10 22:59
标题: 关于super的小问题
本帖最后由 杨增坤 于 2013-9-11 17:18 编辑

class  yyao
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
                 Zi y=new Zi();
                 y.show();
    }
}
class Fu
{
    private int num = 9;
    public void show1(){}
    public void setNum(int num)
    {
        this.num  = num;
    }
    Fu(){}
}

class Zi extends Fu
{
    //int num = 4;

    void show()
    {
        int num = 7;
        System.out.println(super.num);
    }
}
毕老师第8天的一段代码改了下 为什么这段代码出错了还能编译生成.class文件和运行输出部分结果


作者: 常在河边走_    时间: 2013-9-10 23:10
等等等等等等
作者: 流浪的风    时间: 2013-9-10 23:13
本帖最后由 流浪的风 于 2013-9-10 23:24 编辑
  1. 是因为代码是按照从上到下的顺序执行的,把打印语句放到y.show()下面就不会被打印了,出现错误会中断程序。
复制代码

作者: CHJ    时间: 2013-9-10 23:15
本帖最后由 CHJ 于 2013-9-10 23:18 编辑

额,回答错了
作者: 杨增坤    时间: 2013-9-10 23:45
class Fu{    private int num = 9;    public void show1(){}    public void setNum(int num)    {        this.num  = num;    }    public int getNum() {                return num;        }        Fu(){}}

class Zi extends Fu
{
    //int num = 4;

    void show()
    {
        int num = 7;
       System.out.println(super.getNum());//这里应该改成这个因为父类中的num是私有化的,子类继承的父类的公有的方法或者是属性,所以只能调用父类的公有的成员。
    }
}

希望对你有帮助!


作者: 陶智第    时间: 2013-9-11 08:18
这个我想编译时在main方法中程序顺序编译,当到y.show()时发现有错
但前面几行代码没问题,java编译器就生成了class文件
有了class文件,程序也就自然而然会运行
只不过是运行时出现了错误
作者: 张云飞    时间: 2013-9-11 09:35
编译时每个类会生成一个class文件,所以可以理解为以类为单位的。
编译:编译时当前类中只要没有错误就可以编译通过。即使当前类中引用了出错的类,当前类也是可以编译通过的。
运行:顺序执行,第一次调用错误的语句处会抛异常或者错误。这个时候 程序会在此处终止。
这样,你的程序就可以理解了吧。
编译:
yyao类中没有错误(仅是引用了出错的类),编译是可以通过的。
Fu类中没有错误,所以编译通过。
所以编译结束出现两个class文件:yyao.class   Fu.class
运行:
既然有yyao.class   Fu.class字节码,当然可以运行了。只不过顺序运行,直到出错处抛出异常,所以打印一句,之后就抛异常了。
再举个例子:
  1. class  Test
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         System.out.println("aaaa");
  6.                
  7.                 new Test2().prin();//此处第一次调用出错语句,运行抛异常或出错
  8.                
  9.                 System.out.println("bbbb");                 
  10.     }
  11. }
  12. class Test2{
  13.         public void prin(){
  14.                 System.out.printl("bbbb"); //此句出错!!!!因此该句所在的类不能编译通过。
  15.         }
  16. }
复制代码
结果,回编译出Test.class,而没有Test2.class,运行可以打印出aaaa。

作者: 李政    时间: 2013-9-11 13:14
首先明确出错的类能编译成class文件吗 ?
1,在控制台中会从上到下编译一个java文件,如果哪个类出错了,那么编译结束,
并且不能生成这个类的class文件,这个错误的上面如果有其他的类,会生成这些类的class文件,,如果在主函数中调用到了某个没有编译通过的类,会报类不存在异常
2,在eclipse中只要保存就可以编译成class文件,但是在运行时,如果用到了某个编译不通过的类,会报Unresolved compilation problem:没有解决的编译问题

明确了上面这些,就不难理解为什么会执行一部分代码了

作者: lonely_zb    时间: 2013-9-11 15:46
System.out.println(super.getNum());//
这里应该改成这个因为父类中的num是私有化的,子类是不能继承父类的priate属性和方法的....
但是你这样写语法上没有错误,编译器能通过,但是在运行的时候异常就出来了...
作者: 忧伤    时间: 2013-9-12 21:35
张云飞 发表于 2013-9-11 09:35
编译时每个类会生成一个class文件,所以可以理解为以类为单位的。
编译:编译时当前类中只要没有错误就可以 ...

哦原来是这样的 知道了谢谢






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2