Java可以做哪些Python做不到的事情?

13 投票
5 回答
14631 浏览
提问于 2025-04-16 12:34

我想学一种新的编程语言——Java,因为我已经用Python有一段时间了。但我发现用Java能做的事情,Python也能做到。所以我想知道:

  1. 有什么事情是Java能做而Python做不了的?
    • 移动编程(比如Android开发)。
    • POSIX线程编程。
  2. 反过来,有什么事情是Python能做而Java做不了的呢?

补充说明: 我希望得到一个实用的回答,而不是理论上的讨论,内容应该是关于现在的情况,而不是未来的预测。理论上所有编程语言都能完成任何任务,但实际上每种语言都有自己的局限性。

5 个回答

3

你一定会喜欢下面这两种语言之间的比较。
快来看看吧:

13

这两种语言都是图灵完备的,也就是说它们都能完成任何计算任务。它们都有很多现成的库可以使用,而且都支持用C语言写扩展,这样你就可以在需要的时候访问底层代码。它们之间的主要区别在于目前的支持情况。一般来说,Java的支持范围比Python更广。

你提到的Android就是一个Java的标准选择,虽然Python也有一些支持,比如Android脚本环境。大多数家用电脑上都已经安装了Java。你可以编写Java小程序,并且大部分浏览器都能正常运行它们。

不过,在Java中,你不能很方便地快速编写一些短小的脚本来完成有用的任务。相比之下,Python更适合用来写脚本(当然,还有其他选择)。

4

我想用Jython的话,你可以用Python做任何在Java中能做的事情。

反过来说,Python有一个叫PyPy的编译器,这个东西挺酷的——它是一个虚拟机,有很多不同的后端(比如Java运行时、LLVM、.net,还有Python本身,没记错的话),有多种垃圾回收机制,还有多种实现方式(比如无栈实现)等等。我知道Java有很多虚拟机可供选择,但PyPy的发展真是惊人,因为它是用RPython写的,这是一种相对高效的语言。

另外,Java能做到这一点吗?只用一个文件,少于20行代码,而且不需要导入任何库?显然这两种语言都有可以做到这点的库,但我只是想讨论一下这两种语言的灵活性。

class Logger(object): # boilerplate code
    def log(self,level,msg,*args,**kwargs): # *args, **kwargs = flexible arguments
        self._log(level,msg,*args,**kwargs) # call with flexible argments

    def _log(self,level,msg,*args,**kwargs):
        # override me at runtime :) 
        # I think Java people call this Dependency Runtime Injection
        if level>1:
            print msg,args,kwargs

logger = Logger() # boilerplate code

def logged(level): # what pattern do you call this?
    def logged_decorator(function): # and this? 
        def func(*args,**kwars): 
            name = func.__name__ # look ma, reflective metaprogramming!
            logger.log(level,name,*args,**kwargs)
            return func(*args,**kwargs)
        return func # boilerplate code
    return logged_decorator # boilerplate code

示例用法:

@logged
def my_func(arg1,arg2):
   # your code here
   pass

撰写回答