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的,我们必须在声明变量时直接赋值。
分享到:
- 2009-02-27 22:24
- 浏览 2895
- 评论(3)
- 论坛回复 / 浏览 (3 / 3205)
- 查看更多
相关推荐
18. `final`变量初始化:除了初始化块和构造方法,`final`变量也可以在声明时直接赋值。 19. `static`与`final`关键字:`static`常用于修饰类级别的变量和方法,使得它们属于类本身而非类的实例。`final`常用于创建...
- **显示初始化**:执行域变量的显示初始化。 - **执行构造代码**:执行构造方法中的代码。 17. **接口**: - **接口(Interface)**:一组方法的声明,可以被类实现,提供多继承功能。 18. **抽象类与接口的...
- 构造器首先调用父类构造器,然后初始化实例变量和静态变量,最后执行构造器代码。 - 如果没有显式调用父类构造器,编译器会自动添加`super()`,但如果父类没有无参构造器,会导致编译错误。 - `private`构造器...
1.如何抽象出类 1.1 找简单名词 ----------发现类 ...7.八种原生数据类型 作为属性变量的时候 系统会自动赋初值,具体如下: byte 0 short 0 int 0 long 0 float 0.0 double 0.0 boolean false char 空格
8. 数组初始化:创建一个长度为25的整型数组,`x[24]`会被初始化为0,而`x[25]`超出数组边界,未定义,答案是A。 9. 取模运算:`y%x`计算的是10除以3的余数,结果为1,答案是B。 10. 表达式合法性:`x+=y`将字符串`x...
10. **for**:创建一个循环,可以定义初始化、条件和迭代表达式。 11. **function**:声明函数。 12. **if**:根据条件执行代码块。 13. **in**:检查对象是否包含特定属性。 14. **instanceof**:判断对象是否属于...
- `convenience`: 便捷初始化。 - `dynamic`: 动态类型。 - `didSet`: 观察属性变化。 - `final`: 最终类或方法。 - `get`: 获取属性值。 - `infix`: 前缀操作符。 - `inout`: 参数传递方式。 - `lazy`: 懒...
10. **统一的构造/析构(Uniform Initialization)**:通过花括号初始化不仅可以用于 aggregates(聚合类型),还可以用于任何类型的对象,简化了初始化过程。 11. **移动构造函数和移动赋值运算符**:移动构造函数...
- **类型推导**:通过 `auto` 关键字简化了变量类型的声明,编译器可以根据初始化表达式自动推导出变量的类型。 - **统一初始化**:采用了一致的初始化语法,提高了代码的一致性和可读性。 - **模板元编程**:增强了...
8. 构造函数:构造函数是类的特殊方法,没有返回类型,可以有多个不同的构造函数,用于对象初始化,选项B正确描述了这一点。 9. 错误的构造函数描述:选项C错误,因为一个类可以有多个构造函数,只要参数列表不同...
5. **初始化列表(Initializer Lists)**:初始化列表允许在构造对象时提供一组初始化值,如`std::vector<int> v = {1, 2, 3};`,同时,它也是创建`std::map`等关联容器的关键。 6. **静态断言(Static Assert)**...
- **不可变性**: 对于基本数据类型,`final`修饰的变量一旦初始化就不能再修改其值。 **1.11 "=="与equals方法的区别** - **"=="**: 比较两个对象的引用是否相同。 - **equals**: 比较两个对象的内容是否相同。 **...
根据提供的文件信息,本文将对Java语法进行详细的解析与总结,包括基本的语法结构、关键字、数据类型、变量声明及转换等内容。 ### Java语言概述 Java是一种广泛使用的面向对象编程语言,由Sun Microsystems开发并...
- **D项**:一个类可以定义多个构造器,以支持不同的初始化方式。 ### 4. 数据库访问 - **选择题**:“提供Java存取数据库能力的包是(A)” - **答案解析**:`java.sql`包提供了基本的SQL操作接口,如`...
19. Java数组初始化: - 给定的代码创建了一个长度为10的`long`类型数组`a`。 以上内容涵盖了面向对象技术的一些基础知识点,包括访问控制、编译过程、事件处理、命令行参数、关键字、方法返回值、常量定义、位...
声明变量时,你需要指定变量类型、变量名,并可选择性地初始化变量值。例如,"int x1, y1, z1;"声明了三个整型变量。 最后,我们提到变量的作用域。变量的作用域决定了在程序的哪些部分可以访问这个变量。Java中的...
31. `new`:创建对象实例的运算符,分配内存并调用构造函数初始化对象。 32. `package`:组织类的容器,提供命名空间和版本管理。 33. `private`:访问控制修饰符,表示类的私有成员,只能在类内部访问。 34. `...
9. 使用Final常量:使用static final修饰符来定义常量可以减少运行时的性能开销,因为这些常量在编译时就已经确定,可以直接插入到类文件的静态属性初始化中,由虚拟机直接处理。 10. 避免使用浮点类型:嵌入式...
Java中的构造方法是一种特殊的方法,用于初始化对象。构造方法的调用方式是通过new关键字。 10. Java数组操作: Java中的数组可以使用索引来访问元素,例如,`int age = new int[16];`,最后一个元素的引用方法是`...