static定义属性

static关键字在Java程序开发过程中主要进行属性和方法的定义。

 

static 定义属性:

  类中的最主要的组成就是属性和方法,那么在说static之前,先看看一下问题:

范例:定义一个描述球的信息类:

 class Ball{
private String classify;
private double price;
private String brand;
public Ball(String classify,double price,String brand){
this.classify = classify;
this.price = price;
this.brand = brand;
}
public void getInfo(){
System.out.println("球的类型:"+this.classify+"、价格:"+this.price+"、品牌:"+this.brand);
}
}
public class Demo1{
public static void main(String[] args) {
Ball basketball = new Ball("篮球",100,"李宁");
Ball football = new Ball("足球",101,"李宁");
Ball pingpang = new Ball("乒乓球",99,"李宁");
basketball.getInfo();
football.getInfo();
pingpang.getInfo();
}
}

运行结果:

球的类型:篮球、价格:100.0、品牌:李宁
球的类型:足球、价格:101.0、品牌:李宁
球的类型:乒乓球、价格:99.0、品牌:李宁


当前的程序在Ball类里面定义有三个属性,这样就意味着每一个对象都拥有三个属性的内容,所以此时内存关系如下:

 

 

 

 


假设若有一天李宁品牌要被更换,且都要换为“姚明”球;
在这个场景下,若已经产生50W个球类,最终就需要修改50W次的brand属性。

package Staticmethod;
class Ball{
private String classify;
private double price;
public String brand;
public Ball(String classify,double price,String brand){
this.classify = classify;
this.price = price;
this.brand = brand;
}
public String getInfo(){
return "球的类型:"+this.classify+"、价格:"+this.price+"、品牌:"+this.brand;
}
}
public class Demo1{
public static void main(String[] args) {
Ball basketball = new Ball("篮球",100,"李宁");
Ball football = new Ball("足球",101,"李宁");
Ball pingpang = new Ball("乒乓球",99,"李宁");
basketball.brand = "姚明"; //修改品牌
System.out.println(basketball.getInfo());
System.out.println(football.getInfo());
System.out.println(pingpang.getInfo());
}
}

运行结果:
球的类型:篮球、价格:100.0、品牌:姚明
球的类型:足球、价格:101.0、品牌:李宁
球的类型:乒乓球、价格:99.0、品牌:李宁

 

 

现在所有所定义的属性都是普通的属性,那么这些属性在进行内存空间分配的时候都会将各自的属性内容保存在各自的堆内存的空间之中,然而对品牌这一概念,很明显应该是一个公共的属性,所以此时最好使用static来定义,即static 可以来定义公共属性,所有对象都拥有并且修改此公共属性的能力。

范例:

 

  class Ball{
private String classify;
private double price;
static String brand;
public Ball(String classify,double price,String brand){
this.classify = classify;
this.price = price;
this.brand = brand;
}
public String getInfo(){
return "球的类型:"+this.classify+"、价格:"+this.price+"、品牌:"+this.brand;
}
}
public class Demo1{
public static void main(String[] args) {
Ball basketball = new Ball("篮球",100,"李宁");
Ball football = new Ball("足球",101,"李宁");
Ball pingpang = new Ball("乒乓球",99,"李宁");
basketball.brand = "姚明";
System.out.println(basketball.getInfo());
System.out.println(football.getInfo());
System.out.println(pingpang.getInfo());
}
}

  

运行结果:

球的类型:篮球、价格:100.0、品牌:姚明
球的类型:足球、价格:101.0、品牌:姚明
球的类型:乒乓球、价格:99.0、品牌:姚明

此时发现,Ball 类之中 brand 属性追加了一个 static 关键字之后,只是用一个实例化对象修改了 brand 属性内容后,所有对象的brand属性的相关内容全部改变。那么可以得出,static就是公共属性,此时的内存关系如图所示:


 

既然现在brand属于类中的公共属性,那么此时就要考虑一个问题,公共属性可能由一个对象直接修改吗?

实例化对象直接进行static 属性访问并不严格,所以对static 的访问从实际的开发来讲都建议通过类名称直接调

用。

 

范例:

通过类名称访问 static:

  class Ball{
private String classify;
private double price;
static String brand;
public Ball(String classify,double price,String brand){
this.classify = classify;
this.price = price;
this.brand = brand;
}
public String getInfo(){
return "球的类型:"+this.classify+"、价格:"+this.price+"、品牌:"+this.brand;
}
}
public class Demo1{
public static void main(String[] args) {
Ball basketball = new Ball("篮球",100,"李宁");
Ball football = new Ball("足球",101,"李宁");
Ball pingpang = new Ball("乒乓球",99,"李宁");
//直接通过类名称访问 Ball 类中定义的 static 属性。
Ball.brand = "姚明";
System.out.println(basketball.getInfo());
System.out.println(football.getInfo());
System.out.println(pingpang.getInfo());
}
}

运行结果:

 球的类型:篮球、价格:100.0、品牌:姚明

球的类型:足球、价格:101.0、品牌:姚明

球的类型:乒乓球、价格:99.0、品牌:姚明

 

另外需要提醒的是 static 属性虽然定义在类之中,但是并不受到实例化对象的限制,所有类中非 static 属性(普通属性) 都需要在类对象实例化的之后才会分配有相应的堆内存空间,才可以进行访问。但static 可以在未进行实例化对象的情况下,直接通过类名称来访问。

 

范例:

static 直接访问:

 

 class Ball{
private String classify;
private double price;
static String brand;
public Ball(String classify,double price){
this.classify = classify;
this.price = price;
}
public String getInfo(){
return "球的类型:"+this.classify+"、价格:"+this.price+"、品牌:"+this.brand;
}
}
public class Demo1{
public static void main(String[] args) {
Ball.brand = "姚明"; //没有实例化对象
System.out.println(Ball.brand);
Ball basketball = new Ball("篮球",100);
System.out.println(basketball.getInfo());
}
}

 

运行结果:

姚明
球的类型:篮球、价格:100.0、品牌:姚明

   在以后编写类中首先要考虑非 static 属性,只有在描述公共(所有实例化对象均拥有的属性)的属性才会考虑static 属性。

posted on 2019-12-08 09:19  Creepooo  阅读(570)  评论(0)    收藏  举报