动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

Java中static关键字

04-11 20:20 913浏览
举报 T字号
  • 大字
  • 中字
  • 小字

1. 概述

假设有一个学生类,它的数据成员有姓名、年龄、学号、教室,对于在同一个班的同学来讲,每个同学的姓名、年龄、学号或许都是不一样的,但是教室肯定是一样的,如果有40个同学,我有必要把40个同学的教室名都设置一遍吗?没必要,教室名是40个同学共享的一个属性,它不同于名字、学号这些,当我们给教室这个变量前面加上static后,它就是一个共享的属性了,我们只需把共享的属性设置一遍,所有的对象就会共享到这一设置。

public class Student{
    private String name;  //名字
    private int age;      //年龄
    private int ID;       //学号
    private static String Room; //加上static关键字,变成共享的一个属性
}

2. 静态static关键字修饰成员时

如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于这个类。多个对象共享同一份数据

用代码演示一遍

先创建一个学生类

public class Student {
        //姓名
        private String name;
        
        //年龄
        private int age;
        
        //学号
        private int ID;
        
        //教室,我没加private关键字,是想可以直接通过Student类来修改它
        static String room;

        //生成无参构造和有参构造
        public Student() {
        }

        public Student(String name, int age, int iD) {
                this.name = name;
                this.age = age;
                this.ID = iD;
        }

        //生成各成员的setter和getter
        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 int getID() {
                return ID;
        }

        public void setID(int iD) {
                ID = iD;
        }

    public static String getRoom() {
                return room;
        }

        public static void setRoom(String room) {
                Student.room = room;
        }
}

在main中创建对象,并打印个人信息

public class staticField {

        public static void main(String[] args) {
                //先设置一下大家的教室,我们说静态成员是属于类的,所以可以直接通过(类名称.成员变量)设置教室
                Student.room = "通信1班";
                
                //新建一个学生对象小明,20岁,学号1号
                Student one = new Student("小明", 20, 1);
                
                //再新建一个学生对象小红,21岁,学号2号
                Student two = new Student("小红", 21, 2);
                
                //将小明和小红的个人信息打印一遍,顺便看看他们的教室是不是都一样
                System.out.println("学生名字:" + one.getName() + "," + "年龄:" + one.getAge() + ","  + "学号:" + one.getID() + "," + "教室:" + Student.room);
                
                System.out.println("学生名字:" + two.getName() + "," + "年龄:" + two.getAge() + "," + "学号:" + two.getID() + "," + "教室:" + Student.room);
        
            
                //在这里,我们当然也可以通过对象的方法来修改教室
                //但是,以对象的方式修改,在eclipse会有警告:类型Student中的静态方法应该以静态方式访问
                one.setRoom("通信2班");
                System.out.println(one.getRoom());
    }
}

输出结果:

学生名字:小明,年龄:20,学号:1,教室:通信1班
学生名字:小红,年龄:21,学号:2,教室:通信1班
通信2班

3. static关键字修饰方法成员时

一旦使用static修饰成员方法,那么就成为了静态方法。静态方法不属于对象,而是属于类

如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它3.1 static修饰方法(代码演示)

先创建一个MyClass类,然后在里面添加一个静态方法和非静态方法

public class MyClass {
    public void method(){
        System.out.println("这是一个普通成员方法");
    }

    public static void methodStatic(){
        System.out.println("这是一个静态成员方法");
    }
}

在main中进行调用

public class staticMain {
    public static void main(String[] args) {
        //首先创建对象
        MyClass obj = new MyClass();
        //然后才能使用没有static关键字的内容
        obj.method();

        //对于静态方法来说,可以通过对象名来进行调用,也可以直接通过类名称来调用
        obj.methodStatic();  //正确,不推荐,会让人误以为它是一个普通的成员方法,这种写法在编译之后而会被javac翻译成(类名称.方法)
        MyClass.methodStatic(); //正确,推荐,既然它是静态的方法,就用它特有的(类名称.方法)来进行调用

        //对于本类当中的静态方法,可以省略类名称,当然也可以不省
        myMethod();    //在编译时,也会被翻译成staticMain.myMethod();
        staticMain.myMethod();  //与上面的写法,完全等效
    }

    public static void myMethod(){
        System.out.println("本类当中的静态方法");
    }
}

输出结果:

这是一个普通成员方法
这是一个静态成员方法
这是一个静态成员方法
本类当中的静态方法
本类当中的静态方法

小总结

无论是静态成员变量,还是静态成员方法,如果有了static,都推荐使用类名称来进行调用,格式如下:

  • 静态变量:类名称.变量名
  • 静态方法:类名称.方法名

注意事项

第一:静态方法不能访问非静态变量

原因:因为在内存当中,是先有静态的内容,后有非静态的内容,“先人不知道后人,而后人知道先人”

示例:比如在以下代码中, 静态方法methodStatic不能打印出普通成员变量num

public class MyClass {
    int num = 5; //普通成员变量
    static int staticNum = 6;  //静态成员变量

    public void method(){
        System.out.println("这是一个普通成员方法");
        System.out.println(num);  //可以
        System.out.println(staticNum);  //可以
    }

    public static void methodStatic(){
        System.out.println("这是一个静态成员方法");
        System.out.println(staticNum); //可以
        System.out.println(num);  //报错,不可以访问普通成员变量num
    }
}

4.静态代码块的用途

静态代码块通常用于在类刚开始被使用时,对某些变量进行批量的赋值,在一些特定的情况中也具有重要的作用,比如在编写JDBC工具类的时候,需要加载有mysql信息的配置文件,但是在这里就先做简单的了解。

0人推荐
共同学习,写下你的评论
0条评论
提枪策马乘胜追击
程序员提枪策马乘胜追击

6篇文章贡献30667字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消