日期:2014-05-20  浏览次数:20686 次

【讨论】Java的关键字new为什么不取消呢?
Java初学,这种问题贻笑大方了,还请各位大侠不吝指教。

  我学的还不深,似乎Java 所有的对象定义都使用,诸如 Myclass mc=new Myclass()的语句,相当开辟了一片内存,同时返回了指向这片内存的指针(Java喜欢说是句柄,引用)。

  既然所有的定义,都这么干,那作为一个语种,就把new关键字取消好了,这种事情让编译器自己知道不就可以了?为什么还要有这个关键字呢?

------解决方案--------------------
用spring吧。IOC控制反转。spring工厂自动帮你创建
------解决方案--------------------
楼主naive啊
如下代码:
Java code
public class Test {
    public Test() {
        System.out.println("const");
    }
    
    public static Test Test() {
        System.out.println("normal method");
        return new Test();
    }
    
    public static void main(String[] args) {
        Test t = new Test();
    }
}

------解决方案--------------------
LZ,记住一句话,入乡随俗。没必要纠结,否则大家还会讨论为什么不取消C++的delete,还有把VB.NET的IF THEN ... END IF统一成C语言风格...这样没完没了的问题

把我在前两天其他帖子里面的话再概括一遍:

不是说java的思维方式(或者编码方式)就是正确的,就是最好的。

这就好比,中文习惯说“我认为这个不...”,而英文一般习惯说“I don't think ...”。没谁对,谁错,完全是习惯问题。

建议在学习java或者其他语言(包括人类/编程语言)的时候,也按照这种入乡随俗的方式thinking in ...

之所以要入乡随俗,就是因为大家都是这么思考,包括Java语法的制定者,JDK或者其他类库、框架的编写者,也包括你的同事,都是以同样一种思维方式(或许是好的或许是不好的,who cares)在工作,你只有融入他们,才能事半功倍,否则,多半是撞了南墙还一事无成。

编程语言如是,人类语言亦如是。

------解决方案--------------------
探讨
谢谢,这个例子让我稍微明白点了。普通函数名怎么还可以与构造函数名一样啊……好像和C++还是不大一样

对于您的这个例子,我觉得,如果java这样规定:
1. Test t或者Test t()表示创建一个对象的引用(自然会调用构造函数)
2. Test t=Test();表示调用普通函数
不就行了?

------解决方案--------------------
还有多态,其实8楼已经说了
Student extends Person;

Person p = new Student();
如果木有new,你的p只能定义成Person的实例,不能有上面那种写法。
而多态是java的重要特性,灵活性很高。你这么做,就把多态给封杀了,为了一句简单的便利,付出代价是惨痛的。
------解决方案--------------------
探讨

引用:

数组怎么办



你说的没错,其实不仅仅是数组,形参如果是非内置类型,那么方法里可能还是要进行是否null的判断。

我在想,我起初问这个问题,是因为隐约觉得,Java似乎希望把“指针”相关的概念都屏蔽掉。因此我才会觉得new、null这种带有“指针”痕迹的东西都能内部封装,或许才叫完美吧。

不知道Java后续的版本会怎样发展……

我继续……

------解决方案--------------------
探讨
引用:

引用:
引用:

还有多态,其实8楼已经说了
Student extends Person;

Person p = new Student();
如果木有new,你的p只能定义成Person的实例,不能有上面那种写法。
而多态是java的重要特性,灵活性很高。你这么做,就把多态给封杀了,为了一句简单的便利,付出代……