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

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();
        //构造方法执行了!
    }
}

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

时间: 2024-10-10 16:57:11

java基础---17. 静态static关键字的相关文章

java基础学习总结——static关键字

永不放弃,一切皆有可能!!! 只为成功找方法,不为失败找借口! java基础学习总结——static关键字 一.static关键字 原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量.对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类所有的对象共享. 1.1.静态成员变量与非静态成员变量的区别 以下面的例子为例说明 1 package cn.galc.test; 2 3 public class Cat { 4 5

Java基础15-final、static关键字和Object类

一.final关键字 1.什么是final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢? 要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. 2.final的特点 ①修饰类不可以被继承,但可以继承其他类 ②final修饰的

Java基础语法 - 面向对象 - static 关键字

使用static关键字修饰的变量.常量和方法分别被称作静态变量.静态常量和静态方法,也被称作类的静态成员 静态变量 使用static修饰过的类变量称为静态变量 该变量需要使用类名.变量名进行调用,不能使用对象名/this进行调用 在类方法中不能定义与静态变量同名的局部变量 1 package mingri.chapter_6; 2 3 public class Pool { 4 5 public static int water = 0; // 定义一个静态变量 6 7 public void

java中的静态static关键字

类的静态成员函数不能访问非静态的成员函数以及非静态的成员变量, 但是反过来却是成立的. 即:非静态成员函数可以访问静态成员函数和静态成员变量. 这个可以从静态成员的特点来解释,因为静态成员属于类,因此即便是没有类的对象我们也能访问类的静态成员. 但是非静态成员函数由于只能通过类的对象来访问,所以其必须要有对象才行. 那,反证法: 假如,类的静态成员函数可以访问非静态的成员函数:示例代码如下, class Test { public static int i; private int j; pub

java基础知识回顾之关键字

其实java中的常用关键字并不多,总共加起来也没有多少个,具体见如下这张表: private,protect,public 在java中,在类,类的属性和累的方法前面加上一个修饰符来对其进行访问权限上的控制.除了使用private,protect,public之外, 还有一种是default情况,即使不加任何权限修饰符.关于这四中情况的权限差别见下表: 注意:default不是修饰符,他表示一种不加任何修饰符的情况. 这里,主要看一看static,instanceof,final关键字的含义和如

Java 基础:认识&理解关键字 native 实战篇

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 泥瓦匠初次遇见 navicat 是在 java.lang.Object 源码中的一个hashCode方法: 1 public native int hashCode(); 为什么有个navicat呢?这是我所要学习的地方.所以今天泥瓦匠想要总结下navicat. 一.认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯.比如解决某一个方案都喜欢就单单这

java基础面向对象之this关键字

java基础面向对象之this关键字 2017-02-14 this的核心概念: this关键字在java中表示当前对象. this关键字的主要用法: 在java中利用this关键字可以实现类属性的调用,类方法的调用,当前对象. 一.调用属性 1 class Book{ //Book类 2 private String title ; //title属性 3 private int price ; //price属性 4 5 public Book(String t , int p){ 6 ti

Java中this和static关键字及代码块

this: 可以使用this表示类中的属性------this.name=name 可以使用this强调调用的是本类的方法 可以使用this调用本类的构造方法------this();调用本类中无参构造方法 可以使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 普通代码块:直接在方法或是语句中定义的代码块 pub

Java基础17:Java IO流总结

Java基础17:Java IO流总结 IO流概述 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易. 输入和输出 术语"输入"和"输出"有时候会有一点让人疑惑.一个应用程序的输入往往是另外一个应用程序的输出?那么OutputStream流到底是一个输出到目的地的流呢,还是一个产生输出的流?InputStre