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 属性。

static定义属性的更多相关文章

  1. Java基础知识整理之static修饰属性

    static 关键字,我们在开发用的还是比较多的.在<Java编程思想>有下面一段话 static 方法就是没有 this 的方法.在 static 方法内部不能调用非静态方法,反过来是可 ...

  2. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  3. (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状;2.定义构造方法,给形状赋值;3.定义两个抽象方法:计算面积和计算周长;4.定义一个显示方法:显示图像形状,周长,面积;

    题目显示不全,完整题目描述: (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状:2.定义构造方法,给形状赋值:3.定义两个抽象方法:计算面积和计算周长:4.定义一个显示方法:显示图像 ...

  4. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  5. Html5 dataset--自定义属性

    dataset--自定义属性 HTMLElement.dataset data-*属性集 元素上保存数据 <div id="user" data-id="12345 ...

  6. php面向对象中static静态属性和静态方法的调用

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态 ...

  7. [C/C++]在头文件中使用static定义变量意味着什么

    文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...

  8. Android自己定义控件而且使其能够在xml中自己定义属性

    为什么要自己定义View android开发中自己定义View的优点是显而易见的.比方说以下的这个顶部导航,它被设计出如今应用的每一个界面,但每次的内容却不尽同样.我们不能在每一个layout资源中都 ...

  9. static静态属性和静态方法的原理与调用技巧

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下     本文实例讲述了php中static静态属 ...

随机推荐

  1. 搭建jumperserver堡垒机管理万台服务器-2

    搭建jumperserver堡垒机管理万台服务器-2 1  Jumpserver堡垒机概述-部署Jumpserver运行环境 2  安装Coco组件 3  安装Web-Terminal前端-Luna组 ...

  2. Linux日常之显示文件总结

    1. 将文件file1.file2的内容都显示出来,并显示行号 cat -n file1 file2 2. 将文件file1.file2中带有字符'h'的行显示出来 cat -n file1 file ...

  3. BZOJ1896 Equations 线性规划+半平面交+三分

    题意简述 给你\(3\)个数组\(a_i\),\(b_i\)和\(c_i\),让你维护一个数组\(x_i\),共\(m\)组询问,每次给定两个数\(s\),\(t\),使得 \[ \sum_i a_i ...

  4. wepy-数据双向绑定input

    初入wepy,发现wepy和vue神似,但还是有不一样的地方,例如v-model数据双向绑定 场景: 一个input搜索框,用户输入内容,点击“叉叉”按钮,输入的内容全部清空,这是一个很常见的场景 j ...

  5. 基于python3环境下搭建Robot Framework 自动化测试框架(一)

    大家都知道,Robot Framework 是基于python2 环境 的一套自动化测试工具,据说python 2 到2020年不维护,现在用python 3 的环境搭建Robot Framework ...

  6. margin与padding的区别是什么?

    margin与padding的区别是什么? 目录 1.背景介绍 2.知识剖析 3.常见问题 4.解决方案 5.编码实战 6.扩展思考 7.参考文献 8.更多讨论 1.背景介绍 什么是margin 什么 ...

  7. 接口返回[object,Object]解决方法

    1.我们请求接口时有时会返回[object,Object],[object,Object],[object,Object].... 这个我们使用JSON.stringfity(data),就可以解决.

  8. asp.net实现大视频上传

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  9. POJ 2112 Optimal Milking ( 经典最大流 && Floyd && 二分 )

    题意 : 有 K 台挤奶机器,每台机器可以接受 M 头牛进行挤奶作业,总共有 C 头奶牛,机器编号为 1~K,奶牛编号为 K+1 ~ K+C ,然后给出奶牛和机器之间的距离矩阵,要求求出使得每头牛都能 ...

  10. POJ Knight Moves 2243 x

    Knight Moves Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13974   Accepted: 7797 Des ...