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 属性。
static定义属性的更多相关文章
- Java基础知识整理之static修饰属性
static 关键字,我们在开发用的还是比较多的.在<Java编程思想>有下面一段话 static 方法就是没有 this 的方法.在 static 方法内部不能调用非静态方法,反过来是可 ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状;2.定义构造方法,给形状赋值;3.定义两个抽象方法:计算面积和计算周长;4.定义一个显示方法:显示图像形状,周长,面积;
题目显示不全,完整题目描述: (1)定义闭合图形抽象类ClosedFigure定义属性:1.形状:2.定义构造方法,给形状赋值:3.定义两个抽象方法:计算面积和计算周长:4.定义一个显示方法:显示图像 ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- Html5 dataset--自定义属性
dataset--自定义属性 HTMLElement.dataset data-*属性集 元素上保存数据 <div id="user" data-id="12345 ...
- php面向对象中static静态属性和静态方法的调用
这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态 ...
- [C/C++]在头文件中使用static定义变量意味着什么
文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...
- Android自己定义控件而且使其能够在xml中自己定义属性
为什么要自己定义View android开发中自己定义View的优点是显而易见的.比方说以下的这个顶部导航,它被设计出如今应用的每一个界面,但每次的内容却不尽同样.我们不能在每一个layout资源中都 ...
- static静态属性和静态方法的原理与调用技巧
这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属 ...
随机推荐
- Cacti+nagios 整合监控部署文档
目录 Cacti+nagios监控部署步骤... 2 一.Cacti安装... 2 1需要安装的依赖软件包:... 2 2安装rrdtool 2 3启动数据库和httpd服务... 3 4将serve ...
- Git之旅(1):安装git
一.在windows中安装git git官网:https://git-scm.com/downloads 二.在centos系统安装git 2.1 配置base源和epel源 # cat /etc/y ...
- snmpwalk工具使用
snmpwalk是SNMP的一个工具,它使用SNMP的GETNEXT请求查询指定OID(SNMP协议中的对象标识)入口的所有OID树信息,并显示给用户. 在linux下使用snmpwalk工具,我们 ...
- SSM常用配置文件头模板
web.xml文件头 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...
- POJ2942 UVA1364 Knights of the Round Table 圆桌骑士
POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...
- pycharm快捷键的使用、内存管理、变量、数据类型、注释相关笔记
目录 pycharm快捷键的使用 变量 python内存管理 小整数池 引用计数 垃圾回收机制 循环引用 变量的三种打印形式 数字类型 字符串 注释 pycharm快捷键的使用 ctrl+c复制,默认 ...
- SPOJ 2798 QTREE3 - Query on a tree again!
原oj题面 Time limit 2000 ms Memory limit 1572864 kB Code length Limit 50000 B OS Linux Language limit A ...
- R 文件读写
Write.table()函数的用法read.table()非常相似,只不过它把数据框写入文件而不是从文件中读取.参数和选项: write.table(x, file = "", ...
- spring学习笔记之---JDBC Template
JDBC Template(简化持久化操作) (一)创建项目 (1)Maven配置 <dependencies> <dependency> <groupId>ju ...
- TestingWhiz社区版2013版下载地址
TestingWhiz社区版 https://sourceforge.net/projects/testingwhiz-community-edition/ https://sourceforge.n ...