`
L.G.Alexander
  • 浏览: 157968 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(七):final与static final变量(原生类型)的初始化方式

阅读更多
public class FinalOriginalTest {
	private final int a;
	private String name;
	public FinalOriginalTest(){
		a = 3;
	}
	public FinalOriginalTest(String name){
		this.name = name;
	}
	public static void main(String[] args){
		FinalOriginalTest ft = new FinalOriginalTest();
		FinalOriginalTest ft1 = new FinalOriginalTest("hello");
	}
}

问题1:上面的程序能否编译通过?如果不能,请说明理由。
解答:不能编译通过,可能没有初始化变量a。因为对于final类型的成员变量的初始化,在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。所以需要在public FinalOriginalTest(String name)构造方法中给a赋值。
注意:final可以用在类、方法、变量上。
     1、final用在类上,表明当前类它不能被继承,没有子类。
     2、final用在方法上,表明当前方法不能被override,不能被重写。
     3、final用在变量上,表明当前变量是一个终态的变量,是一个常量,这个变量的值一但被赋值后就不能被改变了。
     对于final类型的成员变量的初始化方式:
     1、声明变量时直接赋值
     2、在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。

问题2:上面的程序中,修正问题1之后,将private final int a;改为private static final int a;能否编译通过?如果不能,请说明理由。
解答:不能编译通过,因为a是静态变量,在这个类还没有实例化的时候,它的值就已经有了。所以对于一个int类型的static final类型的变量a来说,我们只能在声明的时候就给它赋值private static final int a = 3;然后把构造方法里面的赋值给注释掉,这样编译就能通过了。

总结:对于final类型的变量,对于不加static我们可以有两种方式给它赋值:声明变量时直接赋值;在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。对于一个变量既是final又是static的,我们必须在声明变量时直接赋值。
分享到:
评论
3 楼 dhjterry 2009-02-28  
L.G.Alexander 写道
public class FinalOriginalTest {
	private final int a;
	private String name;
	public FinalOriginalTest(){
		a = 3;
	}
	public FinalOriginalTest(String name){
		this.name = name;
	}
	public static void main(String[] args){
		FinalOriginalTest ft = new FinalOriginalTest();
		FinalOriginalTest ft1 = new FinalOriginalTest("hello");
	}
}

问题1:上面的程序能否编译通过?如果不能,请说明理由。
解答:不能编译通过,可能没有初始化变量a。因为对于final类型的成员变量的初始化,在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。所以需要在public FinalOriginalTest(String name)构造方法中给a赋值。
注意:final可以用在类、方法、变量上。
     1、final用在类上,表明当前类它不能被继承,没有子类。
     2、final用在方法上,表明当前方法不能被override,不能被重写。
     3、final用在变量上,表明当前变量是一个终态的变量,是一个常量,这个变量的值一但被赋值后就不能被改变了。
     对于final类型的成员变量的初始化方式:
     1、声明变量时直接赋值
     2、在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。

问题2:上面的程序中,修正问题1之后,将private final int a;改为private static final int a;能否编译通过?如果不能,请说明理由。
解答:不能编译通过,因为a是静态变量,在这个类还没有实例化的时候,它的值就已经有了。所以对于一个int类型的static final类型的变量a来说,我们只能在声明的时候就给它赋值private static final int a = 3;然后把构造方法里面的赋值给注释掉,这样编译就能通过了。

总结:对于final类型的变量,对于不加static我们可以有两种方式给它赋值:声明变量时直接赋值;在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。对于一个变量既是final又是static的,我们必须在声明变量时直接赋值。

2 楼 likezhou 2009-02-28  
引用
问题2:上面的程序中,修正问题1之后,将private final int a;改为private static final int a;能否编译通过?如果不能,请说明理由。
解答:不能编译通过,因为a是静态变量,在这个类还没有实例化的时候,它的值就已经有了。所以对于一个int类型的static final类型的变量a来说,我们只能在声明的时候就给它赋值private static final int a = 3;然后把构造方法里面的赋值给注释掉,这样编译就能通过了。

还可以在static{}这样的静态块中初始化它
1 楼 zhxing 2009-02-28  
如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。所以需要在public FinalOriginalTest(String name)构造方法中给a赋值.
还可以..就上面的刚开始有点不懂..现在看明白了

相关推荐

    java学习总结 (2).pdf

    18. `final`变量初始化:除了初始化块和构造方法,`final`变量也可以在声明时直接赋值。 19. `static`与`final`关键字:`static`常用于修饰类级别的变量和方法,使得它们属于类本身而非类的实例。`final`常用于创建...

    java简答题答案.pdf

    - **显示初始化**:执行域变量的显示初始化。 - **执行构造代码**:执行构造方法中的代码。 17. **接口**: - **接口(Interface)**:一组方法的声明,可以被类实现,提供多继承功能。 18. **抽象类与接口的...

    关于Java中各种修饰符与访问修饰符的说明

    - 构造器首先调用父类构造器,然后初始化实例变量和静态变量,最后执行构造器代码。 - 如果没有显式调用父类构造器,编译器会自动添加`super()`,但如果父类没有无参构造器,会导致编译错误。 - `private`构造器...

    抽象和封装PPT

    1.如何抽象出类 1.1 找简单名词 ----------发现类 ...7.八种原生数据类型 作为属性变量的时候 系统会自动赋初值,具体如下: byte 0 short 0 int 0 long 0 float 0.0 double 0.0 boolean false char 空格

    java的测试题

    8. 数组初始化:创建一个长度为25的整型数组,`x[24]`会被初始化为0,而`x[25]`超出数组边界,未定义,答案是A。 9. 取模运算:`y%x`计算的是10除以3的余数,结果为1,答案是B。 10. 表达式合法性:`x+=y`将字符串`x...

    javascript中的关键字

    10. **for**:创建一个循环,可以定义初始化、条件和迭代表达式。 11. **function**:声明函数。 12. **if**:根据条件执行代码块。 13. **in**:检查对象是否包含特定属性。 14. **instanceof**:判断对象是否属于...

    Swift语言笔记包括简介、基本语法、数据类型等

    - `convenience`: 便捷初始化。 - `dynamic`: 动态类型。 - `didSet`: 观察属性变化。 - `final`: 最终类或方法。 - `get`: 获取属性值。 - `infix`: 前缀操作符。 - `inout`: 参数传递方式。 - `lazy`: 懒...

    c++新标准--c++11概览

    10. **统一的构造/析构(Uniform Initialization)**:通过花括号初始化不仅可以用于 aggregates(聚合类型),还可以用于任何类型的对象,简化了初始化过程。 11. **移动构造函数和移动赋值运算符**:移动构造函数...

    ISO C++最新标准(C++11)

    - **类型推导**:通过 `auto` 关键字简化了变量类型的声明,编译器可以根据初始化表达式自动推导出变量的类型。 - **统一初始化**:采用了一致的初始化语法,提高了代码的一致性和可读性。 - **模板元编程**:增强了...

    java习题集第四章

    8. 构造函数:构造函数是类的特殊方法,没有返回类型,可以有多个不同的构造函数,用于对象初始化,选项B正确描述了这一点。 9. 错误的构造函数描述:选项C错误,因为一个类可以有多个构造函数,只要参数列表不同...

    深入理解C++11:C++11新特性解析与应用 带目录

    5. **初始化列表(Initializer Lists)**:初始化列表允许在构造对象时提供一组初始化值,如`std::vector<int> v = {1, 2, 3};`,同时,它也是创建`std::map`等关联容器的关键。 6. **静态断言(Static Assert)**...

    java面试宝典

    - **不可变性**: 对于基本数据类型,`final`修饰的变量一旦初始化就不能再修改其值。 **1.11 "=="与equals方法的区别** - **"=="**: 比较两个对象的引用是否相同。 - **equals**: 比较两个对象的内容是否相同。 **...

    Java语法大全史上最全语法

    根据提供的文件信息,本文将对Java语法进行详细的解析与总结,包括基本的语法结构、关键字、数据类型、变量声明及转换等内容。 ### Java语言概述 Java是一种广泛使用的面向对象编程语言,由Sun Microsystems开发并...

    2015年腾讯Java工程师笔试题

    - **D项**:一个类可以定义多个构造器,以支持不同的初始化方式。 ### 4. 数据库访问 - **选择题**:“提供Java存取数据库能力的包是(A)” - **答案解析**:`java.sql`包提供了基本的SQL操作接口,如`...

    面向对象技术复习指南

    19. Java数组初始化: - 给定的代码创建了一个长度为10的`long`类型数组`a`。 以上内容涵盖了面向对象技术的一些基础知识点,包括访问控制、编译过程、事件处理、命令行参数、关键字、方法返回值、常量定义、位...

    Java语言入门必备PPT教案学习.pptx

    声明变量时,你需要指定变量类型、变量名,并可选择性地初始化变量值。例如,"int x1, y1, z1;"声明了三个整型变量。 最后,我们提到变量的作用域。变量的作用域决定了在程序的哪些部分可以访问这个变量。Java中的...

    最的java关键字解释.doc

    31. `new`:创建对象实例的运算符,分配内存并调用构造函数初始化对象。 32. `package`:组织类的容器,提供命名空间和版本管理。 33. `private`:访问控制修饰符,表示类的私有成员,只能在类内部访问。 34. `...

    Android开发高级进阶开发商业级Android应用程序的注意....pdf

    9. 使用Final常量:使用static final修饰符来定义常量可以减少运行时的性能开销,因为这些常量在编译时就已经确定,可以直接插入到类文件的静态属性初始化中,由虚拟机直接处理。 10. 避免使用浮点类型:嵌入式...

    2023年Java大学真题基础练习.docx

    Java中的构造方法是一种特殊的方法,用于初始化对象。构造方法的调用方式是通过new关键字。 10. Java数组操作: Java中的数组可以使用索引来访问元素,例如,`int age = new int[16];`,最后一个元素的引用方法是`...

Global site tag (gtag.js) - Google Analytics