关于static
static是静态的意思;
static修饰的成员变量,在内存中存在于方法区中,只有一份,非静态的成员变量在堆中,每个对象中都有一份
public class Demo1 {
public static void main(String[] args) {
Test t1 = new Test();
t1.classNo = "12";
t1.id = 12;
Test t2 = new Test();
t2.classNo = "25";
t2.id = 25;
System.out.println("t1的id: "+t1.id+" t1的classNo:"+t1.classNo +" t2的id: "+t2.id+" t2的classNo: "+ t2.classNo);
}
}
class Test{
int id;
String name;
static String classNo;
}
如上代码控制台会输出 " t1的id: 12 t1的classNo25 t2的id: 25 t2的classNo: 25 " ,静态成员变量存在于方法区内且只有一份,非静态的成员变量在堆中,每个对象中都有一份
静态成员变量的访问方式:
1:通过对象访问
格式: 对象.成员变量
2:通过类名访问
格式: 类名.静态的成员变量
public class Demo1 {
public static void main(String[] args) {
Test.classNo = "12";
// Test.id = 12; 会报错,不是静态不可以直接通过类名调用
}
}
class Test{
int id;
String name;
static String classNo;
}
如果有数据需要被共享出去,就可以使用static修饰
静态成员变量和非静态成员变量的区别:
1:存储位置
静态成员变量:在方法区
非静态成员变量:堆中
2:数量
静态成员变量:在内存中只有一份
非静态成员变量:有多少对象就有多少份
3:访问方式
静态成员变量:可以通过对象访问,也可以通过类名访问
非静态成员变量:只能通过对象访问
4:生命周期:
静态成员变量:随着类文件的加载而存在,跟着类文件的消失而消失
非静态成员变量:随着对象的创建而存在,对象被垃圾回收器回收时消失
5:作用
静态成员变量:共享一个数据给所有对象使用
非静态成员变量:描述一类事物的公共属性
当一个类被主动使用时,Java虚拟就会对其初始化(加载这个类,初始化为加载的最后一步),如下六种情况为主动使用:
1、当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
2、当调用某个类的静态方法时
3、当使用某个类或接口的静态字段时
4、当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
5、当初始化某个子类时
6、当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)
static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态代码块执行等工作。
static修饰方法:
访问方式:
1:通过对象访问
2:通过类名访问
静态方法被调用时执行
静态方法注意点:
1:静态方法可以直接访问静态成员(变量,方法),不能直接访问非静态成员, 可以通过对象访问非静态成员
2:非静态方法可以直接访问静态成员和非静态成员
3: 静态方法中不能出现this关键字和super关键字
4:静态方法可以通过类名或者对象调用,非静态方法只能通过对象调用
public class Demo {
/**
* @param args
*/
public static void main(String[] args) {
Person3.study(); // 通过类名调用静态方法
new Person3("aa",20).study(); // 通过对象调用静态方法
System.out.println(Person3.classNo); // 通过类名访问静态成员变量
}
}
class Person3{
String name;
int age;
static String classNo = "52";
static{
System.out.println("静态代码块");
}
public Person3() {
}
public Person3(String name, int age) {
this.name = name;
this.age = age;
}
public static void study(){
// System.out.println("学习"+classNo);
// System.out.println("姓名:"+new Person3().name); // 静态的方法不能直接访问非静态的成员变量
// compare(new Person3()); // 静态的方法不能直接访问非静态的方法
eat(); // 静态的方法可以直接访问静态的方法
}
public static void eat(){
System.out.println("eat..."+classNo); // 静态的方法可以直接访问静态的成员变量
}
public void compare(Person3 p){
eat(); // 非静态的方法可以直接访问静态的方法
if(this.age > p.age){
System.out.println(this.name+"比"+p.name+"大");
}else if(this.age < p.age){
System.out.println(this.name+"比"+p.name+"小");
} else {
System.out.println(this.name+"和"+p.name+"一样");
}
}
public String toString() {
return "Person3 [name=" + name + ", age=" + age + ", classNo="
+ classNo + "]";
}
}
关于static的更多相关文章
- static,你还敢用吗?(二)
为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- PHP static静态属性和静态方法
这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...
- static,你还敢用吗?
我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ...
- Java关键字:static
通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ...
- Android 中关于static的使用问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...
- iOS: 在UIViewController 中添加Static UITableView
如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ...
- 浅谈Static关键字
1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ...
- 今天思考一个问题,PHP const和static的区别
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ...
随机推荐
- 编写Java程序,利用List维护用户信息
返回本章节 返回作业目录 需求说明: 将新增的用户信息添加到List集合. 用户信息包括用户编号.姓名和性别. 按照姓名和性别查找用户信息. 实现思路: 创建类UserInfo,在该类中定义3个Str ...
- C#读取注释的方法
友好的注释能提高代码的可读性,几乎所有的编程语言都支持注释. 在C#中,注释不是可执行代码的一部分,因此注释不会被编译到程序集中去,但是我们可以提取注释[右键项目]-[属性]-[生成]-[输出]-[X ...
- haproxy常用配置
haproxy 理论 它可以反向代理http/tcp协议,七层和四层的负载均衡解决方案 七层的负载解决方案是因为他们支持高级特性,工作在用户空间,请求从用户空间转换到内核空间是非常浪费硬件资源的. h ...
- python中addict模块,设置和读取嵌套字典
源码地址: https://github.com/mewwts/addict/blob/master/README.md
- Maven+ajax+SSM实现新增
转载自:https://www.cnblogs.com/kebibuluan/p/9014986.html 20.尚硅谷_SSM高级整合_新增_创建员工新增的模态框.avi 1.接下来当我们点击增加按 ...
- HDU 1576 A/B (两种解法)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1576 分析:等式枚举法,由题意可得:, ,代入 , 得:,把变量 合在一起得: :即满足 为 倍 ...
- FastDFSJava客户端使用
1.1.java客户端 余庆先生提供了一个Java客户端,但是作为一个C程序员,写的java代码可想而知.而且已经很久不维护了. 这里推荐一个开源的FastDFS客户端,支持最新的SpringBoot ...
- powershell基础知识
基本命令 我们先从最基本的命令入手,Windows Powershell命令中get类命令是很庞大的一个命令工具集合,而且get类命令也是Powershell中占比最大的. 1.Get-Alias G ...
- Java 将PDF转为PDF/A
通过将PDF格式转换为PDF/A格式,可保护文档布局.格式.字体.大小等不受更改,从而实现文档安全保护的目的,同时又能保证文档可读.可访问.本篇文章,将通过Java后端程序代码展示如何将PDF转为符合 ...
- Web开发之response
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. 我们要获取客户机提交过来的数据,只需要找request对象就行 ...