2017-06-05 85 views
0

我知道在方法定义中指定的'final'关键字声明这些方法不能被覆盖。但是如果我想要一个方法返回最终对象呢?你如何在Java中指定它?Java v/s C++ - 从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++“最终”关键字:

virtual int getx() final {} 

所以这两个关键字的区别“什么是方法的返回类型”和“该方法不能被重写” 。

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

+0

@juanchopanza哦,是的。对不起。让我编辑 – Sushant

+0

不清楚你的意思是“在Java中做同样的事” – juanchopanza

+0

与你的问题无关,但你应该阅读[为什么我不应该#include ?](http:/ /stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h) –

回答

0

final在Java中和const在C++中是非常不同的东西,并试图将C++中关于常量的想法应用于Java不起作用。

在Java中,final对于数据类型意味着

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

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

  1. 从函数返回的本机类型的Rvalues已经是不可变的。
  2. 从函数返回的引用也是rvalues,也是不可变的。

在C++然而,const合格返回值(假设为简单起见成const的引用)意味着返回的参考基础的目的是不可变的,并且因此不能调用使用参考非const函数。

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

结论是,Java没有像C++那样的const正确性,如果你不混合这些概念,你的生活会更容易。

+0

这个答案是不正确的。 “本地”类型和“用户定义”类型之间的区别在Java中并不是什么东西,无论它应该是什么意思。 “不可变”这个词以无意义的方式使用。 “从函数返回的参考也是rvalues,也是不变的。”咦?在Java中引用不称为“不可变的”,如果不可更改,它们称为“final”。 Java甚至没有一种机制可以将“最终限定符放在我们的返回值上”,更不用说“冗余”了。在这个答案中,我找不到多少有意义的东西。 –

+0

关于“我们通过引用返回的用户定义类型” - 这也不是真的。它与“用户定义”类型无关,并且不会通过引用返回对象,它返回引用(即指针)值,或者可以说它返回引用(即指针)。 –

+0

实际上Java中的本地类型和用户定义类型之间存在区别。本地类型是像int,long,float,double和char之类的东西。这些类型通过值传递给函数,并且当从函数返回时,返回值(不是引用)。另一方面,用户定义的类型(可能不是最好的单词)通过引用传递给函数,当用作返回值时,将返回一个引用(这就是为什么需要使用容器对象如Double和Java中的Integer,如果他们想通过引用传递本地对象)。 –