Java语义上的漏洞

作者在 2006-10-06 05:27:00 发布以下内容

对于长期使用C++的人来说,这样的语义确实叫人一下子难以接受。

/*
 * Main.java
 *
 * Created on 2006年8月17日, 下午8:28
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package javaapplication2;

/**
 *
 * @author Zenny Chen
 */

class Parent
{
    protected int t;
   
    public Parent()
    {
        System.out.println("Creating Parent...");
        create();
    }
   
    public void create()
    {
        System.out.println("Parent created!");
       
        t = 1;
    }
}

class Child extends Parent
{
    private int c;
   
    public void create()
    {
        c = 1;
        System.out.println("Child created!");
    }
   
    public Child()
    {
        System.out.println("Creating Child...");
        create();
    }
   
    public int getValue()
    {
        return c + t;
    }
}

public class Main {
   
    /** Creates a new instance of Main */
    public Main() {
    }
   
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
       
        Child ch = new Child();
       
        System.out.println("The result is: "+ch.getValue());
    }
}

从语义学和工程学角度,在Child对象被创建时首先要创建其父类域,然后可以根据父类属性
来获得创建自身资源的需要。然而Java在处理方法重写这个语义时,执行的是“一刀切”,
父类域尚未被创建完就开始调用其子类所重写的方法来。这样很可能造成子类的资源也无法
被初始化(若子类构造方法不去构建)。
从这点上,C++做得就比较好。创建一个对象就像造房子,一层一层建造。C++中虚函数的多态性
不会表现在构造函数和析构函数中,而且构造函数和析构函数也不会受到const对象的限制。
尽管在语义的实现上确实要比Java复杂一点,但符合语义学和工程学。

                 转自:CSDN                

 

作  者:

 

zenny_chen (ACE Intercessor)

高手们的杰作 | 阅读 1026 次
文章评论,共1条
海啸南风(作者)
2006-10-07 05:06
1
十分感谢这位“游客”的指教。

我想作为世界著名的程序语言,c++和java都是各有所长的。

这篇文章的作者以一名c++程序员的角度表达了自己理解java上的困难,而对于以前掌握一些c++并正在学java的初学者的我来说,可能这正是自己从c++向java转变思维的关键点,提高自己,这才是我转发此贴的目的,而不是完全赞同作者对java的偏见。

欢迎楼上朋友的来访!欢迎今后多来指教!
游客请输入验证码