Staitic(静态) 相关知识点介绍
一、什么是 Static?
Static 关键字:表明一个成员变量或者是成员方法可以在没有所属的类的实例的情况下直接被访问
当成员被静态修饰后,就多了一个调用方式,除了可被对象调用外还可以直接被类名调用 --- 类名.静态成员。
声明为 static 的方法有以下几条限制:
- 仅能调用其他的 static 方法
- 只能访问 static 变量.
- 不能以任何方式引用 this 或 super(因为静态优先于对象存在)
- 不能被覆盖(因为方法覆盖是基于运行时动态绑定的, 而 static 方法是编译时静态绑定的.)
特点(利:可以节省内存空间 弊:有局限性):
- 随着类的加载而加载
- 优先于对象存在
- 可以被类直接调用
- 被所有对象所共享
声明为 static 的变量:实质上就是全局变量. (+ final 就是全局常量).
当声明一个对象时, 并不产生 static 变量的拷贝, 而是该类所有的实例变量共用同一个 static 变量.
对于静态类,只能用于嵌套类内部类中。
二、什么是静态变量、静态方法、静态块和静态类?
静态变量:我们可以将类级别的变量声明为static。静态变量是属于类的,而不是属于类创建的对象或实例。因为静态变量被类的所有实例共用,所以非线程安全的。通常静态变量还和关键字final一起用,作为所有对象共用的资源或常量。如果静态变量不是私有的,那么可以通过ClassName.variableName来访问它。
静态方法:类似于静态变量,静态方法也属于类,不属于实例的。静态类只能访问类的静态变量,或调用类的静态方法。通常静态方法作为工具方法,被其它类使用,而不需要创建类的实例。譬如集合类、Wrapper类(String, Integer等)和工具类(java.util中的类)都有很多静态方法。
静态块:静态块就是类加载器加载对象时,要执行的一组语句。它用于初始化静态变量。通常用于类加载的时候创建静态资源。我们在静态块中不能访问非静态变量。我们可以在一个类中有多个静态块,尽管这么做没什么意义。静态块只会在类加载到内存中的时候执行一次。
静态类:我们对嵌套类使用static关键字。static不能用于最外层的类。静态的嵌套类和其它外层的类别无二致,嵌套只是为了方便打包。
三、Static 相关问题?
1.是否可以 override 一个 static 的方法?
答:不能被覆盖. 因为方法覆盖是基于运行时动态绑定的, 而 static 方法是编译时静态绑定的.
2.是否可以 一个 static 方法内部调用非 static 方法?
答:不可以. 因为非 static 方法是要与对象关联在一起的, 须创建一个对象的实例后, 才可以在该对象上进行方法调用, 而static方法调用时不需要创建对象, 可以直接调用. 也就是说, 当一个 static 方法被调用时, 可能还没有创建任何实例对象, 如果从一个 static 方法中发出对非 static 方法的调用, 那个非 static 方法是关联到哪个对象上的呢? 这个逻辑无法成立, 所以, 一个 static 方法内部发出对非 static 方法的调用.
3.静态变量和实例变量的区别?
答:在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加;
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象(比如 new 一个),才会被分配空间,即才可以使用. 而静态变量是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,,静态变量就会被分配空间,就可以使用了.
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用.
/**
* 测试代码
*/
public class StaticTest{ public static int staticVar = ;
public int instanceVar = ; public StaticTest(){
staticVar++;
instanceVar++;
System.out.println(“staticVar=” + staticVar + ”,instanceVar=”+ instanceVar);
}
}
Staitic(静态) 相关知识点介绍的更多相关文章
- 第二十篇 Linux条件测试语句相关知识点介绍
条件测试语句的格式如下: [ 条件表达式 ] # 条件表达式两侧各有一个空格 按测试对象不同,条件测试语句共分为4中类型: 文件测试语句 逻辑测试语句 整数值比较语句 字符串比较语句 ...
- http及浏览器相关知识点归纳
http是应用层协议,采用请求/响应模型 1.浏览器地址栏输入URL地址后发生了什么? 浏览器判断地址是否是合理的URL地址,是否是http协议请求,如果是则进入下一步 浏览器对此URL进行缓存检查: ...
- Android开发涉及有点概念&相关知识点(待写)
前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...
- TCP/IP 相关知识点与面试题集
第一部分:TCP/IP相关知识点 对TCP/IP的整体认 链路层知识点 IP层知识点 运输层知识点 应用层知识点 (这些知识点都可以参考:http://www.cnblogs.com/newwy/p/ ...
- Oracle 参数文件及相关操作介绍
Oracle 参数文件及相关操作介绍 by:授客 QQ:1033553122 1.服务器参数文件 服务器参数文件是一个二进制文件,作为初始化参数的存储仓库.实例运行时,可用ALTER SYSTEM来改 ...
- MySQL各类日志文件相关变量介绍
文章转自:http://www.ywnds.com/?p=3721 MySQL各类日志文件相关变量介绍 查询所有日志的变量 1 mysql> show global variables li ...
- PySpark SQL 相关知识介绍
title: PySpark SQL 相关知识介绍 summary: 关键词:大数据 Hadoop Hive Pig Kafka Spark PySpark SQL 集群管理器 PostgreSQL ...
- sql注入原理+mysql相关知识点
什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...
- UITableView相关知识点
//*****UITableView相关知识点*****// 1 #import "ViewController.h" // step1 要实现UITableViewDataSou ...
随机推荐
- linux压缩与解压缩 tar命令
#压缩tar -czvf ***.tar.gz filetar -cjvf ***.tar.bz2 file#解压缩tar -xzvf ***.tar.gz filetar -xjvf ***.ta ...
- 自己编写的sublime text 3 插件
一些小功能,比较杂. 具体的功能在这里查看 1.本地环境的php运行结果获取. 2.快捷打开常用的文件,文件夹,url.(ctrl+shift+a) 3.常用的缩进转换. 下边是网络爬虫代码. #py ...
- c# winform 隐藏tabcontrol标签
Apperarance 属性:Faltbuttons SizeMode属性:Fixed 各个TabPage的Text :空 ItemSize : Width=0;Height=1;
- HDU1003 dp 动态规划解析
Input The first line of the input contains an integer T(1<=T<=20) which means the number of te ...
- gcc向待编译源文件传入参数的方法
gcc有两种方法向待编译源文件传入参数 第一种 利用–Dmacro=name 编译选项,详见gcc -D选项 第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用 ...
- Ionic简介和环境安装
什么是Ionic Ionic是一个用来开发混合手机应用的,开源的,免费的代码库.可以优化html.css和js的性能,构建高效的应用程序,而且还可以用于构建Sass和AngularJS的优化.ioni ...
- Xcode报错:Unexpected '@' in program
今天犯了个很弱的错误,就是当定义个一个@property时,编译器直接报错:Unexpected '@' in program 原因是把定义的属性写在.m文件中了,改到.h文件中就好了... 以后大家 ...
- 自定义scrollbar
Chrome ::-webkit-scrollbar 整体部分 ::-webkit-scrollbar-track 轨道 ::-webkit-scrollbar-track-piece 内层轨道 :: ...
- bzoj 1604: [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居 曼哈顿生成树
大致题意:统计平面上由曼哈顿距离小于等于c的点对组成联通块的个数. 曼哈顿生成树的模板题.有关讲解:http://blog.csdn.net/acm_cxlove/article/details/88 ...
- Java SE/ME/EE的概念介绍
转自 Java SE/ME/EE的概念介绍 多数编程语言都有预选编译好的类库以支持各种特定的功能,在Java中,类库以包(package)的形式提供,不同版本的Java提供不同的包,以面向特定的应用. ...