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语法的规定。

目录
相关文章
|
1天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
26 9
|
1天前
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
22 11
|
28天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
11天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
28天前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2163 3
|
2月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
62 9
|
2月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
62 8
|
2月前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
52 4
|
2月前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
3月前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
47 3