我的账户
动脑学院

教育培训在线课程

亲爱的游客,欢迎!

已有账号,请

如尚未注册?

一个java语义上的漏洞

[复制链接]
admin 发表于 2019-2-15 12:01:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
对于长期使用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复杂一点,但符合语义学和工程学。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则