JAVA static关键字 和 static 关键字误区

举报
啊Q老师 发表于 2022/04/11 15:14:25 2022/04/11
【摘要】 本文章介绍了JAVA static关键字 和 static 关键字误区

1.static方法(静态方法)

static方法就是没有this的方法,因为static方法不依赖于任何对象就可以进行调用了。
在static方法的内部不能调用非静态方法,但是非静态方法是可以调用static方法的。

(static方法的内部不能调用非静态方法:这不是完全不可能。如果传递一个对象的引用到静态方法里,然后通过这个引用(this效果相同),你就可以调用非静态方法和访问非静态成员变量了,但通常要达到这样的效果,只需写一个非静态方法即可。)

public class student{
    static String name ;//静态成员变量(静态属性)
    int age ;//非静态成员变量(非静态属性)
    
    //static方法,程序的入口实质是一个静态方法
    public static void main(String[] args)
    {

        setName();  //静态方法直接调用
        new student().setAge(); //需传递一个对象的引用到静态方法
    }
    
    //静态方法
    public static void setName() 
    {System.out.println("静态方法!"); }
    
    //非静态方法
    public void setAge() 
    {System.out.println("非静态方法!"); }}

2.static变量

static变量(静态变量):
        静态变量可以被所有对象调用(所有对象所共享的),当且仅当在类初次加载时就被初始化。另外,static成员变量的初始化顺序按照定义的顺序进行初始化。所以静态区里面存放的东西是唯一的。

非静态变量:
        非静态变量是对象拥有的、私有的,在创建对象的时候才会初始化,各个对象所拥有的变量相互隔离、互不影响。

public class student{

    static String name ;
    int age ;
    public static void setName() {System.out.println("静态方法!"); }
    public void setAge() {System.out.println("非静态方法!");}


    public static void main(String[] args)
    {
        student stu1 = new student();

        student stu2 = new student();}}

image.png

当运行程序时,静态的属性和方法会放进在静态区。

而非静态的属性和方法,在运行程序时,它们是不会直接进入到内存的,当程序执行创建对象的时候,它们才会进入到堆内存中。即new student()被执行的时候,创建了一个新对象,非静态的属性和方法依附于创建的新对象进入到内存中。

3.static代码块

static关键字可以用来形成静态代码块以优化程序性能,因为只会在类加载的时候执行一次。

import java.sql.Date;

public class student{
    private Date birthday; 
    public student() {}
    public student(Date birthday) 
    { this.birthday = birthday ;}
    

    public String judge()
    {
        Date startDate = java.sql.Date.valueOf("2000-1-1");
        Date endDate = java.sql.Date.valueOf("2022-1-1");

        return        (birthday.compareTo(startDate) >= 0 &&

                         birthday.compareTo(endDate) <=0)?"True":"Flase";
        //三元运算符判断是否生日在startDate到endDate之间
    } 
    public static void main(String[] args)
    {
        Date studentbirthday = java.sql.Date.valueOf("2020-12-31");
        student student = new student(studentbirthday);
        System.out.println(student.judge());
    }}

在每次judge被调用的时候,堆内存当中都会开辟空间,创建生成startDate和endDate两个对象,造成了空间浪费。代码只将startDate,endDate在judge()方法中移去,改成:

  private static Date startDate,endDate; //定义为静态变量
    static 
    {
        Date startDate = java.sql.Date.valueOf("2000-1-1");
        Date endDate = java.sql.Date.valueOf("2022-1-1");
    }

这样,效率会更高,startDate,endDate存在静态区被对象所共享,进行多次操作的时候就不需要占更多的空间。

static 关键字误区:

1.静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。非静态方法中能否够通过this访问静态成员变量?

public class student 
{
    static String name = "小黑"; //静态变量
    
    public static void main(String[] args){
        new student().printname();
    }
    public void printname()
    {
        String name = "小白"; //非静态变量
        System.out.println(this.name); 
    }
}

所以非静态方法中能够通过this访问静态成员变量。

2.Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字,而static关键字不会影响到变量或者方法的作用域。

3.static是不允许用来修饰局部变量,Java语法的规定。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。