`

声明前为什么能赋值却不能输出,都是使用

阅读更多
public class Stack {
	static {
		a = 6;// ---- 1
		System.out.println(a);// ---- 2
	}
	static double a = 3.234; 

	public static void main(String[] args) {
		System.out.println(a);
	}

	public void go() {
		a = 7;
		System.out.println(a);
		int a;
	}
}
 

以上代码1处可以,2处却编译出错

 

回答:

就是说,成员在使用前(此“前” 指 代码书写文本顺序)需定义,且成员必须是类或接口C的实例或静态变量,(局部变量不受文本顺序限制)


* The usage occurs in an instance (respectively static) variable initializer of C or in an instance (respectively static) initializer of C.
使用须出现在C的实例变量初始化体或静态变量初始化体,C的实例初始化块或静态初始化块中       

* The usage is not on the left hand side of an assignment.
使用须在赋值式左手边(这里原文表达可能有些问题,通过后文确认了)

* The usage is via a simple name.
使用须是简单命名

* C is the innermost class or interface enclosing the usage.
C是包含该“使用”的直接上层类或接口

 

摘自:

http://java.sun.com/docs/books/jls/third_edition/html/classes.html#287406

8.3.2.3 Restrictions on the use of Fields during Initialization

 

 

public class Test  {

    public int instancevariable;

    public static int staticvariable;

    static {
        System.out.println("Static Initializer...");
    }

    {
        System.out.println("Instance Initializer...");
    }

    public Test() {
        System.out.println("Constructor...");
    }
}

 

class UseBeforeDeclaration {
	static {
		x = 100; // ok - assignment
		int y = x + 1; // error - read before declaration
		int v = x = 3; // ok - x at left hand side of assignment
		int z = UseBeforeDeclaration.x * 2;
		// ok - not accessed via simple name
		Object o = new Object() {
			void foo() {
				x++;
			} // ok - occurs in a different class

			{
				x++;
			} // ok - occurs in a different class
		};
	}
	{
		j = 200; // ok - assignment
		j = j + 1; // error - right hand side reads before declaration
		int k = j = j + 1;
		int n = j = 300; // ok - j at left hand side of assignment
		int h = j++; // error - read before declaration
		int l = this.j * 3; // ok - not accessed via simple name
		Object o = new Object() {
			void foo() {
				j++;
			} // ok - occurs in a different class

			{
				j = j + 1;
			} // ok - occurs in a different class
		};
	}
	int w = x = 3; // ok - x at left hand side of assignment
	int p = x; // ok - instance initializers may access static fields
	static int u = (new Object() {
		int bar() {
			return x;
		}
	}).bar();
	// ok - occurs in a different class
	static int x;
	int m = j = 4; // ok - j at left hand side of assignment
	int o = (new Object() {
		int bar() {
			return j;
		}
	}).bar();
	// ok - occurs in a different class
	int j;
}
 
分享到:
评论
1 楼 iamzhoug37 2015-02-28  
您能说一下"局部变量不受文本顺序限制" 是什么意思吗? 不是很明白

相关推荐

    c语言数据输入输出、赋值、 顺序结构程序设计

    《C语言数据输入输出、赋值与顺序结构程序设计详解》 C语言是计算机编程的基础,其中数据的输入输出、赋值以及顺序结构程序设计是初学者必须掌握的基本概念。在C语言中,数据的输入输出并非直接通过特定的语句实现...

    SQL变量声明和赋值知识归纳

    本文将深入探讨SQL中的变量声明和赋值方法,旨在为初学者提供一个全面的理解框架,同时为有经验的开发者提供一个快速回顾的平台。 ### SQL变量声明 在SQL中,变量用于存储数据,它们可以是在查询过程中动态生成或...

    java 给指定字符赋值

    在Java中,某些特殊字符不能直接作为字符值赋给变量,如换行符(\n),制表符(\t)等。这些字符需要使用转义序列`\`来表示。例如: ```java char newline = '\n'; ``` 这里的`\n`是一个转义序列,代表换行。 3. *...

    C++兼容赋值原则

    1. 默认情况下的数据类型:在C++中,char和int类型的数据默认是有符号数,除非明确地声明为无符号数。 2. 实型常量的默认类型:实型常量默认是double类型,如果后缀是F则为float类型。 3. 预处理:预处理是指在...

    C#数据实体类中如何给属性赋值

    ### C# 数据实体类中如何给属性赋值 在C#开发中,处理数据库查询结果时,经常需要将查询结果映射到实体类中。本文将详细介绍如何在C#的数据实体类中为属性赋值,特别是当从数据库中取出的是一个`DataSet`对象时。 ...

    C++动态二维数组的申请、赋值、使用、释放以及作参数示例

    ### C++动态二维数组的申请、赋值、使用、释放及作参数详解 #### 一、引言 在C++编程中,动态二维数组是非常重要的数据结构之一,它能够根据程序运行时的需求灵活地分配内存空间。本文将详细介绍如何在C++中创建、...

    121输入、输出和赋值语句.ppt

    在程序设计语言的世界里,输入、输出和赋值语句是构建算法的基础构件,它们允许程序与外部世界沟通,处理数据,并将结果反馈给用户。通过对这些基础语句的理解和应用,编程新手可以顺利地迈入程序设计的门槛,而经验...

    8.函数参数解构赋值.md

    无论是数组还是对象,解构赋值都能让我们的代码更加简洁、易读。此外,我们还探讨了使用小括号进行解构赋值的情况以及如何在实战中利用这一特性来优化代码。掌握这些技巧对于提高JavaScript编程效率是非常有益的。

    计算机二级C语言考点09赋值运算及复合赋值运算.pdf

    本资源涵盖了C语言中赋值运算和复合赋值运算的知识点,包括赋值语句的格式、赋值运算符、复合赋值运算符、变量的定义和赋值、表达式的计算顺序等。 一、赋值语句 赋值语句是将一个值赋给变量的语句。基本格式为:...

    编一个程序,定义结构类型(有学号、姓名、性别和程序设计成绩四个字段),声明该结构类型变量,用赋值语句对该变量赋值以后再输出。

    接下来,我们可以声明结构类型的变量,并用赋值语句为其赋值。例如: ```c int main() { Student stu1; // 赋值 strcpy(stu1.id, "001"); strcpy(stu1.name, "张三"); strcpy(stu1.gender, "男"); stu1....

    Verilog语言中wire与reg的区别以及inout使用

    inout端口不能声明为reg类型,只能是wire类型。inout端口可以用于输入和输出信号的交换,它们之间的差异就在于输入和输出的方向不同。inout端口可以用在模块之间的数据传输中,例如,在一个模块中inout端口可以作为...

    易语言源码易语言学习进阶二维数组赋值源码.rar

    在深入学习过程中,除了基本的声明、初始化、赋值和访问外,还需要掌握一些高级技巧,比如动态调整数组大小、使用指针操作数组、以及结合其他易语言特性的高级应用等。通过不断实践和探索,学习者能够逐步提高自己的...

    1.2编程基础之变量定义、赋值及转换.zip

    同时,解决这些小问题也能帮助初学者锻炼逻辑思维和问题解决能力,为后续更复杂的编程任务打下坚实的基础。在学习过程中,不断实践和调试代码是提高技能的关键,这10个文件提供的案例正好提供了这样的机会。

    易语言控制台指定输出源码

    2. **变量声明与赋值**:定义变量存储数据,并用“=”进行赋值操作。 3. **输出命令**:如“输出”和“格式化输出”,用于向控制台写入信息。 4. **流程控制**:如循环和条件语句,可以控制何时及如何输出信息。 5. ...

    鲸鱼编程python赋值.docx

    接下来,Python中的变量在使用前不需要预先声明。与C++或Java等语言不同,你不需要声明变量的数据类型或预留内存空间。变量在首次赋值时自动创建,这意味着你可以直接写: ```python name = "John Doe" ``` 在这条...

    简单赋值语句的语法分析

    根据提供的文件信息,本文将对“简单赋值语句的语法分析”进行详细的解析与讨论。此代码示例主要关注于C++中的简单赋值语句语法分析过程,并且通过一个具体的实现方式来展示了如何处理这类语法分析问题。 ### 标题...

    1.2 编程基础之变量定义、赋值及转换 python版.zip

    Python是一种动态类型的语言,这意味着我们不需要提前声明变量的类型,变量的类型会根据所赋的值自动确定。 接下来是赋值。在Python中,可以将一个变量的值赋给另一个变量,如`y = x`,此时`y`也变成了10。变量可以...

    简单的C语言入门示例代码,演示基本的输入输出、变量声明等

    压缩包文件代码是一个简单的C语言入门示例代码,它演示了基本的输入输出、变量声明、赋值以及简单的算术运算。 代码说明: 1、头文件包含:#include <stdio.h> 是C语言标准输入输出库的头文件,它包含了进行输入输出...

    VB 数组的输出实例

    通过以上讲解,你应能理解VB中数组的基本操作,包括声明、初始化、赋值、输出以及动态调整。实际编程中,灵活运用数组能提高代码的效率和可读性。在处理大量数据或进行批量操作时,数组是不可或缺的工具。

    (完整版)C++必背18个经典程序.docx

    本题目要求输出 9*9 口诀,使用了 C 语言的基础知识,包括变量声明、赋值、循环语句和输出语句。该程序使用了两个循环变量 i 和 j,通过循环输出 9*9 口诀的结果。 2. 兔子繁殖问题 本题目是一个经典的递归问题,...

Global site tag (gtag.js) - Google Analytics