一,使用static声明属性

class Person{    // 定义Person类
String name ; // 定义name属性,暂时不封装
int age ; // 定义age属性,暂时不封装
String country = "A城" ; // 定义城市属性,有默认值
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo01{
public static void main(String args[]){
Person p1 = new Person("张三",) ; // 实例化对象
Person p2 = new Person("李四",) ; // 实例化对象
Person p3 = new Person("王五",) ; // 实例化对象 p1.info() ;
p2.info() ;
p3.info() ;
}
};

以上代码确实实现了功能,但是如果此时城市名称不叫A城,改叫B城,如果已经产生了5000个对象,那么意味着要修改5000遍对象中

contry属性。

所以最好使用static关键字声明属性。

范例,使用static修改。

class Person{    // 定义Person类
String name ; // 定义name属性,暂时不封装
int age ; // 定义age属性,暂时不封装
static String country = "A城" ; // 定义城市属性,有默认值,static
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo02{
public static void main(String args[]){
Person p1 = new Person("张三",) ; // 实例化对象
Person p2 = new Person("李四",) ; // 实例化对象
Person p3 = new Person("王五",) ; // 实例化对象
System.out.println("--------------- 修改之前 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
p1.country = "B城" ; // 修改static属性
System.out.println("--------------- 修改之后 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
}
};

修改一个对象中的属性,则其他对象的属性全部改变,则证明此属性是所有对象共享的!

分析:这是内存分配图:

每一个对象拥有各种的堆空间,堆内存空间中,保存着各自的属性,

但是static属性是保存在全局数据区之中,所有的对象共同指向全局数据的一个内容。所以一个数据修改后,所有对象内容都会改变。

JAVA中到底有多少内存区域呢?

1)栈内存:可以保存对象的名称(保存,访问的堆内存地址)。

2)堆内存:保存每个对象的全局属性。

3)全局数据区:保存static类型的属性。

4)全局代码区:保存所有方法的定义。

但是也发现一些问题:一般调用static属性,最好使用类名称调用。

采用”类名称.属性“的形式调用。如上应该用Person.contry="B城";

既然可以用static声明属性,那么static也可以声明方法。

二,声明static方法。

如果一个方法使用了static关键字声明,那么此方法可以使用类名称调用。

下面将之前代码全部属性进行封装。

class Person{    // 定义Person类
private String name ; // 定义name属性,暂时不封装
private int age ; // 定义age属性,暂时不封装
private static String country = "A城" ; // 定义城市属性,有默认值,static
public static void setCountry(String c){ // 此方法可以直接由类名称调用
country = c ;
}
public static String getCountry(){
return country ;
}
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo04{
public static void main(String args[]){
Person p1 = new Person("张三",30) ; // 实例化对象
Person p2 = new Person("李四",31) ; // 实例化对象
Person p3 = new Person("王五",32) ; // 实例化对象
System.out.println("--------------- 修改之前 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
Person.setCountry("B城") ; // 调用静态方法修改static属性的内容
System.out.println("--------------- 修改之后 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
}
};

注意点:

使用static方法,不能调用非static属性或方法。(因为static属性和方法所修改的属性都是保存在共享数据区,而非static属性或方法是各自的堆内存数据区)

三,static的应用

1)从前面得知,static属性是所有对象共享的,那么就可以使用static属性统计一个类到底产生了多少对象。

因为每一个对象实例化都要调用构造方法,如果要进行统计,则直接在构造方法中增加一个static属性即可。

class Demo{    // 定义Person类
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 只要有对象产生就应该自增
System.out.println("产生了" + count + "个对象!") ;
}
};
public class StaticDemo06{
public static void main(String args[]){
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
}
};

2)可以使用static为对象进行自动的编名操作,此操作与上面方法非常类似。

class Demo{    // 定义Person类
private String name ; // 保存名字
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 有对象产生就自增
this.name = "DEMO-" + count ; // 自动进行编名操作
}
public Demo(String name){
this.name = name; // 可以通过构造赋值
}
public String getName(){ // 取得姓名
return this.name ;
}
};
public class StaticDemo07{
public static void main(String args[]){
System.out.println(new Demo().getName()) ;//使用了匿名对象。
System.out.println(new Demo("LXH").getName()) ;
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("MLDN").getName()) ;
System.out.println(new Demo().getName()) ;
}
};
运行结果:
DEMO-1
LXH
DEMO-2
MLDN
DEMO-3
      

此点在以后java中也会经常实现。

总结:

1)声明static属性与非static属性的区别。

2)使用类名可以直接调用static属性。

3)使用static方法,不能调用非static属性或方法。

static,静态关键字的详解的更多相关文章

  1. Java之Static静态修饰符详解

    Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...

  2. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  3. ES6 类(Class)基本用法和静态属性+方法详解

    原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...

  4. Java并发关键字Volatile 详解

    Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...

  5. (转)Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...

  6. Nginx静态服务配置---详解root和alias指令

    Nginx静态服务配置---详解root和alias指令 静态文件 Nginx以其高性能著称,常用与做前端反向代理服务器.同时nginx也是一个高性能的静态文件服务器.通常都会把应用的静态文件使用ng ...

  7. Java中static静态关键字的使用

    我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...

  8. php笔记(二)PHP类和对象之Static静态关键字

      PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...

  9. “全栈2019”Java第七十三章:外部类里多个静态非静态内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. Echarts图表控件使用总结2(Line,Bar)—问题篇

    Echarts图表控件使用总结1(Line,Bar):http://www.cnblogs.com/hanyinglong/p/Echarts.html 1.前言 a.前两天简单写了一篇在MVC中如何 ...

  2. VisualStudio中解决方案

    在VS中创建一个项目通常会生成一个解决方案文件(.sln)和一个隐藏的解决方案用户选项文件(.suo). 解决方案文件是一个文本文件,包含以下信息: 将被加载的所有项目以构成完整解决方案的项目清单 解 ...

  3. 滴滴DSRC抢楼大赛,十一快车券飞起来

    十一马上就要到了 不管你想要去哪里 总少不了滴滴打车 DSRC为你准备了30份快车券 现在开始参与抢楼,就有机会得到 活动时间: 本帖发布之时起-9月30日12:00 参与方式: 关注微信公众号“滴滴 ...

  4. Mybatis学习记录(四)----resultMap的使用

    resultMap使用方法 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系. 1.定义resultMap 2.使用resultMap ...

  5. C#获取本地系统日期格式

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12 ...

  6. 解决SharePoint文档库文件在搜索结果页面显示的标题和文档的标题不一致问题(search result)

    问题表现: SharePoint 2013 爬网后,搜索一个文档,虽然搜到了,但是显示有点问题,如图: 原因分析: 造成该问题的原因是,该文档除了本身有一个名称外,在文档metadata的title属 ...

  7. Android 在内部存储读写文件

    文件读写操作* Ram内存:运行内存,相当于电脑的内存* Rom内存:内部存储空间,相当于电脑的硬盘* sd卡:外部存储空间,相当于电脑的移动硬盘在内部存储空间中读写文件>小案例:用户输入账号密 ...

  8. HTML5--Audio

    一.Audio标签 Web 上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规 ...

  9. UITableView小知识点总结

    1.UITableView去除空的cell,多余不用的 在viewdidload方法里加上这一句即可 self.tableView.tableFooterView = [[UIView alloc]  ...

  10. Android直方图递增View

    继上次分析实现Android自定义View之扇形图之后,自己又画了下面的这个递增直方图,本来是想做个静态的直方图就完了,结果想想静态的没啥趣味,于是就加了递增 1 从分析最终效果 界面上要展现的东西有 ...