欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java学习笔记(基础篇)—关键字static和final

程序员文章站 2022-06-05 20:21:06
一、关键字Static 我们从关键字static可以修饰哪些东西入手,逐一的剖析static的使用和要注意的地方。 1)修饰变量(只能修饰实例变量) 静态变量 又称为类变量 a)所有类实例共享 b)使用静态变量 类名.变量名 c)静态变量是属于这个类,非静态变量是属于对象 d)代码加载到内存静态变量 ......

一、关键字static

我们从关键字static可以修饰哪些东西入手,逐一的剖析static的使用和要注意的地方。

1)修饰变量(只能修饰实例变量)----->静态变量

又称为类变量

a)所有类实例共享
b)使用静态变量
类名.变量名
c)静态变量是属于这个类,非静态变量是属于对象
d)代码加载到内存静态变量就已经存在了
e)static变量和实例变量的区别:
i)static变量对于每个类而言在内存中只有一个,能被类的所有实例所共享;
实例变量对于每个类的每个实例都有一份,它们之间互不影响;
ii)java虚拟机在加载类的过程中为static变量分配内存,
实例变量在加载完类后创建对象时分配内存;
iii)static变量存在方法区,实例变量存在堆区;
v)static变量可以直接通过类名访问,
实例变量通过引用类型变量访问;

2)修饰方法====>静态方法

称为类方法

a)调用时使用
类名.方法名();
b)静态方法不能使用非静态的变量
静态方法在类加载的时候就存在了
非静态变量在对象创建的时候才存在的
非静态方法可以访问静态变量
c)静态方法不能被非静态方法重写,静态方法不能被静态方法重写(总之就是不能被 重写)
d)静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既然如此,当前类必须为静态方法提供实现。静态方法属于类。
e)不能使用this关键字和super关键字;(考虑它的生命周期来理解)

this表示的当前对象,而被static修饰的是属于类的,不需要创建对象就可以使用;super是代表父类对象,调用父类的静态方法直接使用类名.方法名就可以。

3)静态初始化块----在类加载时只执行一次

​ 对静态变量进行初始化,当java虚似机加载类时,就会执行该代码块;被static 所修饰的成员变量和成员方法表明归某个类所有,它不依赖于类的特定实例,被 类的所有实例共享。只要这个类被加载,java虚拟机就能根据类名在运行时数据 区的方法区内定位到它们。而且只会被加载一次。

     static{
         system.out.print("hello static");
     }

4)普通初始化----每创建一个对象都会被调用的

对非静态变量进行初始化:

      {
          system.out.print("hello static");
      }

5)静态导入

这个用法一般不太出现,很少使用。

import java.lang.math;
使用:math.random()

import static java.lang.math.*;
使用:random()

6)补充知识

创建一个对象时的类加载步骤或者说顺序: student student =new student();猜猜它的执行顺序会是什么?我们来理一理逻辑,子类继承父类,创建一个子类对象首先要有一个父类被创建,student()构造器里默认有一个super()方法,所有会先初始化父类,然后是初始化子类的部分。下面来看具体的步骤:

public class student extends person{
    private static string name;
    private int age;

    public student() {
        system.out.println("this student constructor");
    }

    static {
        system.out.println("this is student static block");
    }

    {
        system.out.println("hello student");
    }

    public static void main(string[] args) {
        student stu = new student();
    }
}

class person{
    private static int count;
    private string title;

    public person() {
        system.out.println("this person constructor");
    }
    static {
        system.out.println("this is person static block");
    }

    {
        system.out.println("hello person");
    }
}
  1. 父类初始化静态变量和静态代码块(按先后顺序执行);
  2. 子类初始化静态变量和静态代码块(按先后顺序执行);
  3. 父类初始化非静态变量和非静态代码块(按先后顺序执行);
  4. 父类构造器
  5. 子类初始化非静态变量和非静态代码块(按先后顺序执行);
  6. 子类构造器
//运行结果
this is person static block
this is student static block
hello person
this person constructor
hello student
this student constructor

二、关键字final

1)修饰变量---->常量

​ 变量必须初始化,变量的值不允许修改。
​ final变量都必须显示初始化,
​ a) 修饰静态变量,只能在定义变量时进行初始化;
​ b) 修饰实例变量,可以在定义变量时进行初始化,或者在构造方法中进行初始 化;

2)修饰方法

​ 该方法不能够被重写

3)修饰类

​ 该类不能够被继承,即不能与abstract同时使用。
​ string类就是final修饰的类,所有字符串是不能改变的,只能通过拼接创建新的 string对象,这样很浪费内存,所以又有了stringbuilder和stringbuffer;这两 个类后面再解释,可以去思考和看他们的实现源码。

三、思考final、finally和finalize的区别

后面出一篇关于这个的文章,敬请关注。