文章目录
- 1.static关键字
-
- 为何会引入这个static 变量?
- final 和 static 的区别
- static 修饰方法
1.static关键字 看见static,本能反应,和对象无关
static可以修饰的类型:
- 【Java基础|Java 类和对象详解(二)——static关键字】修饰属性:类属性,类变量
- 修饰方法:类方法,工具方法
- static 修饰代码块,静态代码块
- static 修饰内部类,静态内部类
static 修饰的属性称为类属性,类变量,所有对象共享为何会引入这个static 变量? 请先看如下代码:
public class ClassTest {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
person1.name = "老八";
person1.country = "China";
person2.name = "安倍";
person2.country = "Japan";
person1.print();
person2.print();
}
}
class Person {
String name;
int age;
String sex;
String country;
void print() {
System.out.println("name: " + name + ",country: " + country);
}
}
比如Person类的成员变量country,所有对象都在堆中保有自己的country属性。
很多对象的这个值都是同一个值,比如中国人的所有对象属性 country = “China”。
假设有一天,咱们英勇的解放jun光复了某岛国,所有岛国人的 country 属性都得改为China。一个一个去改,就会很麻烦。所以有了解决办法,就是在 country 属性前面加上 static 关键字。
例如:
static String country;
对于country这个值来说,他应该是很多个对象共有的一个属性,使用static修饰这个属性,该属性就称为静态属性。
当一个实例变量被 static关键字修饰时,他就表示类的属性,该类的所以对象共享这个属性,所有对象的这个属性都一样。static修饰的属性在JVM方法区中存储。
static修饰的属性,直接通过类名就能访问,无需通过对象访问。
例:
class Person {
String name;
int age;
String sex;
static String country = "China";
void print() {
System.out.println("name: " + name + ",country: " + country);
}
}
public class ClassTest {
public static void main(String[] args) {
Person person1 = new Person();
Person person2 = new Person();
person1.name = "老八";
System.out.println(person1.country);
person2.name = "安倍";
System.out.println(person2.country);
person1.print();
person2.print();
}
}
? 输出结果:
//China
//China
//name: 老八,country: China
//name: 安倍,country: China
调用new Person()来产生Person的对象,先要有Person类才能产生对象。下面从程序内存图直观了解执行过程
首先将Person类加载到内存中。Person中的所有static变量就会被加载到方法区中。
文章图片
文章图片
在Java中,能否在方法内部定义一个static变量?
答案是不能!!!final 和 static 的区别 例如下列代码:
因为方法中定义的变量是局部变量,局部变量在栈中存储,而static定义的变量在方法区中存储。不可能一个属性既在栈中存储,又在方法区中存储!!!
class Person{
final int age = 18;
static String country = "China";
}
final 是成员常量,在堆中存储,age这个属性,在类定义的时候就赋值为18了。
static 定义的是静态变量,在方法区中存储,所有Person类的对象共享这个country属性。
Person的所有对象都有age属性,且值都是18。
那么问题来了,为什么不把age定义为 static final,所有Person的对象都共享这个属性,且全局唯一?
答:总结:
在类中定义常量,一般使用全局常量,由static final 共同修饰。
常量的命名规则:
所有单词全部大写,多个单词间使用下划线分隔。
static final String STUDENT_SCHOOL = “清华大学”;
a. static变量称为类属性,在方法区中存储,该类的所有对象共享此变量。
b. 若在类中定义了常量(定义式赋值),一般我们使用static final 共同修饰,称为全局常量。
c.要使用类属性(static属性称为类属性,通过类名称直接访问,此时没有对象也能调用,包含该类的null引用),我们通常使用 类名称.属性名称 ,不推荐使用对象来访问类属性,不规范。
static 修饰方法 static修饰的方法也是通过类名称直接访问,没有对象就能访问。
提出问题:
1.为啥主方法是个静态方法?
主方法是一个程序的入口,如果主方法是个成员方法,要通过对象调用。2.静态方法能否访问成员变量和成员方法?
入口都没有,从哪里产生对象???
程序从主方法开始执行,所以主方法要能直接调用起来,静态方法就能直接调用,无需产生对象~~
在静态方法中只能调用静态方法或者静态属性,static家族之间可以相互调用,不能直接调用成员方法或者成员属性,必须通过对象来调用。3.成员方法能否访问静态变量和静态方法?
在成员方法中既可以调用成员方法和成员变量,也可以调用静态方法(此时都已经产生了该类对象,一定可以访问静态域)。4.普通的类能否用static关键字修饰?(不是内部类)
不能!!!总结:
类定义出来就是要产生对象,若用static修饰,没有对象也能访问,那为什么还有要定义一个类呢???
看见static修饰的属性,都和对象无关,直接通过类名称就能访问静态属性和方法。未完待续…
一般工具类的方法设计为 static 方法:
如 :
Arrays.sory();
Arrays.copyOf();
都是Arrays类提供的操作数组的方法,设计为 static 方法。
推荐阅读
- 深入理解java虚拟机|自动内存管理机制
- Java基础|Java 类和对象详解 (一)
- IO流|IO流原理及流的分类FileInputStream类和FileOutputStream类基本介绍
- java|java 调用电脑摄像头
- java|成本节省 50%,10 人团队使用函数计算开发 wolai 在线文档应用
- xml|Android Studio如何更改app名称
- (精品)基于java ssm mysql疫情论坛平台系统含lw文档
- 软件开发人员怎么升职加薪(技术高管建议你这么做)
- 人工智能|对标GPT-3、AlphaFold,智源研究院发布超大规模智能模型系统“悟道1.0”