Java入门------static关键字和静态属性、方法

简介: Java入门------static关键字和静态属性、方法

static关键字

在定义一个类时,只是描述某事物的特征和行为,并没有产生具体的数据,只有通过new关键字创建该类的实例对象时,才会开辟栈内存及内存,在堆内存中要保存对象的属性时,每个对象会有自己的属性。


如果希望某些属性被所有对象共享,就必须将其声明为static属性,如果属性使用了static关键字进行修饰,则该属性可以直接使用类名称进行调用,static关键字还可以修饰成员方法。

静态属性:

如果在Java程序中使用static修饰属性,则该属性称为静态属性(也称全局属性),静态属性可以使用类名直接访问。

格式如下:

类名.属性名

举例:

class student1{
    String name;
    int age;
    String school="A大学";
    public student1(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void info(){
        System.out.println("姓名:"+this.name+"年龄:"+this.age+"学校:"+school);
    }
}
public class Example{
    public static void main(String[]args){
        student1 stu1=new student1("张三",10);
        student1 stu2=new student1("李四",20);
        student1 stu3=new student1("王五",18);
        stu1.info();
        stu2.info();
        stu3.info();
        }
        }

输出:

姓名:张三年龄:10学校:A大学
姓名:李四年龄:20学校:A大学
姓名:王五年龄:18学校:A大学

上述实例,三名同学均来自A大学。


假设现在A大学需要改名为B大学,那么意味着,学校中所有学生的学校信息都要被修改,这样做显然是很麻烦的。


为了解决这种问题,我们可以使用static关键字修饰school属性,将其变为公共属性,school只会分配一块内存空间,被student类的所有对象共享,只要某个对象进行了一次修改,全部学生对象的school属性值都会发生改变。


修改如下:

static String school="A大学";
stu1.school="B大学";//只修改stu1对象的学校属性

输出:

//stu1/stu2/stu3对象的school属性都发生了变化
姓名:张三年龄:10学校:B大学
姓名:李四年龄:20学校:B大学
姓名:王五年龄:18学校:B大学


由此,可以得出这样一个结论,static声明的属性是所有对象共享的。

自始至终,school属性的内存空间大小并未有任何改变。

静态方法:

如果想要使用类中的成员方法,就需要先将这个类实例化,而在实际开发时,开发人员有时候希望在不创建对象的情况下,通过类名就可以直接调用某个方法,要实现这样的效果,只需要在成员方法前加上static关键字,使用static关键字修饰的方法通常称为静态方法。


同静态变量一样,静态方法也可以通过类名和对象访问。

类名.方法/实例对象名.方法



静态方法的使用:

举例:

class Example{
    public static void main(String[]args){
        student1 stu1=new student1("张三",18);
        student1 stu2=new student1("jason",19);
        student1 stu3=new student1("小明",20);
        stu1.setAge(20);//最终将实例stu1的年龄属性替换成20
        stu2.setName("小红");//最终将实例stu2的名字属性替换成"小红”
        //将所有实例的学校属性替换成B大学,由于它是使用static声明的,所以可以直接使用类名进行调用
        student1.setSchool("B大学");
        stu1.info();
        stu2.info();
        stu3.info();
    }
}
class student1{
    private String name;
    private int age;
    private static String school="A大学";
    public student1(String name,int age){
        this.name=name;
        this.age=age;
    }
    public void info(){
        System.out.println("姓名:"+this.name+",年龄:"+this.age+",学校:"+school);
    }
    //将student1类的所有属性进行封装,要想更改属性就必须使用setter方法
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name=name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age=age;
    }
    public static String getSchool(){
        return school;
    }
    public static void setSchool(String school){
        student1.school=school;
    }
}

输出:

姓名:张三,年龄:20,学校:B大学
姓名:小红,年龄:19,学校:B大学
姓名:小明,年龄:20,学校:B大学



静态方法只能访问静态成员,因为非静态成员需要创建对象才能访问,即随着对象的创建,非静态成员才会分配内存,而静态方法在被调用时可以不创建任何对象。

静态代码块:

在Java类中,用static关键字修饰的代码块称为静态代码块,当被类加载时,静态代码块会执行,由于类只加载一次,因为静态代码块只执行一次,在程序中,通常使用静态代码块对类的成员变量进行初始化。

举例:

