java静态变量静态方法静态常量


首先先来弄清楚静态属性到底能干嘛

案例一

当我们需要使用一个圆的面积时有如下代码

import java.util.Date;

public class Test01 {
    public static void main(String[] args) {
        int r = 2;
        System.out.println(Math.PI*Math.pow(2,2));

    }

这段代码使用Math类提供的PI来获取圆周率,利用Math类提供的pow()方法来获取平方根
仔细观察,发现我们并没有使用Math类创建对象就直接使用了PIh和pow()方法,原因是math类中的属性被定义成了静态属性,我们可以直接通过类来调用而不需要创建对象

静态常量

Math类的PI被声明为静态常量后可以直接通过类名调用,Math类中的PI就是静态常量

案例二

class Employee{
	static int nextId=1;	                    
	int id;
	}

这段代码中nextId和id有什么区别
先说结论 我们可以直接通过Employee.nextId来调用nextId这个属性,而id则不能采用此方法,
并且创建两个Employee对象后我们发现这两个对象是共用的一个nextId
我们用员工类创建勒三个员工对象,他们的员工id分别是1 2 3 ,部门id都为1,如果现在需要将每个员工的部门id都改为2怎么改,

public class Test01 {
    public static void main(String[] args) {
    	Employee.nextId = 2;//我们只需要通过类名.属性就能将nextId同一修改
    	//Employee.id=2 //报错,因为还没有创建对象
        Employee employee1 = new Employee();
        Employee employee2 = new Employee();
        Employee employee3 = new Employee();
        
        
    }
}

类变量/静态变量

static变量是同一个类所有对象共享的,在类加载时就生成了,即使没有创建对象,也能使用该类变量,从任何一个对象修改时也是同一个变量

定义语法

访问修饰符 static 数据类型 变量名

访问方法

1 类名.类变量名

2 对象名.类变量名

使用细节

类变量是所有对象共享,实例变量是每个对象独享

总结

每个Employee类创建的实例都有自己的id字段,而Employee类的所有实例共享一个nextId,即使没有Employee对象,静态字段nextId也存在,它属于类

实例字段和静态字段是在Java中用于存储数据的两种不同类型的变量,它们之间有一些重要的区别。

1 所属范围:实例字段属于类的每个实例,每个实例都有自己的一组实例字段。静态字段是属于类本身的,而不是属于类的每个实例。静态字段在类加载时创建,只有一份,并在类的所有实例之间共享。
2 内存分配:实例字段在每个实例对象上都会分配内存,每个对象有自己的一份字段。静态字段在类的方法区中分配内存,并在整个类的生命周期中存在。
3 访问方式:实例字段只能通过类的实例进行访问,每个实例可以拥有不同的字段值。静态字段可以通过类名直接访问,无需创建实例。
4 生命周期:实例字段的生命周期与对象的生命周期相同。当对象被销毁时,实例字段也将被销毁。静态字段的生命周期伴随整个程序的运行,只有在程序结束或类被卸载时才会被销毁。
5 共享性:实例字段是每个对象独有的,每个对象对实例字段的修改不会影响其他对象。静态字段在类的所有实例之间共享,一个对象对静态字段的修改会影响其他对象。

静态方法/类方法

定义语法

访问修饰符 static 数据类型 方法名(){}

静态方法可以访问静态属性

使用场景

当方法中不涉及任何对象相关的成员,可以将方法设计成静态方法,提高开发效率
class Employee{
    static int a;
    int b;
	public static void a(){
      sout a
      sout b
      }
}
结论  静态方法内部不能访问实例字段(实例字段存储在每个对象的内存中),可以访问静态字段
原因  静态字段和静态方法在类加载就会创建,而实例字段和实例方法在对象创建时才会加载,所以当我们在创建静态方法时由于实例字段还未创建所以不能访问

类方法使用注意事项和细节讨论


1\)类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区:类方法中无this的参数
普通方法中隐含着this的参数
2\)类方法可以通过类名调用,也可以通过对象名调用。\[举例】
3\)普通方法和对象有关,需要通过对象名调用,比如对象名.方法名(参数),不能通过类名调用。【举例]
9类方法中不允许使用和对象有关的关键字,==比如this和super==。普通方法(成员方法)可以。\[举例]
5\)类方法(静态方法)中 只能访问 静态变量 或静态方法。【如何理解】
5\)普通成员方法,既可以访问 非静态成员,也可以访问静态成员。
小结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员(==须遵守访问权限==)

main方法

public static void main(String[] args) {
    // 代码逻辑
}

在Java程序中,main方法是程序的入口点,也是程序的起始执行点。每个Java程序都必须包含一个main方法,它是程序执行的起始点。

main方法是一个被JVM(Java虚拟机)调用的特殊方法。它必须具有以下特征:

public:main方法是一个公共的方法,这意味着它可以被其他类或程序访问。
static:main方法是一个静态方法,这意味着它属于类而不是实例对象。
这在程序启动时非常重要,因为没有实例对象可以调用方法。
void:main方法不返回任何值,它的返回类型被定义为void。String[] args:
main方法接受一个字符串数组args作为参数,它可以用来接收命令行参数或运行时参数。
这样可以在程序启动时,通过命令行传递参数给程序。

main方法是程序的入口点,只有在main方法中的代码才会被执行。其他方法可以被main方法或其他方法调用,但它们不会在程序启动时自动执行。

默认字段初始化

方法中的局部变量必须明确初始化,其没有默认的初始值

实例字段和静态字段有默认初始值,数值为0,布尔值为false,对象引用为null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值