资讯专栏INFORMATION COLUMN

对修饰符final和static的浅析

mtunique / 508人阅读

摘要:三类的初始化时机类的初始化即虚拟机为类的静态变量赋予初始值这和准备阶段设置默认初始值为是不一样的。类的主动使用种创建类的实例用语句创建实例调用类的静态变量或对静态变量赋值这和是有区别的在定义一个类的时候里面只能放方法和属性,这是规定死了的。

一般在进行分析的时候,会从三个方面进行分析:类、方法(构造方法、成员方法)、变量(成员变量(静态变量、实例变量)、局部变量)。

一、static修饰符:

被static修饰的变量和方法,被类的所有实例所共享。加载类时只分配一次内存。

静态变量:可以直接通过类名来访问 Person.a;

静态方法:可以直接通过类名来访问 Person.say();静态方法内,可以访问静态变量,但是不能使用this关键字不能访问实例变量,因为被所有实例所共有,无法判断属于哪个实例对象

静态代码块:java虚拟机在加载类时就执行代码块

二、final修饰符:

有final修饰表示最终(不可再修改)的意思:

final类:不能被继承(即没有子类);

final方法:不能被子类的方法覆盖(final不用来修饰构造方法,父类与子类之间的构造方法不存在覆盖关系,final修饰是没有意义的);

final修饰的变量:即常量,常量只能被赋值一次,之后不能改变。
静态常量属于编译时常量(final static int a=2*3;在编译的时就能计算出具体的值),在编译的时候将这个值就放入到常量池中,a被访问时类是不会被初始化的(这是类的被动使用)。访问类的静态变量或静态方法的时候类会被初始化(这是类的主动使用)。而静态变量只会在类初始化的时候才会被赋值)。具体细节请参考“类的生命周期”---加载(堆区、方法区)--连接(验证、准备(静态变量分配内存、设置默认初始值为0)、解析(符号引用替换为直接引用,即指针指向方法区的内存位置))--初始化(程序对类或接口主动使用的时候才会被初始化。

三、类的初始化时机:

类的初始化即java虚拟机为类的static静态变量赋予初始值(这和准备阶段设置默认初始值为0是不一样的)。只有类的主动使用才会初始化类

1.类的主动使用(6种):

创建类的实例:用new语句创建实例 Person ps=new Person();

调用类的静态变量或对静态变量赋值:

public class Person{ 
static int a=2*3;  //这和final static int a=2*3;是有区别的
static{  //Java在定义一个类的时候里面只能放方法和属性,这是规定死了的。System.out.println()是在调用一个叫println的函数,这里是函数的调用而不是类里面定义一个函数。所以需要用static代码块
    System.out.println("init Person"); //static声明的静态代码块,使得类在初始化的时候会被调用而不需要创建实例对象。它这时候就不在任何一个方法中。
} 
} 

调用的时候写:

System.out.println("a="+Person.a); //这样就可以在不new一个Person实例的情况下,来初始化Person类了。

调用类的静态方法

调用java API中的反射方法:Class.forName("Person");

初始化子类的时候会先初始化父类(但"父类"是接口的时候,不会先初始化它所实现的接口的,只有在程序在使用接口的静态变量时才会使静态接口初始化)

java虚拟机启动时被标明为启动类的类

2.类的被动使用:

final类型的静态变量在编译的时候能计算出值(即编译时常量,在编译的时候将这个值就放入到常量池中了):
注: final类型的静态变量在编译的时候不能计算出变量的值(即运行时常量)的时候是会被初始化的

  final static int a=2*3;                 //变量a是编译时常量
  final static int a=(int)Math.random();  //变量a不是是编译时常量(即运行时常量)

"父类"是接口的时候,不会先初始化它所实现的接口的,只有在程序在使用接口的静态变量时才会使静态接口初始化

ClassLoader类的loadClass("Person")方法的时候,只是对类的加载,不是初始化。Class.forName("Person");才会初始化

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68862.html

相关文章

  • 修饰finalstatic浅析

    摘要:三类的初始化时机类的初始化即虚拟机为类的静态变量赋予初始值这和准备阶段设置默认初始值为是不一样的。类的主动使用种创建类的实例用语句创建实例调用类的静态变量或对静态变量赋值这和是有区别的在定义一个类的时候里面只能放方法和属性,这是规定死了的。 一般在进行分析的时候,会从三个方面进行分析:类、方法(构造方法、成员方法)、变量(成员变量(静态变量、实例变量)、局部变量)。 一、static修...

    BigTomato 评论0 收藏0
  • java程序入口main()方法浅析

    摘要:程序入口方法浅析方法的方法签名方法签名讲解修饰符类由虚拟机调用,为了没有限制可以自由的调用,所以采用修饰符。返回值主方法被调用,将返回值返回给没有任何意义,因此该方法没有返回值,所以使用。 java程序入口main()方法浅析 main()方法的方法签名 public static void main(String[] args) 方法签名讲解  public修饰符:java类由jav...

    YFan 评论0 收藏0
  • java修饰使用指南

    摘要:应用在修饰类名,类成员,方法,参数,构造器中。接口修饰符构造器修饰符方法修饰符字段修饰符参数修饰符最基本的修饰符作用在类上当此修饰符修饰类。作用在构造器上在构造器上,只允许使用三种修饰符,。当此修饰符修饰构造器。 1、什么是修饰符? 指的是一种标识类型以及类型成员的访问范围的声明。 应用在修饰类名,类成员,方法,参数,构造器中。 2、修饰符的有几种? ...

    elva 评论0 收藏0
  • java面向象(中)

    摘要:使用创建的字符串对象是运行时创建出来的,它被保存在运行时内存区,即堆内存,不会放入常量池中。类成员创建的对象实例中根本不会拥有对应类的类变量。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。 Java提供了final关键字来修饰变量,方法和类,系统不允许为final变量重新赋值,子类不允许覆盖父类的final方法,final类不能派生子类。 Abstract 和 inte...

    孙吉亮 评论0 收藏0
  • Java™ 教程(类更多方面)

    类的更多方面 本节介绍依赖于使用对象引用的类的更多方面以及你在前面的对象部分中了解到的点运算符。 从方法返回值 方法返回到调用它的代码。 完成方法中的所有语句。 到达return语句。 或抛出异常(稍后介绍)。 以先发生者为准。 你在方法声明中声明方法的返回类型,在方法体内,使用return语句返回值。 声明为void的任何方法都不返回值,它不需要包含return语句,但它可能会这样做,在这种...

    shinezejian 评论0 收藏0

发表评论

0条评论

mtunique

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<