13static关键字(java)
Posted mrchengs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13static关键字(java)相关的知识,希望对你有一定的参考价值。
static成员变量:
Java类提供了两种类型的变量:用static关键字修饰的静态变量和不用static关键字修饰的实例变量。静态变量属于类,在内存中只有一个复制,只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别是“类.静态变量"和”对象.静态变量"
实例变量属于对象,只有对象被创建后,实例变量才会被分配内存空间,才能被使用,它在内存中存在多个复制,只有用“对象.实例变量”的方式来引用。
多个复制:从最开始加载(存在方法区),别实例化(存在堆中),被调用(存在栈中)
static成员方法:
Java中提供了static方法和非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用
static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用时,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量
静态与非静态的区别:
非静态成员变量又称为实例变量。
静态成员变量又称为类变量。
非静态成员变量,随着对象的创建而存在,随着对象的消失而消失。
静态成员变量,随着类的加载而存在,随着类的消失而消失。
非静态变量存在于对象堆内存中。
静态变量存在于方法区中。
非静态变量只能被对象所调用。
静态变量可以被类名调用,也可以被对象调用。
/////////////////////
public class Chinese {
private static String country;
private String name;
private int age;
public Chinese(String country, String name, int age) {
super();
this.country = country;
this.name = name;
this.age = age;
}
public Chinese() {
super();
// TODO Auto-generated constructor stub
}
@Override
public String toString() {
return "Chinese [country=" + country + ", name=" + name + ", age=" + age + "]";
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/////////////////////
public class TestChinese {
public static void main(String[] args) {
Chinese c1 = new Chinese("唐", "小明", 12);
System.out.println(c1);
Chinese c2 = new Chinese("唐", "小明", 12);
System.out.println(c1);
System.out.println(c2);
}
}
///////////////////////////////
public class TestStatic {
//1.static 是一个关键字,用于修饰类成员(属性,方法,内部类)
//2.若访问权限允许的情况下,可以通过类名 . 的情况来访问,可以不创建对象
//3.static修饰的成员为类成员,为所有实例共享
//4.static方法内部只能访问类的static属性,不能访问非static属性
//5。因为不需要实例化就可以访问static属性和方法,因此不能用this在static内部
//6.静态代码块在初始化时执行一次,只执行一次
static String name;
int age;
static void test(){
//static修饰的内部类不能访问非static属性
//age = 1;//报错
name = "qwe";
}
static{
System.out.println("静态代码块");
}
void method(){
//可以访问非static和非static修饰的属性
age = 12;
name = "qwe";
}
public static void main(String[] args) {
//有无对象都可以直接访问static修饰的对象
TestStatic.name = "";
TestStatic.test();
TestStatic t = new TestStatic();
t.age = 12;
t.name = "qwe";
t.method();
System.out.println(t.name);
TestStatic t1 = new TestStatic();
//通过t的实例对象不许呀再次赋值
System.out.println(t1.name);
}
}
以上是关于13static关键字(java)的主要内容,如果未能解决你的问题,请参考以下文章
阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_13_静态static关键字修饰成员方法