class Example{
    public static void main(String[]args){
        student1 stu1=new student1();
        student1 stu2=new student1();
        student1 stu3=new student1();
    }
}
class student1{
    String name;
    //构造代码块
    {
        System.out.println("我是构造代码块");
    }
    //静态代码块
    static{
        System.out.println("我是静态代码块");
    }
    //构造方法
    public student1(){
        System.out.println("我是student1类的构造方法");
    }
}

输出:

我是静态代码块
我是构造代码块
我是student1类的构造方法
我是构造代码块
我是student1类的构造方法
我是构造代码块
我是student1类的构造方法

从输出结果,我们不难看出,代码块的执行顺序为静态代码块—>构造代码块----->构造方法。


static修饰的量会随着class文件一同加载,属于优先级最高的


上述实例中,虽然我们创建了三个实例化对象,但是静态代码块中的内容只被执行了依次且是第一次被执行,这就说明静态代码块在类第一次使用时才会被加载,并且只会加载一次。


目录
打赏
0
0
0
0
5
分享
相关文章
|
21天前
|
Java 中的 toString() 方法详解:为什么它如此重要?
在Java开发中,`toString()`方法至关重要,用于返回对象的字符串表示。默认实现仅输出类名和哈希码,信息有限且不直观。通过重写`toString()`,可展示对象字段值,提升调试效率与代码可读性。借助Lombok的`@Data`注解,能自动生成标准化的`toString()`方法,简化开发流程,尤其适合字段较多的场景。合理运用`toString()`,可显著提高开发效率与代码质量。
53 0
|
15天前
|
【Java并发】【原子类】适合初学体质的原子类入门
什么是CAS? 说到原子类,首先就要说到CAS: CAS(Compare and Swap) 是一种无锁的原子操作,用于实现多线程环境下的安全数据更新。 CAS(Compare and Swap) 的
47 15
【Java并发】【原子类】适合初学体质的原子类入门
|
12天前
|
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
ConcurrentHashMap是Java中线程安全的哈希表实现,支持高并发读写操作。相比Hashtable,它通过分段锁(JDK1.7)或CAS+synchronized(JDK1.8)实现更细粒度锁控制,提升性能与安全性。本文详细介绍其构造方法、添加/获取/删除元素等常用操作,并对比JDK1.7和1.8的区别,帮助开发者深入理解与使用ConcurrentHashMap。欢迎关注,了解更多!
48 3
【Java并发】【ConcurrentHashMap】适合初学体质的ConcurrentHashMap入门
|
15天前
|
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
46 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
|
16天前
|
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
什么是ArrayBlockingQueue ArrayBlockingQueue是 Java 并发编程中一个基于数组实现的有界阻塞队列,属于 java.util.concurrent 包,实现了 Bl...
50 6
【Java并发】【ArrayBlockingQueue】适合初学体质的ArrayBlockingQueue入门
|
23天前
|
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
前言 什么是ReentrantLock? ReentrantLock 是 Java 并发包 (java.util.concurrent.locks) 中的一个类,它实现了 Lock 接口,提供了与
63 10
【Java并发】【ReentrantLock】适合初学体质的ReentrantLock入门
|
15天前
|
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
前言 你是否在线程池工具类里看到过它的身影? 你是否会好奇LinkedBlockingQueue是啥呢? 没有关系,小手手点上关注,跟上主播的节奏。 什么是LinkedBlockingQueue? ...
42 1
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
【Java并发】【AQS】适合初学者体质的AQS入门
AQS这是灰常重要的哈,很多JUC下的框架的核心,那都是我们的AQS,所以这里,我们直接开始先研究AQS。 那说到研究AQS,那我们应该,使用开始说起🤓 入门 什么是AQS? AQS(Abst
74 8
【Java并发】【AQS】适合初学者体质的AQS入门
Java 中的 equals 方法:看似简单,实则深藏玄机
本文深入探讨了Java中`equals`方法的设计与实现。默认情况下,`equals`仅比较对象引用是否相同。以`String`类为例,其重写了`equals`方法,通过引用判断、类型检查、长度对比及字符逐一比对,确保内容相等的逻辑。文章还强调了`equals`方法需遵循的五大原则(自反性、对称性等),以及与`hashCode`的关系,避免集合操作中的潜在问题。最后,对比了`instanceof`和`getClass()`在类型判断中的优劣,并总结了正确重写`equals`方法的重要性,帮助开发者提升代码质量。
55 1
|
21天前
|
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
28 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等