static,静态关键字的详解
一,使用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,静态关键字的详解的更多相关文章
- Java之Static静态修饰符详解
		
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
 - ava下static关键字用法详解
		
Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...
 - ES6 类(Class)基本用法和静态属性+方法详解
		
原文地址:http://blog.csdn.net/pcaxb/article/details/53759637 ES6 类(Class)基本用法和静态属性+方法详解 JavaScript语言的传统方 ...
 - Java并发关键字Volatile 详解
		
Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...
 - (转)Nginx静态服务配置---详解root和alias指令
		
Nginx静态服务配置---详解root和alias指令 原文:https://www.jianshu.com/p/4be0d5882ec5 静态文件 Nginx以其高性能著称,常用与做前端反向代理服 ...
 - Nginx静态服务配置---详解root和alias指令
		
Nginx静态服务配置---详解root和alias指令 静态文件 Nginx以其高性能著称,常用与做前端反向代理服务器.同时nginx也是一个高性能的静态文件服务器.通常都会把应用的静态文件使用ng ...
 - Java中static静态关键字的使用
		
我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...
 - php笔记(二)PHP类和对象之Static静态关键字
		
PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...
 - “全栈2019”Java第七十三章:外部类里多个静态非静态内部类详解
		
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
 
随机推荐
- cl_gui_cfw=>flush
			
用法一: REFRESH_TABLE_DISPLAY虽然刷新的界面,但是SAP GUI并不是实时更新,而是将更新的结果放在缓存中,手动调用CL_GUI_CFW=>FLUSH才能触 ...
 - android assets文件夹资源的访问
			
1.assets文件夹里面的文件都是保持原始的文件格式 . 2.assets中的文件只可以读取而不能进行写的操作. 3.assets目录下的资源文件不会在R.java自动生成ID,所以读取assets ...
 - C实现通用数据结构--单链表
			
单链表概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 从概念上讲,可以把链表想象成一系列连续的元素,然而,由于这些元素是动态分配的(C语言 ...
 - 多种cell混合使用
			
有时候我们会碰到一个tableView上有多种cell,这个时候就需要定义多种cell,根据条件判断,当满足某个条件的时候选择某个cell 先看plist文件: Person.h #import &l ...
 - ShareSDK短信验证码集成详细步骤
			
1.这里使用的是ShareSDK网的短信验证码SDK 官网 http://www.mob.com 先去http://www.mob.com/#/reg 注册成为开发者 填写相应的信息,邮箱账号,然后 ...
 - 解决 RHEL 7/ CentOS 7/Fedora 出现Unit iptables.service failed to load
			
一直用CentOS 6 习惯了,一下没适应过来.防火墙配置后执行service iptables save 出现”Failed to restart iptables.service: Unit ip ...
 - Nodejs断言测试
			
var assert = require('assert');/*node中,我们可以使用assert模块来测试代码.equal()和notEqual()分别作相等性和不等性的判断,第一个参数是期望值 ...
 - 微博MySQL优化之路--dockone微信群分享
			
微博MySQL优化之路 数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问 ...
 - Centos Ping不通外网
			
安装完成Vm,Centos6.5,设置了网络: 1.VM虚拟网络,采用桥接模式. 2.Centos里各种 设置ifcfg-eth0中的GETWAY,ADDIP等等 vim /etc/sysconfig ...
 - ProjectManager Alpha8 - 项目管理器,管理起开发中的项目很方便
			
话不多说= = 放几张图了: 文件下载: 32位下载:Package_ProjectManager-1.13.12.exe 64位下载:Package_ProjectManager_x64-1.13. ...