Java的面向对象
15-static关键字
2021-07-06 925 0
简介 static关键字可以修饰属性、方法、代码块、内部类等结构...
1. static修饰属性
当我们编写一个类时,其实就是在描述该类的对象的属性和行为,而此时并没有产生实质上的对象,只有通过new关键字才会产生对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用。
我们有时候希望无论是否产生了对象或无论产生了多少对象,某些特定的数据在内存空间里只有一份,例如所有的中国人都有个国家名称,每一个中国人都共享这个国家名称,不必在每一个中国人的实例对象中都对国家名称赋值。
static关键字的使用
static,翻译成中文是静态的,该关键字可以用来修饰属性、方法、代码块、内部类
属性,按是否使用static修饰,又分为静态属性和非静态属性(实例变量)
非静态属性(实例变量):我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态属性(或类变量):使用static修饰属性,我们创建了类的多个对象,多个对象共享静态属性。当通过某一个对象修改静态属性时,其他对象的此静态属性也被修改。类中static修饰的属性是属于类的,所有该类的对象共享。
static修饰属性的其他说明:
① 静态属性随着类的加载而加载。可以通过"类.属性名"的方式进行调用
② 静态属性的加载要早于对象的创建。
③ 由于类只会加载一次,则静态属性在内存中也只会存在一份:存在方法区的静态域中。
静态属性举例:System.out; Math.PI;
//StaticTest.java package com.ylaihui.oop10; class Chinese{ static String nation; String name; int age; } public class StaticTest { public static void main(String[] args) { Chinese.nation = "中国"; Chinese c1 = new Chinese(); c1.name = "姚明"; c1.age = 40; Chinese c2 = new Chinese(); c2.name = "马龙"; c2.age = 30; c1.nation = "CH"; c2.nation = "CHINA"; System.out.println(c1.nation); //CHINA System.out.println(c2.nation); //CHINA } }
2. static修饰方法
使用static修饰方法称为静态方法
静态方法是随着类的加载而加载的,可以通过"类.静态方法"的方式进行调用
静态方法中,只能调用静态的方法或静态属性(很好理解,如果能调用非静态属性或非静态方法,如果还没有new对象,此时没有对象呢,要调用谁的呢?)
非静态方法中,既可以调用非静态的方法和非静态属性,也可以调用静态的方法和静态的属性
static注意点:
在静态的方法内,不能使用this关键字、super关键字 (同样的道理,此时还不一定有对象,谁是this?谁是super呢?)
如何确定一个属性是否要声明为static的?
属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
类中的常量也常常声明为static
如何确定一个方法是否要声明为static的?
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的。 比如:Math、Arrays、Collections