Java基础|Java 类和对象详解(二)——static关键字


文章目录

  • 1.static关键字
    • 为何会引入这个static 变量?
    • final 和 static 的区别
    • static 修饰方法

1.static关键字 看见static,本能反应,和对象无关
static可以修饰的类型:
  1. 【Java基础|Java 类和对象详解(二)——static关键字】修饰属性:类属性,类变量
  2. 修饰方法:类方法,工具方法
  3. static 修饰代码块,静态代码块
  4. 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基础|Java 类和对象详解(二)——static关键字
文章图片

Java基础|Java 类和对象详解(二)——static关键字
文章图片

在Java中,能否在方法内部定义一个static变量?
答案是不能!!!
因为方法中定义的变量是局部变量,局部变量在栈中存储,而static定义的变量在方法区中存储。不可能一个属性既在栈中存储,又在方法区中存储!!!
final 和 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 方法。
未完待续…

    推荐阅读