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

简介: 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)
   {
     
 studentstu1 =new student();

       studentstu2 =new student();}}

image.gif

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

而非静态的属性和方法,在运行程序时,它们是不会直接进入到内存的,当程序执行创建对象的时候,它们才会进入到堆内存中。即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);

   }

}

image.gif

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


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


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

目录
相关文章
|
3天前
|
Java 程序员
Java this关键字详解(3种用法),Java程序员面试必备的知识点
Java this关键字详解(3种用法),Java程序员面试必备的知识点
|
4天前
|
算法 Java 数据安全/隐私保护
【Java开发指南 | 第二篇】标识符、Java关键字及注释
【Java开发指南 | 第二篇】标识符、Java关键字及注释
13 5
|
4天前
|
安全 算法 Java
Java一分钟:线程同步:synchronized关键字
【5月更文挑战第11天】Java中的`synchronized`关键字用于线程同步,防止竞态条件,确保数据一致性。本文介绍了其工作原理、常见问题及避免策略。同步方法和同步代码块是两种使用形式,需注意避免死锁、过度使用导致的性能影响以及理解锁的可重入性和升级降级机制。示例展示了同步方法和代码块的运用,以及如何避免死锁。正确使用`synchronized`是编写多线程安全代码的核心。
57 2
|
4天前
|
小程序 Java 容器
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
03|Java基础语法:讲解标识符、关键字、变量、数据类型、运算符、控制语句(条件分支、循环)
10 0
|
4天前
|
Java
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
深入浅出Java基础语法:标识符、关键字、变量、数据类型、运算符与控制语句
8 0
|
4天前
|
存储 安全 Java
【亮剑】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制
【4月更文挑战第30天】Java并发编程涉及`ThreadLocal`、`Volatile`、`Synchronized`和`Atomic`四个关键机制。`ThreadLocal`为每个线程提供独立变量副本;`Volatile`确保变量可见性,但不保证原子性;`Synchronized`实现同步锁,保证单线程执行;`Atomic`类利用CAS实现无锁并发控制。理解其原理有助于编写高效线程安全代码。根据业务场景选择合适机制至关重要。
|
4天前
|
Java 编译器
【Java探索之旅】this 关键字 解决你的成员变量困惑
【Java探索之旅】this 关键字 解决你的成员变量困惑
21 0
|
4天前
|
Java
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字
8 0
|
4天前
|
Java
Java里的关键字 __final
Java里的关键字 __final
|
4天前
|
Java 编译器
【JAVA】volatile 关键字的作用
【JAVA】volatile 关键字的作用