当前位置: 首页 > 知识库问答 >
问题:

为什么javac允许在类中使用字段的方法之后定义字段?

令狐宏伟
2023-03-14
int a=1 
int b=1;
int sum=0;
sum=a+b;

.我的理解是,这是因为javac像解释器一样工作,逐行读取。但是当涉及到我们调用类中的字段并向其传递值的方法时,我们可以在方法声明之后定义字段。

public class Dog extends Animal{
public Dog(String name, int weight, int teeth, String coat) {
    super(name, true, true, weight);
    this.tail=true;
    this.eyes=2;
    this.teeth=teeth;
    this.coat=coat;

}

private int eyes;
private boolean tail;
private int teeth;
private String coat;}

参数eyes、tail、Teath和coat在用于将值传递给构造函数后定义。javac如何理解方法后有一个变量。允许这样做是因为我们只能定义字段,而不能在类定义中对它们进行任何操作吗?

共有1个答案

蒙光华
2023-03-14

局部变量声明(以及最终的初始化)与它所在的块一起执行,并从其进行访问;
在创建实例时,在执行方法1之前,执行实例字段声明(以及初始化)。

另一方面,这是不允许的:

public class Dog extends Animal {
    private int total = eyes + teeth;  // ERROR!
    private int eyes = 2;
    private int teeth = 24;
}

上面的代码不能编译--这是故意的!

public class Dog extends Animal {
    private int eyes = 2;
    private int teeth = 24;
    private int total = eyes + teeth;  // OK
}

为什么...?简而言之:它是以这种方式指定的,请参见Java语言规范(JLS)-声明的范围:

在类或接口C(§8.2,§9.2)中声明的成员m的声明的范围是C,...

由局部变量声明语句(§14.4.2)在块中声明的局部变量的作用域是块的其余部分,...

 类似资料:
  • 问题内容: 我用来解析/验证用户输入。不幸的是,它在解析时允许字符作为后缀。 示例代码: 结果: 我实际上希望他们两个都有解析异常。我怎样才能告诉我不允许输入? 问题答案: 从以下文档中: 从给定字符串的开头解析文本以产生数字。 该方法可能不会使用给定字符串的整个文本。 这是一个示例,可以使您了解如何确保考虑整个字符串。 输出:

  • 我看到了这种奇怪的行为,我想知道是否有合理的解释: 当我(意外地)在函数的局部变量中添加了一个额外的分号时,如: 它确实可以编译,但它表明它是多余的。 但当我对字段执行此操作时(也是偶然),我得到了一个错误(编译): 问题 是否有任何理由限制这些领域? Nb我已经知道了不允许带有字段的另一个限制因素。但这里有所不同。

  • 问题内容: 我有以下html5输入元素: 为什么此输入允许在输入字段中输入字符“ e”?没有其他字母字符可以输入(按预期方式) 使用chrome v.44.0.2403.107 问题答案: 因为这正是规范所说的应该工作的方式。输入的数字可以接受浮点数,包括负号和或字符(其中指数是或后面的数字): 浮点数按以下顺序由以下部分组成: 可选地,第一个字符可以是“ ”字符。 “ ” 范围内的一个或多个字符

  • 问题内容: 我有Foo模型,其中有栏杆。bar字段应该是唯一的,但允许为空,这意味着如果bar字段为,我想允许多个记录,但如果不是,则值必须是唯一的。 这是我的模型: 这是该表的相应SQL: 当使用管理界面在bar为null的情况下创建多个1个foo对象时,它给我一个错误:“此Bar的Foo已经存在。” 但是,当我插入数据库(PostgreSQL)时: 这样做很好,它允许我插入1条以上且bar为n

  • 当我尝试在我的字段中添加十进制输入时,例如:12.54。它表示以下文本:请输入一个有效的值。两个最接近的有效值是12和13。 它不允许我在字段中键入十进制输入。。。。 我如何解决这个问题?

  • 问题内容: 这是我的代码,但是我没有得到方法如何接受类型作为返回值。如何运作?谁能解释一下这种方法的工作原理? 提前致谢 :) 问题答案: 好的,所以首先要做的是: 这是一个不断扩大的原始类型转换,因此这是合法的。您可以: 但是您不能: 第二:它返回的根本不是ASCII码。Java执行Unicode。 碰巧的是,当创建Java时,Unicode仅定义了适合16位的代码点。因此,它被创建为2字节的无