版权声明:如需转载,请注明出处 https://blog.csdn.net/baidu_41813368/article/details/84198169
static类属性
下面是一个普通的实例化对象
public class Car{
//属性
private String brand;
String color;
private String num;
public Car(String brand,String color,String num){
this.brand = brand;
this.color = color;
this.num = num;
}
//方法
String carInfo(){
System.out.println(this);//打印当前对象的标识符
return " 品牌: "+brand+" 颜色: "+color+" 车牌号: "+num;
}
String getBrand(){
return brand;
}
String getNum(){
return num;
}
public void setBrand(String b){
brand=b;
}
public void setNum(String n){
num=n;
}
}
public class Test1{
public static void main(String[] args){
Car car1 = new Car("宝马","白色","1235");
Car car2 = new Car("奔驰","黑色","1111");
System.out.println(car1.carInfo());
System.out.println(car2.carInfo());
}
}
当我们在new一个新的对象时,在内存中是这样开辟的
从上图中可以看出new一个新的对象的时候,给每个新的对象在堆中都开辟了独立的内存
假设车又新增加了一个属性:车型
static String type = "越野"
在实例化对象时,内存是这样开辟的
当在一个类的属性前面加上static这个关键字,那么这个属性就变成了类属性,这个属性是属于这个类的,而不是将要创建的对象,保存到全局数据区的内存之中,所有对象都可以进行该数据区的访问,每一个由这个类创建的对象,访问这个属性,是访问同一块内存区的,共享这个属性,
那么该如何访问这个类属性呢?
static修饰的这个属性是属于类的,要访问这个类属性,可以不使用这个类创建的对象来使用这个类属性,直接使用类名来访问,(类名.属性)
所有的非static属性(实例变量)必须在对象实例化后使用,而static属性(类属性)不受对象实例化的控制
此时,我们修改type的属性,所有对象都同步此属性值:
Car.type = "小轿车"
static类方法
通过static类属性,我们可以延伸到static类方法,使用static修饰的方法,可以直接通过类名称访问
public class Car{
//属性
private String brand;
String color;
private String num;
private static String type;//类属性
//构造方法(创建对象)
public Car(String brand,String color,String num){
this.color = color;
this.num = num;
this.num = num;
}
//方法
String carInfo(){
System.out.println(this);//打印当前对象的标识符
return " 品牌: "+brand+" 颜色: "+color+" 车牌号: "+num+" 车型:"+type;
}
String getBrand(){
return brand;
}
String getNum(){
return num;
}
public void setBrand(String b){
brand=b;
}
public void setNum(String n){
num=n;
}
//类方法
public static void setType(String m){
type = m;
}
}
public class Test1{
public static void main(String[] args){
Car car1 = new Car("宝马","黑色","1235");
Car car2 = new Car("奔驰","黑色","1111");
Car.setType("越野");//通过类名称访问类方法
System.out.println(car1.carInfo());
System.out.println(car2.carInfo());
}
}
注意:
- 静态方法不允许访问非静态定义的属性或方法
- 所有的非静态方法允许访问静态方法或属性 使用static定义方法只有一个目的
- 某些方法不希望受到对象的控制,即可以在没有实例化对象的时候执行(广泛存在于工具类中)。
为什么main方法要定义成静态的?
扫描二维码关注公众号,回复:
4324657 查看本文章
1.正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。
2.静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。
3.main方法要通过java命令来执行,如果不是静态的话要准备一个对象,没有对象要调用方法就不行。