static的用法(一):静态成员变量和静态成员方法

被static修饰的成员变量和成员方法独立于该类的任何对象。

被类所有的实例所共享。

当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例对象共用同一个static变量。这也就是说不管创建多少对象,static修饰的变量只占有一块内存。

1、静态成员变量:
声明为static关键词修饰的变量叫做静态成员变量,也叫全局变量。
静态成员变量的访问方式:

(1)直接通过类名调用类的静态成员变量:

    类名.静态成员变量名

(2)通过对象名调用类的静态成员变量:

    对象名.静态成员变量名
当成员变量需要在类的实例对象间共享时,使用static修饰成员变量,极为方便。

2、静态成员方法:

声明为static关键词修饰的方法叫做静态成员方法。例如:作为Java应用程序入口的main成员方法就是一个静态成员方法。

静态成员变量的访问方式:
(1)通过类名调用类的静态成员方法:

    类名.静态成员方法名(成员方法调用参数列表)

(2)通过实例对象名调用类的静态成员方法:

    对象.静态成员方法名(成员方法调用参数列表)
在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。

应用实例:


public class MyBook {

    //声明非静态成员变量 书名
    public String book_name ;   

    //声明静态成员变量,为类的所有实例所共享
    public static int book_number;

    //构造函数
    public MyBook(String book_name){
        this.book_name=book_name;
        book_number++;
    }

    public void print_book_name(){
        System.out.println("新买了一本书:"+this.book_name);
    }

    //静态成员方法,只能直接调用同类中其他的静态成员
    public static void print_book_number(){

        System.out.println(MyBook.book_number);
    }

    //main方法也是一个静态成员方法
    public static void main(String args[]){

        //new一本书“三体”
        MyBook book_1 = new MyBook("三体");

        MyBook book_2 = new MyBook("Java程序设计");

        //控制台打印第一本书的名字
        book_1.print_book_name();
        //控制台打印第二本书的名字
        book_2.print_book_name();

        //book_number为类的实例对象所共有

        //打印类对象的静态成员变量
        System.out.println("MyBook类中静态成员变量的值为:");
        MyBook.print_book_number();

        //打印book_1中静态成员变量
        System.out.println("book_1中静态成员变量的值为:");
        book_1.print_book_number();

        //打印book_2中静态成员变量
        System.out.println("book_2中静态成员变量的值为:");
        book_2.print_book_number();
    }

}

这里写图片描述

所以,当一个数据需要给同一类的所有对象使用时,需要用static修饰。
  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
静态方法确实不能直接访问非静态成员变量和非静态成员方法,因为非静态成员变量和非静态成员方法是与对象实例相关联的,需要通过对象实例才能访问。而静态方法属于任何一个特定的对象实例,它属于整个类,所以无法直接访问非静态成员。 但是,静态方法可以通过创建对象实例来访问非静态成员变量和非静态成员方法。这是因为在创建对象实例时,非静态成员变量和非静态成员方法会被分配内存,成为该对象实例的一部分,因此静态方法就可以通过对象实例访问它们。 另外需要注意的是,静态方法可以被类直接调用,不需要先创建对象实例。但是在静态方法使用new操作符动态分配内存时,生成的对象实例依然是非静态成员,需要通过对象实例来访问。例如: ```cpp class Example { public: static void foo() { int x = obj.x_; // 可以通过对象实例来访问非静态成员变量 obj.bar(); // 可以通过对象实例来调用非静态成员方法 Example* p = new Example; // 静态方法中可以使用new操作符动态分配内存 p->y_ = 10; // 需要通过对象实例访问非静态成员变量 p->baz(); // 需要通过对象实例调用非静态成员方法 } private: int x_; int y_; void bar(); void baz(); static Example obj; }; Example Example::obj; // 静态成员变量需要在类外部进行定义 int main() { Example::foo(); // 可以直接调用静态方法 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值