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静态属 ...
随机推荐
- 【转】Linux下的磁盘分区方法
转自:https://www.cnblogs.com/lbole/p/8904298.html 一.硬盘接口类型 硬盘的接口主要有IDE.SATA.SCSI .SAS和光纤通道等五种类型.其中IDE和 ...
- IsDate(expression)函数
IsDate 函数 返回 Boolean 值指明某表达式是否可以转换为日期. IsDate(expression) expression 参数可以是任意可被识别为日期和时间的日期表达式或字符串表达式. ...
- VB.net删除节点,数据库,文件
Private Sub mnuDel_Click()'删除节点Dim sKey As String'Dim sFile As StringDim oFS As FileSystemObjectDim ...
- django + celery的队列,路由与弹性
#celery_app.py #!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import absolute_import ...
- namenode和datanode的高可用性和故障处理
一.Hadoop单点故障问题如何解决 Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的Nam ...
- DUBBO原理、应用与面经总结
研读dubbo源码已经有一段时间了,dubbo中有非常多优秀的设计模式和示例代码值得学习,但是dubbo的调用层级和方法链都较为繁杂,如果不对源码思路进行梳理则很容易忘却,因此总结一篇研读心得,从阅读 ...
- 对拍程序 x
一.介绍 在做题或者正式比赛过程中总会把水题做水做乱,但因为样例有坑所以直接过了样例,然后拿去评测结果发现全WA.那如何在这种情况下检查自己程序或算法的正确性呢?对拍是一个简便省事的方案. 所谓“对拍 ...
- 01 Netty是什么?
01 Netty是什么? IO编程 我们简化下场景:客户端每隔两秒发送一个带有时间戳的 "hello world" 给服务端,服务端收到之后打印. 为了方便演示,下面例子中,服务端 ...
- Ubuntu 14.04 DNS 丢失 | 中文输入法配置 (转载)
1)彻底解决Ubuntu 14.04 重启后DNS配置丢失的问题: http://www.tuicool.com/articles/RVZn2y 2)Ubuntu 14.04中文输入法的安装 ht ...
- 小程序cover-view
cover-view包裹的元素设置定位,元素内容长短会影响cover-view的位置,即使设置的left,top一致 最佳解决方法,就是给cover-view设置宽度