static关键字

static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个这个类的某个对象。

1.static关键字的特点

 a:随着类的加载而加载

b:优先于对象存在 (还没创建对象)

c:被类的所有对象共享(定义为静态的依据)

如果某个成员变量是被所有对象共享的,那么它就应该定义为静态的。

d:可以通过类名调用

    格式:

    类名.静态成员变量名

    类名.静态成员方法名(参数)

    对象名.静态成员变量名     ------不建议,出现警告

    对象名.静态成员方法名(参数)   ------不建议,出现警告

静态修饰的内容一般我们称其为:与类相关的,类成员,静态变量叫类变量,静态方法叫类方法.静态的内存存在于方法区类做标记的静态区

2.什么使用静态:

  成员变量被多个对象共享,属于类上的概念时,使用静态修饰

  成员方法调用,不需要对象时(一般指方法不访问成员变量时),可以定义在类中,不创建对象,直接调用。

通常静态修饰的方法为工具性方法,没有实际业务映射

3.static的注意事项

a:静态成员只能访问静态成员,且不能使用this/super。

静态比对象先存在。类加载时还没创建对象

b:静态方法只能访问静态的成员变量和静态的成员方法

静态方法:

* 成员变量:只能访问静态变量

* 成员方法:只能访问静态成员方法

非静态方法:

* 成员变量:可以是静态的,也可以是非静态的

* 成员方法:可以访问静态的成员方法,也可以访问非静态的成员方法。

一句话静态只能访问静态。静态的只能访问静态的,因为在类加载的加载的,访问时已经存在了(不能访问不存在的).而非静态的,必须创建对象才能访问.

例:

class Demo {

int num1 = 10;

public static void print() {        //静态的成员方法

System.out.println(num1);

//报错 无法从静态上下文中引用非静态 变量 num1

System.out.println(num2);

}

}

4.static关键字案例文字内存图

class bj07_9 {

public static void main(String[] args) {

Person p1 = new Person();

p1.name = "苍老师";

p1.country = "日本";

p1.speak();

System.out.println("Hello World!");

Person p2 = new Person();

p2.name = "吉泽明步";

p2.country = "日本";

p2.speak();

}

}

class Person {

String name;

static String country;

public void speak() {

System.out.println(name + "..." + country);

}

}

从含有主方法的类开始

编译运行---bj07_9.class加载进方法区(方法区分成两块,静态区和非静态区,被static修饰的同时被加载进方法区)

主方法进栈,遇到    Person p1 = new Person();,Person.clas要加载进方法区,(方法区分成两块,静态区有String country(默认初始化值是null);非静态区:成员变量和成员方法)

在栈里Person p1声明一个Person类型引用p1

new Person(),在堆内存中创建对象,有自己的地址值,里面有String name属性,默认初始化值是null.堆里没有String country,对象是通过类创建出来的因此能找到静态区的String country.

构造方法进栈,对对象中的属性赋值,构造方法弹栈

将对象的地址值赋值给

对象创建完后,遇到p1.name = "苍老师";通过p1地址值找到name,改变name的值为"苍老师"

P1.country = "日本";地址值找到对象后,对象通过字节码文件找到静态区中的country并赋值

执行p1.Speak,方法进栈,this谁来调用就记住谁,通过地址找到,执行完弹栈.

......

加了静态后,赋值一次就可以共享了.

5.工具类中使用静态

public class Arraytool {

    //如果一个类中所有的方法都是静态的,可以再多做一步,私有构造方法.

//私有构造方法在说明书中不会体现

private Arraytool() {}//目的是不让其他类创建本类对象,直接用类名.调用即可.

// 1,获取最大值

public static int getMax(int[] arr){

int max = arr[0];        //记录第一个元素

for (int i = 1;i < arr.length ;i++ ) {

if (max < arr[i]) {

max = arr[i];

}

}

    return max;        //最大值返回

}

//2,数组的遍历

public static void print(int[] arr) {

for (int i = 0;i <= arr.length - 1 ;i++ ) {                        System.out.print(arr[i] + " ");

}

}

// 3,数组的反转操作

public static void revArray(int[] arr) {

for (int i = 0;i < arr.length / 2 ;i++ ) {                        int temp = arr[i];

arr[i] = arr[arr.length - 1 - i];

arr[arr.length - 1 - i] = temp;

}

}

}

//非静态方法需要创建对象才能访问

//定义成静态的就不用去创建对象了

class bj07_14_Arraytool {

public static void main(String[] args) {

//创建对象,就可以用里面方法了

int[] arr = {33,11,22,33,66,55,44};

    Arraytool.print(arr);//直接类名.就可以了

}

}

static关键字的更多相关文章

  1. 浅谈Static关键字

    1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...

  2. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  3. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  4. Java Static关键字详解

    提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...

  5. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  6. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  7. c++中static关键字的用法总结

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  8. C++中的static关键字的总结

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...

  9. (转)Java中的static关键字解析

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

随机推荐

  1. 关于vue指令(directive)

    1.指令的注册 指令跟组件一样需要注册才能使用,同样有两种方式,一种是全局注册: Vue.directive('dirName',function(){ //定义指令 }); 另外一种是局部注册: n ...

  2. TypeError: test() got multiple values for keyword argument 'key'

    原因是: 1.函数调用的最终形式只会调用两个函数.一个list参数和一个dict参数,格式为call(func, list, dict); 2.如果传入参数中有key参数,那么首先key参数(包括扩展 ...

  3. Nubia Z9 mini使用体验

    前续用的手机:荣耀6 想换的理由: 1, 充电不方便,除了原装的充电器和小米移动电源,其他的充电器和移动电源约有一半都只能以USB方式慢充,即使是2.0A以上输出电流的: 2, 拍照太渣. Z9 mi ...

  4. struts2 自定义校验规则

    自定义校验规则:(了解) 在Struts2自定义校验规则: 1.实现一个Validator 接口. 2.一般开发中继承ValidatorSupport 或者 FieldValidatorSupport ...

  5. GitHub for windows呆瓜级入门

    一.GitHub是一个远程数据托管平台,对于代码用于版本控制(保存各个阶段的代码版本).首先去 https://github.com/ 注册一个GitHub账号 二.输入用户名(不能重复,相当于在Gi ...

  6. POJ 3155 Hard Life(最大密度子图)

    裸题.输入一个无向图,输出最大密度子图(输出子图结点数和升序编号). 看了<最小割模型在信息学竞赛中的应用——胡伯涛>的一部分,感觉01分数规划问题又是个大坑.暂时还看不懂. 参考http ...

  7. 更改python的编码问题:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 56: ordinal not in range(128)

    as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py # encoding=utf8 import sys reload(s ...

  8. 一个漂亮的上传按钮input[type=file]

    ;;} <div class="input-group xj-file xj-panel-top"> <span class="input-group- ...

  9. 终端下vim无法输入问题解决

    最近回归vim时发现会偶尔出现vim无法输入,但光标在动的情况,一度怀疑是spf13的问题,后来经搜索,才发现是因为vim下,快捷键 Ctrl+s 的功能是停止输入,在IDE下编程时间长了,都有潜意识 ...

  10. 常见开发需求之前端利器webstorm中的git和快捷键

    需求   前端开发中我们最常用的一般是webstorm.hbuilder和sublime,因为以前使用过一段时间eclipse所以我对webstorm的感觉比较良好,再加上以前使用hbuilder维护 ...