static关键字
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关键字的更多相关文章
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
- PHP的final关键字、static关键字、const关键字
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
- Java Static关键字详解
提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... 当然,不是所有人都像我一样学艺不精的 ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- c++中static关键字的用法总结
类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...
- C++中的static关键字的总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. 1.面向过程设计中的st ...
- (转)Java中的static关键字解析
转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...
随机推荐
- Shell脚本中,如何判断Linux系统是32位还是64位?
一行就能搞定,输出32或者64 可以用“和. 参考代码如下: ldconfig if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LON ...
- 转载:Android调用相册、拍照实现缩放、切割图片
好几天没有写博客了,感觉都有点懈怠了.笔者参加了大学生第二届软件设计大赛,这几天 一直在弄大赛的事情,没有花些时间来整理博客.好在经过一些时日比赛的东西也弄得差不多了, 接下来就是将这段时间学习里面有 ...
- (原)android补间动画(四)之插补器Interpolator
比如说一段旋转动画 RotateAnimation animation = new RotateAnimation(0, 360, mMoveCircle.getMeasuredWidth() / 2 ...
- SQLAchemy
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果.
- js框架设计1.2对象扩展笔记
需要一个新的功能添加到我们的命名空间上.这方法在JS中被叫做extend或者mixin,若是遍历属性用一下1.1代码,则会遍历不出原型方法,所以1.2介绍的是mass Framework里的mix方法 ...
- 使用Java判断字符串中的中文字符数量
Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...
- 【安装Express】CentOS7 下安装NodeJs+Express+MongoDB+Redis
上一篇介绍了一下怎么安装Nodejs,那么这一篇就说说怎么安装express,express有个中文站点非常非常方便,http://www.expressjs.com.cn/创建express框架的站 ...
- 【python】引用其他目录文件
假设有 目录/A(a.py), 目录/B(b.py), 括号里是目录中的文件 在目录/A中编写a2.py,里面可以import a,但是不能import b 解决方法 import sys sys.p ...
- JTabbedPane 和 JScrollBar 联合使用
需求:实现一个JTabbed, 当下拉到Tabbed的底部时,自动加载下一次的数据. 下面是具体代码: import java.awt.*; import javax.swing.table.Defa ...
- .NET LINQ标准查询运算符
标准查询运算符概述 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法. 大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了 IEnumerable<T> ...