码迷,mamicode.com
首页 > 编程语言 > 详细

java基础---17. 静态static关键字

时间:2020-01-22 17:54:31      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:成员方法   ++i   空间   用途   inf   cme   说明   独立   直接   

1 static关键字概述

技术图片

2 静态static关键字修饰成员变量

2.1

  • 定义一个学生类
public class Student {
    private String name;
    private int age;
    static String room;

    public Student() {
    }

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

    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;
    }
}
  • 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
 */
public class Demo01StaticField {
    public static void main(String[] args) {
        Student one = new Student("郭靖",19);
        one.room = "101教室";
        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room);//姓名:郭靖,年龄:19 101教室

        Student two = new Student("黄蓉",16);
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room);//姓名:黄蓉,年龄:16 101教室
        //这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
    }
}

2.1

  • 定义类
public class Student {
    private int id;//学号
    private String name;//姓名
    private int age;//年龄
    static String room;//所在教室
    private static int idCounter = 0;//学号计数器,每当new了一个新对象的时候,计数器++

    public Student() {
        //idCounter++;也可以写成下面的样子。
        this.id = ++idCounter;

    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id = ++idCounter;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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;
    }
}
  • 使用
/*
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象
共享同一份数据。
 */
public class Demo01StaticField {
    public static void main(String[] args) {
        Student one = new Student("郭靖",19);
        one.room = "101教室";
        System.out.println("姓名:" + one.getName() + ",年龄:" + one.getAge() + " " + one.room
         + ", 学号:" + one.getId());//姓名:郭靖,年龄:19 101教室, 学号:1

        Student two = new Student("黄蓉",16);
        System.out.println("姓名:" + two.getName() + ",年龄:" + two.getAge()+ " " + two.room
         + ", 学号:" + two.getId());//姓名:黄蓉,年龄:16 101教室, 学号:2
        //这里并没有用two.room = "101教室";但是结果依然有101教室,说明static定义的变量是共享的
    }
}

3 静态static关键字修饰成员方法

3.1

  • 定义类
public class MyClass {
    
    public void method(){
        System.out.println("这是一个成员方法");
    }
    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
    }
}
  • 使用
/*
一旦使用了static修饰成员方法,那么就成为了静态方法。静态方法不属于对象而是属于类的。
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。

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

 */
public class Demo02StaticMethod {
    public static void main(String[] args) {
        //1. 对于成员方法
        MyClass obj = new MyClass();//首先创建对象
        //然后才可以使用没有static关键字的内容
        obj.method();//这是一个成员方法

        //2. 对于静态方法,可以通过对象名进行调用,也可以直接通过类名称来调用
        obj.methodStatic();//这是一个静态方法
        MyClass.methodStatic();//这是一个静态方法

        //3. 对于自己的方法
        //对于本类当中的静态方法,可以神略类名,以下两种调用方法完全等效
        myMethod();//自己的方法!
        Demo02StaticMethod.myMethod();//自己的方法!
    }
    public static void myMethod(){
        System.out.println("自己的方法!");
    }
}

3.2 注意事项

/*
注意事项:
1. 静态不能直接访问非静态
原因:原因:因为在内存中是先有了静态内容,后有了非静态内容。“先人不知道后人,但是后人知道先人”
2. 静态方法当中不能用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。
 */
public class MyClass {
    //成员变量
    int num;
    //静态变量
    static int numStatic;
    //成员方法
    public void method(){
        System.out.println("这是一个成员方法");
        //成员方法可以访问成员变量
        System.out.println(num);
        //成员方法可以访问静态变量
        System.out.println(numStatic);
    }
    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
        //静态方法可以访问静态变量
        System.out.println(numStatic);
        //静态方法不可以访问成员变量  静态不能直接访问非静态
        System.out.println(num);//报错

        //静态方法中不能使用this关键字
        System.out.println(this);//报错
    }
}

4 静态static的内存图

依然用之前的学生类

public class Demo03StaticStudent {
    public static void main(String[] args) {
        //首先设置一下教室,这是静态的东西,应该通过类名称经行调用
        Student.room = "101教室";

        Student one = new Student("郭靖",20);
        System.out.println("one的名字是:" + one.getName());//one的名字是:郭靖
        System.out.println("one的年龄是:" + one.getAge());//one的年龄是:20
        System.out.println("one的教室是:" + Student.room);//one的教室是:101教室

        Student two = new Student("黄蓉",18);
        System.out.println("two的名字是:" + two.getName());//two的名字是:黄蓉
        System.out.println("two的年龄是:" + two.getAge());//two的年龄是:18
        System.out.println("two的教室是:" + Student.room);//two的教室是:101教室

    }
}

技术图片

  • 在方法区当中有一块独立的空间叫做静态区,专门用来存储静态static数据
  • 由Student.room到Student类里去找room,再到静态区找到101教室

5 静态代码块

/*
静态代码块特点:当第一次使用到本类时,静态代码块执行唯一的一次。
静态内容总是优先于非静态,所以静态代码块比构造方法先执行.

静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值
 */
public class Demo04Static {
    public static void main(String[] args) {
        Person one = new Person();
        //静态代码块执行了
        //构造方法执行了!

        Person two = new Person();
        //构造方法执行了!
    }
}

java基础---17. 静态static关键字

标签:成员方法   ++i   空间   用途   inf   cme   说明   独立   直接   

原文地址:https://www.cnblogs.com/deer-cen/p/12229115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!