java中static关键字简介

简介: `static`关键字用于修饰类的成员变量和方法,使其属于类而非对象。静态成员可通过类名直接访问,无需实例化对象。静态方法只能访问静态成员,不能直接访问非静态成员或使用`this`关键字。此外,静态代码块在类首次加载时执行且仅执行一次,适用于初始化操作。

static静态关键字:

static关键字可以修饰成员变量和成员方法,被修饰的成员是属于类的,而不是简简单单的属于某个对象,也就是说可以不用通过对象调用,而是通过类直接调用。

类变量(静态变量) :被static修饰的成员变量称为类变量。当创建对象后,各个对象都共享同一个类变量的值,任何对象都可以更改类变量的值,也可以在不创建对象的情况下对该类进行操作。

静态方法:被static修饰的方法称为静态方法,此方法不属于对象,而是属于类。静态方法不能直接访问成员变量和成员方法,可以直接访问类变量和静态方法;静态方法中不能使用this关键字

定义一个包含静态变量和静态方法的类:

java

体验AI代码助手

代码解读

复制代码

// 定义一个有static关键字修饰成员变量的标准类:
public class StaticKey{
    // 定义成员变量:
    private String names;
    private int age;
    // 定义成员方法:
    public String gowhere(){
        return ",通过成员方方法去水立方";
    }
    // 1-1.类变量的定义格式:static 数据类型 变量名,如:
    static String bus;//类变量可以直接通过类名点.访问,也可以通过对象.访问,但是不推荐使用对象访问
    // 1-2.静态方法的定义格式:修饰符 static 返回值类型 方法名(){},如:
    public static String gowherestatic(){
        // System.out.println(this.names+"通过静态方法去迪士尼");静态方法不能直接访问成员变量和成员方法,也不能使用this关键字,静态方法只能访问静态成员。
        return ",通过静态方法去迪士尼";
    }


    // 2.该类的无参数构造方法:每创建一次对象就会执行一次该构造方法
    public StaticKey(){
        System.out.println("无参数构造方法执行了");
    }
    // 3.该类的全参数构造方法:
    public StaticKey(String na,int ag){
        this.names = na;
        this.age = ag;
    }
    // 4.names成员变量的get-和set-方法:
    public String getNames(){
        return names;
    }
    public void setNames(String na){
        this.names = na;
    }
    // 5.age成员变量的get-和set-方法:
    public int getAge(){
        return age;
    }
    public void setAge(int ag){
        this.age = ag;
    }
}

通过上面的类实例化对象:

java

体验AI代码助手

代码解读

复制代码


public class Passenger{
    public static void main(String[] args){
        // 1.通过StaticKey类实例化对象:
        StaticKey passenger1 = new StaticKey("jack",18);
        StaticKey passenger2 = new StaticKey("sherry",17);
        // 没创建一次对象就会执行一次无参数构造方法,打印2次:全参数构造方法执行了

        // 2.访问类变量:(不推荐通过对象访问类变量)
        passenger1.bus = "大巴-001";
        // 3-1.测试:通过对象访问类变量(不推荐使用)
        System.out.println("姓名:"+passenger1.getNames()+",年龄:"+passenger1.getAge()+",大巴:"+passenger1.bus);//姓名:jack,年龄:18,大巴:大巴-001
        System.out.println("姓名:"+passenger2.getNames()+",年龄:"+passenger2.getAge()+",大巴:"+passenger2.bus);//姓名:sherry,年龄:17,大巴:大巴-001
        
        // 3-2:通过类直接访问类变量:(推荐使用)
        StaticKey.bus = "大巴-002";
        System.out.println("姓名:"+passenger1.getNames()+",年龄:"+passenger1.getAge()+",大巴更改为:"+StaticKey.bus);//姓名:jack,年龄:18,大巴更改为:大巴-002
        System.out.println("姓名:"+passenger2.getNames()+",年龄:"+passenger2.getAge()+",大巴更改为:"+StaticKey.bus);//姓名:sherry,年龄:17,大巴更改为:大巴-002
        
        // 4-1:通过对象调用成员方法:
        System.out.println("姓名:"+passenger1.getNames()+",年龄:"+passenger1.getAge()+",大巴更改为:"+StaticKey.bus+passenger1.gowhere());//姓名:jack,年龄:18,大巴更改为:大巴-002,通过成员方方法去水立方
        System.out.println("姓名:"+passenger2.getNames()+",年龄:"+passenger2.getAge()+",大巴更改为:"+StaticKey.bus+passenger2.gowhere());//姓名:sherry,年龄:17,大巴更改为:大巴-002,通过成员方方法去水立方
        // 4-2:通过对象调用静态方法,不推荐使用,推荐使用类调用静态方法:(通过对象访问静态方法最终会被编译为通过类访问静态方法)
        System.out.println("姓名:"+passenger1.getNames()+",年龄:"+passenger1.getAge()+",大巴更改为:"+StaticKey.bus+passenger1.gowherestatic());//姓名:jack,年龄:18,大巴更改为:大巴-002,通过静态方法去迪士尼    
        System.out.println("姓名:"+passenger2.getNames()+",年龄:"+passenger2.getAge()+",大巴更改为:"+StaticKey.bus+passenger2.gowherestatic());//姓名:sherry,年龄:17,大巴更改为:大巴-002,通过静态方法去迪士尼 
        System.out.println("姓名:"+passenger1.getNames()+",年龄:"+passenger1.getAge()+",大巴更改为:"+StaticKey.bus+StaticKey.gowherestatic());//姓名:jack,年龄:18,大巴更改为:大巴-002,通过静态方法去迪士尼  
        System.out.println("姓名:"+passenger2.getNames()+",年龄:"+passenger2.getAge()+",大巴更改为:"+StaticKey.bus+StaticKey.gowherestatic());//姓名:sherry,年龄:17,大巴更改为:大巴-002,通过静态方法去迪士尼

        /*
        总结:
        成员方法可以访问成员变量和静态变量,静态方法不能直接访问非静态,因为在内存中是先有静态内容,后有非静态内容的,即前者无法访问后者,后者可以访问前者。
        访问静态时,与对象无关,在内存中直接通过方法区-静态区访问,而不是通过某个对象间接访问。
        */
    }
}

