Java基础知识复习(static关键字)

本文详细解释了Java中static关键字的作用及使用场景,包括其特点、注意事项、与非静态成员的区别等,并通过具体示例帮助理解。

Q:为什么需要static关键字的存在?有什么作用呢?

A:Java是面向对象的,但若处于某种特殊情况下,通常是实用方法,则不需要类的对象。static这个关键字可以标记出不需要实例的方法。

static的特点(静态变量)

1、static是一个修饰词,用于修饰成员。

2、static修饰的成员被所有的对象所共享。

3、static优先于对象存在,因为static的成员随着类的加载就已经存在了。

4、static修饰的成员多了一种调用方式,可以直接被类名所调用(如:类名.静态成员)

5、static修饰的静态变量是共享数据,而对象中的成员变量是特有数据

成员变量和静态变量的区别?

1、生命周期不同

     成员变量随着对象的创建而存在,随着对象的被回收而释放。

     静态变量随着类的加载而存在,随着类的消失而消失。

2、调用方式不同

     成员变量只能被对象调用。

     静态变量可以被对象调用,还可以被类名直接调用。

3、别名不同

     成员变量也称为实例变量。

     静态变量称为类变量。

4、数据存储位置不同

     成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。

     静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

5、影响范围不同

      成员变量,每个对象一个。

      静态变量,每个类一个。

static使用的注意事项:

1、静态方法只能访问静态变量。(非静态方法既可以访问静态变量,又可以访问非静态变量)

2、静态方法中不可以使用this或者super关键字!

3、主函数是静态的。

主函数特殊之处:public static void main(String[] args)

1、格式是固定的。

2、被JVM所识别和调用。

public 因为权限必须是最大的

static  不需要对象的,直接用主函数所属类名调用即可

void   主函数没有具体的返回值

String[] args    主函数的参数列表,是数组类型的参数,而且元素都是字符串类型

public static void main(String[] args)//new String[0]
{
    System.out.println(args);// ([Ljava.lang.String;@4554617c)
    System.out.println(args.length);// 0
}

static关键字在什么情况下使用?

1、静态变量

分析对象中所具备的成员变量的值是否都相同?

如果都是相同的,那么这个成员变量可以被static修饰;

如果存在不相同的情况,那该成员变量将是对象的特有数据,必须用非静态存储在对象中。

2、静态方法

函数是否能用静态修饰,参考一点,就是该方法功能是否需要访问非静态的成员变量

如果需要,则该方法是非静态的;

如果不需要,则将该方法定义成静态的。虽然也可以定义成非静态的,但是非静态方法的调用需要创建对象,而该对象的创建是没有意义的,因为并没有用到实例变量。(静态的方法是可以在无关特定类的实例情况下执行的,即可以不用创建对象直接调用静态的方法,用法:类名.静态成员。因为静态的方法是通过类的名称来调用,所以静态的方法无法引用到该类的任何实例变量)

class Fair
{
    String length;
    static String color = "black";
    Fair(String length)
    {
        this.length = length;
    }
    //非静态方法
    public void work()
    {
        System.out.println("长度:"+length);
    }
    //静态方法
    public static void work2()
    {
        System.out.println("颜色:"+color);
    }
}
public class text1 {
    public static void main(String[] args)
    {
        //new Fair("long").work();
        Fair p = new Fair("long");
        p.work();
        Fair.work2();
    }
}

总结:

1、静态的方法不能调用非静态的变量。(静态的方法不知道堆上有哪些实例)

2、静态的方法不能调用非静态的方法。

Q:如果从静态方法调用非静态方法,但此非静态方法没有用到实例变量,这样可以通过编译吗?

A:不可以。如果子类继承覆盖了这个方法成有用到实例变量,则会矛盾。

3、静态变量的值对同一类的所有的对象来说都是相同的,共享一份静态变量。

静态代码块

随着类的加载而执行,而且只执行一次

作用:用于给进行初始化

构造函数是对对象进行初始化

class StaticCode
{
    static
    {
        System.out.println("hahha");
    }
    void show()
    {
        System.out.println("show");
    }
}
public class StaticCodeDemo {
    public static void main(String[] args)
    {
        new StaticCode().show();
        new StaticCode().show();
    }
}

显示:

hahha

show

show

构造代码块,可以给所有对象进行初始化的(通用性)

构造函数是给对应对象进行针对性的初始化(针对性)

private Person(){}

如果类中的方法都是静态的,所以该类是不需要创建对象的,为了保证不让其他创建该类对象,可以将构造私有化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值