什么是static?什么是final?

由static修饰的变量、常量、和方法被称为是静态变量、常量和 方法。

静态数据和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以static声明并且实现,这样当需要使用时,直接使用类名调用这些静态成员即可。例如,两个类在同一个内存区域共享一个数据,在球类使用PI这个常量,另外的圆类也需要使用这个常量,这时没有必要在两个类中同时创建PI常量,这样系统会将这两个不在同一个类中定义的常量分配到不同的内存空间中,这是声明静态成员就好,静态成员归类所有,区别于个别对象,可以在本类和其他类使用"类名.静态名"调用静态成员。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private、protected的约束

 1 public class Stat {
 2     static double PI=3.1415926;
 3     static int id;
 4     public static void method1(){
 5         System.out.println("hello,method1.");
 6     }
 7     public void method2(){
 8         System.out.println(PI);
 9         System.out.println(id);
10         method1();
11     }
12 }

主类

 1 public class Main {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Stat st=new Stat();
 9         st.method2();
10     }
11
12 }

结果

3.1415926
0
hello,method1.

  static是自动初始化滴,为0.

在java语言中对static有一些规定:

1.在静态方法中不可以使用this关键字;

2.在静态方法中不可以直接调用非静态方法;

3.规定不得能将方法体内的局部变量声明为static;

4.可以用static定义一个静态区域,可以先执行类的初始化动作……具体问题具体分析,说这几句只是表面……

final关键字可以用于变量声明,一旦变量被设定,就不可以再改变变量的值,通常,由final定义的变量为常量。

final关键字定义的变量声明时必须立即赋值,除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组可以被看成一个对象来引用,所以final可以修饰数组。

一旦一个对象引用被修饰为final后,它只能恒定的指向一个对象,无法将其改变指向另一个对象。

一个既是static又是final的字段只占据一段不能改变的存储空间。

1 import java.util.Random;
2 public class Fina {
3     public static Random rand=new Random();
4     public final int a1=rand.nextInt(10);
5     public static final int a2=rand.nextInt(10);
6
7 }

主类

 1 public class Main {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Fina fi=new Fina();
 9         System.out.println(fi.a1);
10         System.out.println(fi.a2);
11         Fina fii=new Fina();
12         System.out.println(fii.a1);
13         System.out.println(fii.a2);
14     }
15
16 }

结果

4
5
2
5

  定义为final的常量是恒定不变的,将随机数赋予定义为final的常量,可以做到每次运行程序时改变a1的值,但是a2不同于a1,由于它被声明为static final形式,所以在内存中为a2开辟了一个恒定不变的区域,当再次实例化一个对象时,仍然指向a2这块内存区域,所以a2保持不变。a2只是装载时初始化,而不是每次创建对象时都被初始化,而a1会在重新实例化对象时被更改。

时间: 2024-08-29 01:18:19

什么是static?什么是final?的相关文章

static变量和final变量

1.static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的).对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活). 2.final变量:

Java中Static关键字和Final关键字

Static: 1. 在变量,方法前修饰表示静态方法,静态变量. 2. static{ } 此种形式为静态代码块,用于初始化同时被final static修饰的变量.(当然,更常用的方式其实是在变量处直接赋值) 静态代码块的内容会被直接在类加载时运行 package com.main; /** * Created by 63289 on 2017/3/19. */ public class HelloJava { static{ System.out.println("This line wil

java继承中的static问题、final问题、abstract问题

static方法或属性是可以被继承的,static方法可以被子类覆盖,但是static方法不能作为抽象方法被子类重写 父类中的final方法可以被子类所继承,但是不能在子类中覆盖或重写.简而言之,就是一旦在父类中把方法声明为final,则子类根本不能动这个方法 一个被定义为abstract的类不一定要有abstract方法,但是一旦一个类被定义为abstract则其不能被实例化

类成员(static)和final修饰符

在Java类里只能包含成员变量.方法.构造器.初始化块.内部类(包括接口.枚举)5种成员,类成员是用static来修饰的,其属于整个类. 当使用实例来访问类成员时,实际上依然是委托给该类来访问类成员,因此即使某个实例为null,它也可以访问它所属类的类成员. public class NullAcessStatic { public static void test() { System.out.println("static修饰的类方法"); } public static void

static private 与 final 的用法总结

1.static表示静态.他是属于类的.可以在本身类里直接调用,或在其它类里用类名.方法名调用.不加static表示是实例的方法,必须用实例来调用.在本类里也一样,必须用实例调用 2.private是私有的意思. private class Demo{ Demo类就是私有的了. 类是不能用private修饰的, 当类被修饰成private没有任何意思. 因为外部任何对象都访问不到Demo类了. private String str; str属性就私有的了 外部类就访问不到这个属性了 privat

private static final long serialVersionUID = 1L;

作者:郭无心链接:https://www.zhihu.com/question/24852886/answer/117314768来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 其实答主想问的是serialVersionUID的作用. 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的. 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionU

Java关键字 final和static

一.final关键字 1.final类是不能被继承的,所以也就没有子类了.例子如下:会报错 2.final 方法 顺便复习下重载和重写 2.1 重载例子: public  class TestFinalClass { public static void main(String args[]){ } public void add(int i){ System.out.print("parents..add..."); } } class TestChildrenClass exten

JAVA笔记-Static与Final详解笔记

static 成员变量 静态变量属于类的变量,所有类的实例共享的同一个变量. 直接使用类名读写这个变量 应用场景: 案例: public class Demo04 { public static void main(String[] args) { //静态变量属于类的 变量 //直接使用类名读写这个变量 Hoo.z = 10; int n = Hoo.z; System.out.println(n);//10 //实例变量x,y是属于对象的变量 //创建对象以后才能使用实例变量 //每个对象都

php中$this、static、final、const、self 等几个关键字的用法

$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下: <?php class MyClass{ private $name; public function __construct($name){ $this->name=$na

php面向对象类中的$this,static,final,const,self这几个关键字使用方法。

php中this,self,parent三个关键字的作用 this,self,parent三个关键字之间的区别,从字面上比较好理解,分别是指这.自己.父亲.我们先建立几个概念,这三个关键字分别是用在什么 地方呢?我们初步解释一下,this是指向当前对象的指针(姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针.我 们这里频繁使用指针来描述,可能是因为没有更好的语言来表达. <?php <span style="color:#ff0000;"