第三章—static关键字
原来在一个类中的成员变量,每new一个对象就有一份

对于static成员变量来说,这个成员变量只有一份,而且这一份是这个类中所有的对象共享

Static成员变量分配在data seg中(静态变量存放在数据区)

当某一个Cat对象被new出来时,数据区里面有一个变量sid

Id 和 name为非静态成员变量(每个对象单独一份)

静态变量(Static)只有一份不管new多少个对象,没有new对象在data seg中也同样保存一份

静态变量属于整个类的不属于单个对象(不属于专门的某个对象)

怎么对静态变量的值访问呢?

1、任何一个对象都可以访问这个静态的值,访问的时候访问的都是同一块内存

2、即便没有对象也可以访问这个值,用 类名 + . 访问

某一个类名 + . 后面有一个东西(一定是静态的)
System为类名
System.out后面的out是静态的变量

Cat.sid = 100; 执行这个代码时
第三章—static关键字

Cat mimi = new Cat(“mimi”);
(“mimi”)字符串常量分配在data seg中
字符串也是一种引用类型,字符串也是一个对象
形参name分配一个空间在栈内存中,然后吧mimi这个字符串传递给name,相当于把mimi这个对象的引用交给name里,所以name指向mimi
第三章—static关键字

构造方法完成时
第三章—static关键字

执行下面的代码
Cat pipi = new Cat(“pipi”);
第三章—static关键字

Cat mimi = new Cat(“mimi”);
Cat(String name) {
// TODO Auto-generated constructor stub
this.name = name;
id = sid++;
}
执行上面代码的 this.name = name;
id = sid++;
时如下图 id为100 sid为 101
第三章—static关键字

Cat mimi = new Cat(“pipi”);
Cat(String name) {
// TODO Auto-generated constructor stub
this.name = name;
id = sid++;
}
执行上面代码的 this.name = name;
id = sid++;
时如下图 id为101 sid为 102
第三章—static关键字

Sid为基础类型,占一块内存,没有引用

静态变量能够计数用,每当new一个对象是可以为其计数,自动往上加

private static int sid = 0;没有static时Cat.sid = 100;会出错
(因为现在sid是专门属于某一个对象,只有new一个对象出来这个对象才有sid,如果不new任何对象sid是不存在的)所以注释掉Cat.sid = 100;
第三章—static关键字
第三章—static关键字

当private static int sid = 0;没有static时画图如下:
第三章—static关键字
第三章—static关键字

id = 9;
写在main方法里会报错因为:main方法是静态方法不需要new对象就可以执行了,但是id是非静态变量需要new对象才可以访问(无法直接访问)

方法是针对某一个对象来调用的

动态方法针对某一个对象来调用的

静态方法不是针对某一个对象来调用的(没有对象也可以调用)

例如:(类名 )Cat.+静态方法

所以正因如此:在static方法里头不能访问非static成员
在main方法里访问不了非静态的变量、访问不了非静态方法
非静态方法针对某一个对象来调用的,没这个对象怎么调用

Sid一定是放在堆内存,sid是一个类的成员变量

成员变量只有在new出来的时候才在堆内存里分配,new出这个对象来才分配

静态方法不能够访问非静态成员,静态的方法不再是针对某个对象来调用,所以不能访问非静态成员,非静态成员专属于某一个对象,想访问非静态成员必须new一个对象出来

可以通过以下访问静态成员
第三章—static关键字
第三章—static关键字
也可以new出一个对象来调用
第三章—static关键字
Pipi最后访问sid是2000

相关文章:

  • 2021-12-08
  • 2021-08-13
  • 2021-05-01
  • 2021-11-21
  • 2021-07-12
猜你喜欢
  • 2022-01-22
  • 2021-11-09
  • 2022-12-23
  • 2021-06-12
  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
相关资源
相似解决方案