Java v/s C++;-在Java中从方法返回最终对象

Java v/s C++;-在Java中从方法返回最终对象,java,Java,我知道在方法定义中指定的'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

我知道在方法定义中指定的'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);
    }
}
上面的代码给出了一个编译错误。我知道我重写final方法的原因。但我的意图是从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;
}
因此,这两个关键字区分了“什么是方法的返回类型”和“哪些方法不能被重写”


java的java语言C++中的代码> > p> >代码>最终的<代码> > C++中的代码> const 是非常不同的事情,试图将C++中关于常量的思想应用到java中是不起作用的。p> 在Java中,数据类型的
final
表示

  • 此对象是不可变的(仅适用于本机类型)
  • 对此对象的引用是不可变的(对于用户定义的类型)。这意味着持有对该对象的引用的变量不能更改为指向其他对象。然而,这并不意味着底层对象是不可变的
  • 现在,如果我从Java中的函数返回一个值,它要么是一个本地类型,我们通过值返回,要么是一个用户定义的类型,我们通过引用返回。在这两种情况下,返回值上的最后一个限定符都是多余的

  • 从本机类型的函数返回的R值已经是不可变的
  • 从函数返回的引用也是右值,也是不可变的
  • <>在C++中,一个<代码> const 合格返回值(比如,引用const为简单起见)意味着返回引用的对象是不可变的,因此不能使用该引用调用非const函数。
    final
    是在C++11中添加的,这意味着该成员函数不能被继承类(与Java相同)重写


    外挂是java没有C++相同的正确性,如果你不混合这些概念,你的生活会更容易。对不起。让我来编辑一下与您的问题无关的“在Java中做同样的事情”并不清楚您的意思,但是您应该阅读@juanchopanza是否有任何方法可以从Java中的方法返回final int?就像我们在C++中返回const int。@一些程序员竞争编程迫使我使用这样的技巧:这个答案是错误的。“本机”类型和“用户定义”类型之间的区别在Java中并不重要,不管它是什么意思。“不可变”一词的用法毫无意义。“从函数返回的引用也是右值,也是不可变的。”嗯?在Java中,引用不称为“不可变”,如果不可更改,则称为

    final
    。Java甚至没有一个机制来将“最终限定符放在返回值上”,更不用说“冗余”的方式了。我在这个答案中找不到什么有意义的东西。关于“用户定义的类型,我们通过引用返回”——这也不是真的。它与“用户定义的”类型无关,它不“通过引用”返回对象,它返回引用(即指针)值,或者可以说它返回引用(即指针)。事实上,Java中本机类型和用户定义类型之间存在区别。本机类型包括int、long、float、double和char。这些类型通过值传递到函数中,当从函数返回时,返回值(不是引用)。另一方面,用户定义的类型(可能不是最好使用的词)通过引用传递到函数中,当用作返回值时,将返回一个引用(这就是为什么在Java中,如果要通过引用传递本机对象,需要使用容器对象,如Double和Integer).我认为你的学究作风妨碍了你理解我在这里的真正意思。我是说Java没有最终返回限定符,因为它们是多余的。从函数返回最终引用并不意味着什么,因为最终限定符意味着引用不能指向任何其他对象,但是从函数返回的值是右值,并且右值不能更改。
    virtual int getx() final {}