`
sunmiracle
  • 浏览: 14819 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Static和Final修饰类属性变量及初始化

 
阅读更多
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.
  public class Test{
public static int a;
private Test(){
a=0;
}
}
  如果属性被修饰为static静态类资源,那么这个字段永远只有一个,也就是说不管你new test()多少个类的对象,操作的永远都只是属于类的那一块内存资源.例如:
  Test t1=new Test();
t1.a=10;
Test t2=new Test();
System.out.println(t1.a);
System.out.println(t2.a);
System.out.println(Test.a);
  结果是3个0
  2.final 用于声明属性,方法和类,分别表示属性一旦被分配内存空间就必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。
  而你的代码里对final修饰的属性进行了修改,所以错误.
  3. 被final修饰而没有被static修饰的类的属性变量只能在两种情况下初始化:
  a.在它被定义的时候,例:
  public class Test{
public final int a=0;
private Test(){
}
}
  b.在构造函数里初始化,例:
  public class Test{
public final int a;
private Test(){
a=0;
}
}
  4.同时被final和static修饰的类的属性变量只能在两种情况下初始化:
  a.在它被定义的时候,例:
  public class Test{
public final int a=0;
private Test(){
}
}
  b.在类的静态块里初始化,例:
  public class Test{
public final int a;
static{
a=0;
}
}
  5.分析第三第四原因:
  第三条:当这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其分配内存空间,而只是定义了一个变量a,只有当类被实例化的时候这个属性才被分配内存空间,而实例化的时候同时执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件.
  第四条:当类的属性被同时被修饰为static和final的时候,他属于类的资源,那么就是类在被加载进内存的时候(也就是应用程序启动的时候)就要已经为此属性分配了内存,所以此时属性已经存在,它又被final修饰,所以必须在属性定义了以后就给其初始化值.而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化.

————————————————————————————————————————————————
令一篇文章解释:

看languageSpec,上说,final变量的初始化分三种情况:
共性:
1。final在初始化之后,就不能再赋值了,也就是说,它们只能被赋值一次
2。一般情况下是定义时直接初始化如:final int i=3;
但也可以定义时不初始化,叫blank final,如 final int bi;
然后留待后面进行赋值。但这因三种情况而不同:
1。普通auto变量(就是如方法中的局部变量):可以在其后的代码中赋值,
但也可以不赋值。
final int i;//blank final
anything();
i=1;//在其后赋值。
//i=3; error!不可再次赋值

而成员变量必须被赋值,只是赋值的地方不同:
2。静态成员变量:
静态成员变量必须在静态构造代码中初始化,
static final int s;
static { s=3;}//静态构造块
//static final int s; error!

3。非静态成员变量:
必须在构造函数中被赋值。如:
final int ai;
{ ai = 3; }//这种叫什么的,估且称之为实例初始化块吧(instance
initializer)
public Contructor(){ai=3;}//构造函数中
public Contructor(int in){ai=in;}//构造函数中

注意构造函数可以会有互相调用,注意在这过程中不要使变量被重复的赋值。

另外,如果变量是对象或数组这样的引用类型。则可以操作其对象或数组,但不可以
改变引用本身:
final int [] array={1,2,3};//一个由三个数字组成的数组。
array[1]=9;//array == {1,9,3}
// array=new int[6]; error!
分享到:
评论

相关推荐

    Java并发--final关键字.docx

    在Java中变量可以分为成员变量和局部变量 成员变量 通常每个类中成员变量可以分为 类变量(static修饰的变量) 以及 实例变量 针对这两种类型的变量...当final变量未初始化时系统不会进行隐式初始化,会出现报错。

    资深互联网大佬的5000字吐血总结——Java面向对象三大修饰符之abstract、static、final

    static 可以修饰初始化代码块扩充内容三、final(最终的,最后的)1.final可以修饰变量2.final可以修饰方法3.final可以修饰类总结abstract、static、final可以修饰的内容abstract、static、final是否可以修饰构造...

    抽象和封装PPT

    1.4 事不关几,高高挂起 ---------------类的方法和属性只放需要的 1.5 谁最清楚,方法就放在这个类中 --------类的方法发现及放置 2.构造方法 constructor 2.1作用 对象初始化, 通俗地说就是给某些或全部属性赋...

    java基础非常典型的面试题目.wps

    Java面试必备,题目非常基础,看看你能做对几道? 题目及详解示例 14. public class Test { ... 如果局部变量没有被初始化,并且在方法中一直没有被使用,编译和运行都会通过。 可以改正为:String s = null ;

    【04-面向对象(上)】

    •有static 修饰的访求和属性,既可通过类来调用,也可以通过实例来调用. 对象.引用和指针 •Person p = new Person();,这行代码创建了一个Person 实例,也被称为对象,这个对象被赋给了p变量. •也就是说引用...

    【05-面向对象(下)】

    •对于类属性而言,要么在静态初始化中初始化,要么在声明该属性时初始化。 •对于实例属性,要么在普通初始化块中指定初始值。要么在定义时、或构造器中指定初始值。 final修饰局部变量 •使用final修饰...

    JAVA基础知识精华总结 收藏

    不仅第一次创建对象时,类中的所有静态变量都初始化,并且第一次访问某类(注意此时 未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。 2、 继承时,对象的初始化过程 (1) 主类的超类...

    Test.java关于静态的分析

    package a; public class Test { static int i=0; //静态成员变量 ... 实例化 =初始化成员变量 //类中不需要记录状态的时候,都可以是静态方法 public static void print(){ } }

    java模拟题库面试题目64道经典答题及答案

    在 Java 7 之前,你可以通过使用静态初始化运行 Java 类。但是,从 Java 7 开始就行不 通了。 3. String 类为什么是 final 的。 主要是为了“效率”和“安全性”的缘故。若 String 允许被继承, 由于它的高度被 ...

    Java关键字总结

    1>对于基本类型前加以final修饰,表示被修饰的变量为常数,不可以修改。一个既是static有是final的字段表示只占据一段不能改变的存储空间。 2>final用于对象应用时,final使应用恒定不变。一旦引用被初始化指向一个...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    三个修饰符(abstract、static、final)

    (3) 抽象类可以定义成员变量和成员方法 (4) 抽象类可以有构造,但不用于new对象,而是用于子类创建对象jvm默认创建父类对象应用 abstract修饰方法 (1) 被 abstract 修饰的方法称为抽象方法 (2) 抽象方法只有声明部分,...

    Java的六大问题你都懂了吗

    instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。对于第二种变量,必须明确地进行...

    《java面向对象程序设计-继承和多态》教案.doc

    除了构造方法之外,父类的所有 方法和属性都被子类的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问类成员的方式 Java 常用修饰符有 static、final、abstract 接口...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    突破程序员基本功的16课.part2

    2.1.1 实例变量和类变量的属性 2.1.2 实例变量的初始化时机 2.1.3 类变量的初始化时机 2.2 父类构造器 2.2.1 隐式调用和显式调用 2.2.2 访问子类对象的实例变量 2.2.3 调用被子类重写的方法 2.3 父子实例的...

    java三大特性说明

     对于由final static共同修饰的变量,赋值的机会有两个,一是在声明的时候,二是在静态代码块中,两次机会有且只能有一次被选择.   继承:  允许存在父子类的关系,一个子类有且只有一个直接的父类(Java中的继承...

    新东方JAVA课程PPT课件(2)

    类的继承 访问控制 方法覆盖 super关键字 this关键字 重载 封装类 ==和equals() toString()方法 static变量、方法和初始化块 final类、方法和变量 abstract类和abstract方法

Global site tag (gtag.js) - Google Analytics