Java中static关键字(重点)

static关键字挺重要的,尤其是对于应届毕业生或者是实习生面试,是面试官大都会问的面试题,所以大家好好掌握,本人写的也有点不全面,只是本人的一些理解,希望大家及时指正。

static的简介:

        static的英语意思是静态的,在类中,用static声明的属性为静态属性,用static声

明的方法为静态方法,举个栗子:

        static int a = 13;//为静态变量

        我们常见的 public static void main(){}  //就是一个静态方法

        static修饰过之后和不修饰有什么区别呢? 修饰过之后的属性和方法和类的生命周

期是一样的,也可以理解为类在静态的东西就在,类没了静态的东西就没了。

        也可以给大家举个生活中的栗子,一所学校,只有一个厕所,可以把学生教师当作

一个个对象,学校盖好的时候厕所也是盖好了对吧,总不会校长说学校盖好了,结果厕

所一直在施工,厕所盖好之后就是厕所这个东西,它也不会跑也不会飞,可以理解它为静态的,

一个个学生(也可以理解为对象)去厕所,厕所会变吗?他会变成餐厅吗?不会的,它

还是厕所,他只有在盖学校(可以理解为类)的时候才会初始化,只有当学校(类)塌

了的时候厕所才会没。

【注意事项】:

1.使用static修饰成员变量的时候,只需要记住一种调用方式

类名.属性名字

2.代码中没有创建任何类对象的时候,static修饰的成员变量已经加载。

3.分析内存:只要是static修饰的成员变量,都是在.class【字节码文件】文件,编译阶段,就直接加载到了内存的数据区。该过程是早于对象的创建的,整个数据区静态的成员属性是伴随着整个程序的结束而结束。

4.保存区域:

类对象 堆区。静态的成员属性保存在数据区

这里要强调一下:

  • static修饰的成员变量和方法,从属于类

  • 普通变量和方法从属于对象

  • 静态方法不能调用非静态成员,编译会报错

static关键字的用处

        那么static的用处是什么呢?

        为了方便在对象还没有实例化的时候调用属性或者方法

        被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以

通过类名去进行访问。

        static可以用来修饰类的成员方法、类的成员变量,另外也可以编写static代码块来优化程序性能

静态变量(static修饰的变量)

        static变量也称为静态变量,静态变量和非静态变量的区别:

        静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化,和对象没有任何关系,可以直接通过 类名.属性调用。

        非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

静态方法(static修饰的方法)

        静态方法也成为static修饰的方法,和对象没有任何关系!由于静态方法不依赖于任何对象就

可以直接访问,因此对于静态方法来说,是没有this的,因为不依附于任何对象,并且由于此特

性,在静态方法中不能访问类的非静态成员变量和非静态方法,因为非静态成员变量和非静态方法

都必须依赖于具体的对象才能被调用。

        虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是

可以访问静态成员方法和静态成员变量。

        static方法是属于类的,并非实例对象,在JVM加载类时,就已经存在内存中,不会被虚拟机

GC回收掉(不知道GC的可以看一下jvm中的GC回收机制),所以这样内存负荷会很大,但是非

static方法会在运行完毕后被虚拟机GC掉,减轻内存压力

【注意事项】:

1.静态的成员方法可以摆脱对象束缚,直接使用类名调用静态的成员方法

2.内存分析:静态的成员方法随着.class文件的加载而加载。会被加载到方法区。

这个时候方法的创建要早于对象的创建。

3.静态的成员方法中不能使用非静态的成员属性和非静态的成员方法

4.静态的方法不能被重写

5.静态方法中可以的创建的对象

下附栗子:

class SingleDog {
    //成员属性
    String name;
    int age;
    static int test = 20;//静态的成员属性
    //成员方法
    public void eat () {
        name = "goudan1";
        testStaticMethod();
        System.out.println("单身狗吃狗粮");
    }
    //静态方法
    public static void testStaticMethod () {
        //name = "goudan";
        //因为静态的方法早于对象的创建,非静态的属性非静态方法是对象创建的时候才调用
        System.out.println("静态的成员方法");
        //eat();
    }
}
class XiaoMing extends SingleDog {
//    @Override//重写的严格限制,这个报错证明不是重写的,是你在自己定义的
//    public static void testStaticMethod() {
//        System.out.println("我是子类的静态方法");
//    }
}
public class Demo1 {
    public static void main(String[] args) {
        SingleDog.testStaticMethod();
        SingleDog singleDog = new SingleDog();
    }
}

1、 可以看到当静态方法内调用非静态方法的时候直接就会编译报错。

2、可以看到重写静态方法testStaticMethod()时候,注解也会编译报错,证明不是你重写的

3、可以看到,testStaticMethod这个静态方法是直接通过类来调用的,也可以看到静态方法中可以实例化对象,并且可以掉用对象方法。

 

 

 

 

静态代码块(static代码块)

        构造方法用于对象的初始化。静态初始化块,用于类的初始化操作。在静态初始化块中不能

直接访问非staic成员,在一个类中执行顺序为: 静态代码块>构造代码块>构造方法

下附栗子:

class StaticPerson {
    public StaticPerson() {
        System.out.println("我是构造方法");
    }
    {
        System.out.println("我是构造代码块");
    }
    static {
        System.out.println("我是静态的代码块");
    }
}
public class Demo1 {
    public static void main(String[] args) {
        StaticPerson staticPerson = new StaticPerson();
    }
}

可以看到,代码中故意把顺序颠倒,但是输出结果为 静态代码块-构造代码块-构造方法,也直接的反应了他们三个在程序中的运行顺序。

 

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波波奶茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值