static关键字
一.static修饰的成员变量
static修饰的成员变量被称为静态变量,又被称为类变量,它不再隶属于对象层级而是隶属于类层级。静态变量的使用类名.变量名调用。如下所示:
package com.pyi.blog;
public class Static1 {
private String name;
private int age;
String nationality;
public Static1(String name ,int age,String nationality){
this.name=name;
this.age=age;
this.nationality=nationality;
}
public Static1(){
}
public void setName(String Name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
package com.pyi.blog;
public class StaticTest {
public static void main(String[] args) {
Static1 s1=new Static1("小明",10,"中国");
Static1 s2=new Static1("小红",11,"中国");
}
}
从上面的代码可以看出s1,s2两个对象有一个共有的属性国籍。在创建这里两个对象是会在堆中分别为它们的国籍分配内存储存,此时它们的国籍的成员变量是隶属于对象层级的,是两个对象所独立拥有的,内存图如下:
从上面这段代码可以看出在堆中分别为两个对象的国籍成员变量分配了内存储存,这样会造成内存的浪费。因此可以将private String nationality;
改为private static String nationality;
,此时内存图如下:
此时国籍不再为两个对象独有一份的,而变为了两个对象所共享的一份。
调用静态变量使用类名.变量名:
package com.pyi.blog;
public class Static1 {
private String name;
private int age;
static String nationality="中国";
public Static1(String name ,int age){
this.name=name;
this.age=age;
}
public Static1(){
}
public void setName(String Name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
}
package com.pyi.blog;
public class StaticTest {
public static void main(String[] args) {
System.out.println(Static1.nationality);
}
}
此时没有创建对象也可调用国籍成员变量。
若s1改变国籍,则s2也会收到影响:
二.static修饰的成员方法
用static修饰的成员方法被称为静态方法,又被称为类方法,同静态变量一样,它隶属于类层级。用类名.方法名调用。示例如下:
package com.pyi.blog;
public class Static1 {
private String name;
private int age;
static String nationality="中国";
public Static1(String name ,int age){
this.name=name;
this.age=age;
}
public Static1(){
}
public void setName(String Name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
public static void print(){
System.out.println("静态方法被调用");
}
}
package com.pyi.blog;
public class StaticTest {
public static void main(String[] args) {
Static1.print();
}
}
静态方法在类加载的时候被执行。
三.static修饰的代码块
static 修饰的代码块被称为静态代码块。它在第一次类加载的时候被执行。示例如下:
package com.pyi.blog;
public class Static1 {
private String name;
private int age;
static String nationality="中国";
public Static1(String name ,int age){
this.name=name;
this.age=age;
}
public Static1(){
}
public void setName(String Name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
static {
System.out.println("静态方法被调用");
}
}
package com.pyi.blog;
public class StaticTest {
public static void main(String[] args) {
Static1 s1=new Static1();
}
}
四.静态导包
静态导包可将类中的所有类方法直接导入。此时不需要使用类名,直接使用方法名即可调用该静态方法。示例如下:
package com.pyi.blog;
public class Static1 {
private String name;
private int age;
static String nationality="中国";
public Static1(String name ,int age){
this.name=name;
this.age=age;
}
public Static1(){
}
public void setName(String Name){
this.name=name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
public static void print(){
System.out.println("静态方法被调用");
}
}
package com.pyi.blog;
import static com.pyi.blog.Static1.*;
public class StaticTest {
public static void main(String[] args) {
print();
}
}