【JavaSE成神之路】一文搞定static关键字

简介: 哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!这一节啊,咱们要学习的内容是Java的static关键字。

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容是Java的static关键字

5aa78e74a0d4f02632089b48f27a5b8c.gif

1. 我们是怎么使用static关键字的

我们其实一直在用static关键字,比如main方法:

public static void main(String[] args) {
}

static关键字可以用来修饰方法,main方法也是方法。它还可以修饰成员变量。

回到之前Car的例子,我们新增一个价格属性,价格用double类型。

87b2c0224cab61552fd6f46a5bbd0e8b.png

你有没有发现,用static修饰的变量,在IDEA中是斜体的。那么和其他变量有啥区别呢,我们来看一个例子你就明白了。

public class CarTest {
    public static void main(String[] args) {
        Car car1 = new Car();
        car1.price = 200000;
        Car car2 = new Car();
        car2.price = 300000;
        System.out.println("car1.price = " + car1.price);
        System.out.println("car2.price = " + car2.price);
    }
}


此段代码中,定义了Car类,创建了两个实例car1和car2,并为car1和car2分别设置了price属性,然后输出了这两个实例的price属性值。


结果:


car1.price = 300000.0


car2.price = 300000.0


代码中其实给出了警告信息:


1bc0b041ab68c6e111aa9098c52fa904.png

意思是你用实例对象去访问一个静态变量,编译器对你提出了警告。虽然不影响运行,但是结果和我们预想的有出入,price的值都是30w。


static关键字用于定义静态变量和静态方法,可以通过类名直接调用,不需要实例化对象。


因为static修饰的变量是类变量,类变量是属于整个类的,与类的实例对象无关,所以不需要实例化对象,可以直接通过类名调用。


对Car类来说,静态的price属性是所有实例对象共享的一块内存,所以不管是car1还是car2,访问的和操作的都是同一块内存。


我们访问静态变量,是可以直接用类名去访问的,比如:

System.out.println("car1.price = " + Car.price);

2.静态方法

static除了可以修饰成员变量,还可以修饰成员方法,典型的就是main方法。


需要注意的是,static修饰的方法只能访问其他静态静态成员变量和静态方法,不能访问普通成员变量和普通方法,也不能访问this关键字。


因为this关键字代表当前对象,而static修饰的方法是所有实例对象共有的,所以this没办法代表其中某一个实例。


#3. 总结


static关键字用于定义静态变量和静态方法,可以通过类名直接调用,不需要实例化对象。


例子1 - 静态方法访问静态成员变量:

public class Test {
    public static int count = 0; //定义静态变量
    public static void main(String[] args) {
        count++;
        System.out.println("count值为:"+count);
    }
}

例子2 - 静态方法访问其他静态方法:

public class Test {
    public static void printMessage() { //定义静态方法
        System.out.println("Hello World!");
    }
    public static void main(String[] args) {
        printMessage(); //通过类名调用
    }
}

当然,在静态方法中,你依然可以用new的方式创建实例对象,然后去调用其普通方法。

public static void test(){
    Car car = new Car();
    car.setBrand("五菱宏光");
    System.out.println(car);
}

3.代码块问题

代码块:代码块是指由花括号括起来的语句块,每当创建类的实例时,代码块都会被执行。

实际作用:可以用来给实例变量赋值,或者调用方法,用来初始化实例变量,提高代码的复用性。

举例:


public class Person {
    private String name;
    private int age;
    { 
        System.out.println("这是代码块"); 
    }
    public Person() {
        System.out.println("这是构造方法");
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

静态代码块:静态代码块是指由static关键字和花括号括起来的语句块,只会在类加载的时候执行一次,一般用于初始化类的静态变量。

实际作用:可以用来给类变量赋值,或者调用方法,用来初始化类变量,提高代码的复用性。

举例:

public class Person {
    private static String name;
    private static int age;
    static{ 
        System.out.println("这是静态代码块"); 
    }
    public Person() {
        System.out.println("这是构造方法");
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

4.课后作业


1.static关键字的作用是?(多选)


A、修饰类


B、修饰变量


C、修饰方法


D、修饰块


有任何不懂的地方,可以点击下方的“发消息”给我留言。


PS:从这一节开始,欢迎你使用任何你喜欢的IDE完成作业,比如eclipse,IDEA,如果不会使用工具,可以去B站搜索相关的视频进行学习哈。



相关文章
|
6月前
|
Java 编译器
JavaSE基础精选-面向对象
JavaSE基础精选-面向对象
22 0
【JavaSE专栏23】Java反射有多强? 他拥有这五大神奇功能!
【JavaSE专栏23】Java反射有多强? 他拥有这五大神奇功能!
|
存储 IDE Java
【JavaSE成神之路】Java面向对象(上)
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java的面向对象。
169 1
【JavaSE成神之路】一文洞悉Java语言的作用域
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java语言的作用域。
151 0
【JavaSE成神之路】一文洞悉Java语言的作用域
【JavaSE成神之路】一文洞悉Java的方法
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java语言的方法。
【JavaSE成神之路】一文洞悉Java的方法
|
存储 搜索推荐 IDE
【JavaSE成神之路】一文洞悉Java语言的基本语法
哈喽,我是兔哥,今天就让我们继续这个JavaSE成神之路! 这一节,咱们要学习的内容是Java语言的基本语法,包括变量、常量、数据类型、运算符、流程控制语句、数组、字符串。 这是我们学好Java的基石,万丈高楼平地起的前提就是打好地基。 下面就让我们来一一参悟这些概念吧。
【JavaSE成神之路】一文洞悉Java语言的基本语法
|
IDE Java 编译器
【JavaSE成神之路】Java面向对象(下)
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容还是Java的面向对象。
116 0
|
Java 编译器
【JavaSE成神之路】可变参数
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是Java的可变参数。
【JavaSE成神之路】流程控制语句
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是流程控制语句。
126 0
|
算法 Java
【JavaSE成神之路】数组思考题讲解
哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路! 这一节啊,咱们要学习的内容是数组的思考题讲解,也就是上一节我留下的两个小作业。
106 0