【问题标题】:How java assign value to final attributejava如何为最终属性赋值
【发布时间】:2015-06-18 17:35:20
【问题描述】:

我们知道一个 Array 对象(数组)有一个 length 属性,它在 Java 中被声明为:

public final int length;

它被声明为final,因此不需要访问器,除非创建一个新数组,否则我们不能更改长度的值。

我的问题是:我很好奇 Java 是如何实现数组类的,以便他们能够在 length 首先被声明为 final 时为其赋值?

实现会是什么样子?


注意:我不是在问如何更改数组的长度。我在问它是如何实现的,以便可以更新最终属性的值。

【问题讨论】:

  • 为了清楚起见,我已经编辑了标题。

标签: java arrays implementation


【解决方案1】:

它不会改变它的值,它只分配一次并且永远不会改变。每个实例的数组是固定长度的,并且该数组在其构造函数中为 final 字段分配一个值(只要它只有一次)。

【讨论】:

  • 在构造函数中你可以给final字段赋值
  • 你能给出一个工作代码示例吗?我已经在构造函数中尝试过了,它没有用。 error: cannot assign a value to final variable length 来自构造函数的错误消息。
  • @user3437460 只能在数组的构造函数中赋值,你无权访问,也不能写。
  • @DJClayworth 我认为 OP 意味着他们正在他们的代码中尝试这样做,但它不起作用。
  • 在发帖之前,我实际上是自己在构造函数中尝试过的。但是我没有意识到主要的一些代码正在尝试将最终值更改为膨胀。因此我认为构造函数不能改变它。无论如何,我仍然会在 8 分钟内接受你的回答。
【解决方案2】:

就像用户 Jigar Joshi 所说的那样。可以在构造函数中分配声明为final 的属性。

我将在这里为未来感兴趣的用户编写一个简单的示例。尽管如此,我还是会接受他的回答。

class Test
{
    public final int val;

    public Test(){
        val = 5;  //This is allowed in Java
    }       
}

【讨论】:

    【解决方案3】:

    答案很简单:

    类的最终成员变量必须以下列方式之一进行初始化:

    1. 申报时:

      public class Foo{
          private final int size = 10;
      }
      
    2. 在该类的每个构造函数结束时:

      public class Bar{  
          private final int size;
      
          public Bar(int n){
              this.size = n;
          }
      
          public Bar(int n, String name){             
              this.size = n;
          }
      
          ...
      }
      

    这意味着如果您有例如 5 个不同的构造函数,那么您必须保证最终变量在执行每个变量结束时被初始化。

    数组类的实现与上面类似。一旦使用了 [] 运算符,底层机制就会调用该类的构造函数,并且最终变量 size 通过该构造函数进行初始化并且永远不会更改。

    这个解释比较形象,不准确,但我希望这有助于澄清这个概念。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多