【问题标题】:Java v/s C++ - Returning final objects from a method in JavaJava vs C++ - 从 Java 中的方法返回最终对象
【发布时间】:2017-06-05 06:08:18
【问题描述】:

我知道方法定义中指定的“final”关键字声明这些方法不能被覆盖。但是如果我想要一个方法返回一个最终对象呢?你如何在 Java 中指定这个?

class A{
    final int x;
    A(){
        x = 5;
    }
    final int getx(){
        return x;
    }
}
class B extends A{
    final int x;
    B(){
        x = 5;
    }
    final int getx(){
        return x;
    }
}
class he{
    public static void main(String args[]){
        A a = new A();
        final int x = a.getx();
        System.out.println(x);
    }
}

上面的代码给出了编译错误。我知道我重写最终方法的原因。但我的意图是从 getx() 返回一个最终对象(即将 x 作为最终整数返回)。

这是我的 C++ 等效代码。它工作得很好。

#include <bits/stdc++.h>
class A{
public:
    const int x;
    A():x(5){
    }
    const int getx(){
        return x;
    }
};
class B:public A{
public:
    const int x;
    B():x(5){
    }
    const int getx(){
        return x;
    }
};
int main(){
    A *a = new A();
    const int x = a->getx();
    std::cout<<x<<std::endl;
    return 0;
}

这是因为 C++ 有两个不同的关键字——“const”和“final”。在 C++ 中,'final' 关键字在函数原型的末尾指定,如下所示:

virtual int getx() final {}

所以这两个关键字区分“什么是方法的返回类型”和“哪些方法不能被覆盖”。

我的问题是:有没有办法在 Java 中做同样的事情?

【问题讨论】:

  • @juanchopanza 哦,是的。对此感到抱歉。让我编辑
  • 不清楚你所说的“在 Java 中做同样的事情”是什么意思
  • 与您的问题无关,但您应该阅读Why should I not #include <bits/stdc++.h>?
  • @juanchopanza 有没有办法从java中的方法返回final int?就像我们在 C++ 中返回 const int 一样。
  • @Someprogrammerdude 竞争性编程迫使我使用这些技巧 :)

标签: java


【解决方案1】:

Java 中的final 和 C++ 中的const 是非常不同的东西,尝试将 C++ 中关于常量的想法应用于 Java 是行不通的。

在 Java 中,final 表示数据类型

  1. 此对象是不可变的(仅适用于本机类型)。
  2. 对该对象的引用是不可变的(对于用户定义的类型)。这意味着持有对该对象的引用的变量不能更改为指向不同的对象。然而,这并不意味着底层对象是不可变的。

现在,如果我从 Java 中的函数返回一个值,它要么是按值返回的本机类型,要么是按引用返回的用户定义类型。在这两种情况下,我们返回值的最终限定符都是多余的。

  1. 从原生类型的函数返回的右值已经是不可变的。
  2. 从函数返回的引用也是右值,也是不可变的。

然而,在 C++ 中,const 限定返回值(为简单起见,我们假设对 const 的引用)意味着返回引用的基础对象是不可变的,因此您不能使用该引用调用非 const 函数。

final 是在 C++11 中添加的,表示该成员函数不能被继承类(与 Java 相同)覆盖。

要点是 Java 不像 C++ 那样具有 const 正确性,如果您不混合这些概念,您的生活将会更轻松。

【讨论】:

  • 这个答案不正确。 “本机”类型和“用户定义”类型之间的区别在 Java 中并不存在,无论它应该是什么意思。 “不可变”一词的使用毫无意义。 “从函数返回的引用也是右值,也是不可变的。”嗯?引用在 Java 中不称为“不可变”,如果不可更改,则称为 final。 Java 甚至没有将“最终限定符放在我们的返回值上”的机制,更不用说“冗余”方式了。我在这个答案中找不到任何有意义的东西。
  • 关于“用户定义类型,我们通过引用返回” - 这也不是真的。它与“用户定义”类型无关,它不“通过引用”返回对象,它返回引用(即指针)值,或者可以说它返回引用(即指针)。跨度>
  • Java 中的本地类型和用户定义的类型实际上是有区别的。本机类型是诸如 int、long、float、double 和 char 之类的东西。这些类型通过值传递给函数,当从函数返回时,返回值(不是引用)。另一方面,用户定义的类型(这可能不是最好的词)通过引用传递给函数,当用作返回值时,返回一个引用(这就是为什么需要使用像 Double 这样的容器对象如果他们想通过引用传递本机对象,则为 Java 中的整数)。
  • 我认为你的迂腐妨碍了你看到我在这里真正想说的话。
  • 我是说 Java 没有最终返回限定符,因为它们是多余的。从函数返回最终引用没有任何意义,因为最终限定符意味着引用不能指向任何其他对象,但函数的返回值是右值,并且右值不能更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2016-09-02
  • 2015-07-12
  • 1970-01-01
相关资源
最近更新 更多