静态代码块:

直接在类中通过关键字static修饰大括号,特点:在某个java文件中第一次用到本类时只会执行一次,再使用此类将不再执行静态代码块中的内容(另一个java文件中会再次执行),如:

java

体验AI代码助手

代码解读

复制代码

public class StaticBlock{
    static {
        System.out.println("这里是静态代码块");//这里只会执行一次,那就是在第一次使用到该类的时候,后面再使用到不会再执行静态代码块中的内容。
    }
}

使用静态代码块类的实例对象:

java

体验AI代码助手

代码解读

复制代码

public class StaticBlockObj{
    public static void main(String[] args){
        StaticBlock staticblock = new StaticBlock();
        StaticBlock staticblock2 = new StaticBlock();
    }
}

另一个java文件源码:

java

体验AI代码助手

代码解读

复制代码

public class StaticBlockObj2{
    public static void main(String[] args){
        StaticBlock staticblock = new StaticBlock();
        StaticBlock staticblock2 = new StaticBlock();
    }
}


转载来源:https://juejin.cn/post/7090744292527833096

相关文章
|
5月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
196 24
|
9月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
421 29
JVM简介—1.Java内存区域
|
Oracle 安全 Java
Java语言简介及发展
Java语言简介及发展
207 1
|
9月前
|
Java Linux API
课时3:Java简介(Java主要特点)
本文介绍了Java的主要特点及其运行机制。Java结合了编译型和解释型语言的优点,通过Java虚拟机(JVM)实现跨平台移植,简化了不同操作系统间的开发流程。Java的特点包括可移植性、简单易用、支持多线程编程、自动垃圾收集和面向对象编程。随着硬件技术的发展,Java的性能问题已大大改善,成为行业标准之一,广泛应用于各种商用平台开发。
312 1
|
Java 编译器 测试技术
Java基础16-Java注解简介和最佳实践(二)
Java基础16-Java注解简介和最佳实践(二)
120 4
|
9月前
|
开发框架 移动开发 Java
课时2:Java简介(Java发展概述)
课时2:Java简介(Java发展概述) 摘要: 1. Java基础知识:介绍Java作为编程语言及其思想。 2. Java的发展历史:从1991年GREEN项目到1995年正式推出,历经网景公司、HotJava浏览器等关键节点。 3. Java的版本信息:涵盖从JDK 1.0到JDK 1.8的主要版本及特性,如Lambda表达式和模块化支持。
203 0
|
9月前
|
存储 Java C语言
课时11:Java数据类型简介
本文介绍了Java中的数据类型划分,主要分为基本数据类型和引用数据类型。基本数据类型包括数值型(整型、浮点型)、布尔型和字符型,每种类型有固定的默认值和存储范围。引用数据类型涉及内存使用,如数组、类和接口,默认值为Null。文中还提供了不同类型的选择原则,帮助开发者在实际编程中合理选用数据类型。
124 0
|
9月前
|
Oracle Java Unix
课时1:认识Java(Java发展简介)
课时1:认识Java(Java发展简介)。主讲人李兴华介绍了Java的起源、发展历程及其广泛应用。Java由Sun公司开发,最初为嵌入式系统设计,后演变为三大方向:Java SE、Java ME和Java EE。尽管面临版权争议等挑战,Java仍是最流行的编程语言之一,广泛应用于大型企业及互联网平台开发。
123 0
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
184 2
Java 中的 String Pool 简介
|
11月前
|
自然语言处理 Java 关系型数据库
Java mysql根据很长的富文本如何自动获取简介
通过使用Jsoup解析富文本并提取纯文本,然后根据需要生成简介,可以有效地处理和展示长文本内容。该方法简单高效,适用于各种应用场景。希望本文对您在Java中处理富文本并生成简介的需求提供实用的指导和帮助。
211 9