Java 静态、类加载
1.静态是什么?有什么用?
static的主要作用在于创建独立于具体对象的域变量或者方法。
每创建一个对象,都会在堆里开辟内存,存成员(属性),但是不存方法,方法是共用的,没必要每一个对象都浪费内存去存方法。有一个叫方法区的地方,专门存方法。方法区里又有静态域,存静态变量或者静态方法。
普通变量和方法的调用:通过对象调用
静态变量和方法的调用:通过对象或类调用
public class MyTest8 {
public static void main(String[] args) {
System.out.println(Plant.name);//通过类调用
Plant p1=new Plant();
System.out.println(p1.name);//通过对象调用
p1.name="植物";//类似方法,是公用的,改了之后就是改了,新建对象也是这个值
Plant p2=new Plant();
System.out.println(p2.name);//通过对象调用
}
}
class Plant{
static String name="静态植物";
public static void say() {
System.out.println("植物类");
}
}
/**输出
静态植物
静态植物
植物
*/
静态的调用
在类被加载的时候,静态的代码都会被加载,并且只加载一次,放在方法区里,该类的对象一起用。省时省力。
2.加载类有什么用?
任何程序都要先加载到内存中才能和CPU进行交流,而JVM中的ClassLoader(类加载器)就是负责提前将,class文件加载到内存中去的。
3.类何时被加载?(普通人的宏观理解)
- 实例化对象时,如Chinese c1=new Chinese();此时加载了Chinese类
- 通过类名调用静态变量或静态方法的时候
- 如果实例化子类对象,会先加载父类
通过代码验证:
public class MyTest8 {
public static void main(String[] args) {
Plant.say();//通过类名调用静态方法
Plant p1 = new Plant();//创建对象
Plant p2 = new Plant();
}
}
class Plant{
static String name="静态植物";
public static void say() {
System.out.println("植物类");
}
static {
System.out.println("植物类的静态代码被执行加载了");
}
{
System.out.println("植物类的普通代码被加载了");
}
}
输出:
植物类的静态代码被执行加载了
植物类
植物类的普通代码被加载了
植物类的普通代码被加载了
由此可知,Plant.say();调用方法时就加载了类,静态代码也都被执行了,并且只执行一次,创建对象的时候再次加载类,但是不执行静态代码,而是非静态代码。
再通过继承关系观察静态和非静态的关系
public class MyTest8 {
public static void main(String[] args) {
Flower.say();//通过类名调用静态方法
Flower f1=new Flower();//创建花类对象
Flower f2=new Flower();
}
}
class Plant{
static String name="静态植物";
public static void say() {
System.out.println("植物类");
}
static {
System.out.println("植物类的静态代码被执行加载了");
}
{
System.out.println("植物类的普通代码被加载了");
}
}
class Flower extends Plant{
static {
System.out.println("花类被加载了");
}
static String name="花";
public static void say() {
System.out.println("花类");
}
{
System.out.println("花类的普通代码被加载了");
}
}
输出:
植物类的静态代码被执行加载了
花类被加载了
花类
植物类的普通代码被加载了
花类的普通代码被加载了
植物类的普通代码被加载了
花类的普通代码被加载了
由此可知:调用静态的东西,只执行静态的代码,静态代码只执行一次。创建对象的时候也会加载,如果静态没有被加载过也会被加载,加载过就不用。加载子类的时候,会先把父类加载一次。
在代码中,调用子类静态方法,则先加载父类的静态代码,再加载子类的静态代码,再调用方法。创建对象的时候,先加载父类,再加载子类。
类装载的过程:
- 加载:根据查找路径找到相应的 class 文件然后导入;
- 检查:检查加载的 class 文件的正确性;
- 准备:给类中的静态变量分配内存空间;
- 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;
- 初始化:对静态变量和静态代码块执行初始化工作。
牛客刷题
1.初始化代码执行顺序是:父类静态→子类静态→父类普通代码块→子类普通代码块→父类构造方法→子类构造方法
2.静态方法属于类不属于对象;静态方法中只能访问其他静态方法和静态数据,不能访问非静态的。
3.静态不可用this调用。
Java 静态、类加载的更多相关文章
- java基础--java静态代码块和静态方法的区别、static用法
转载自: http://blog.sina.com.cn/s/blog_afddb8ff0101aqs9.html 静态代码块:有些代码必须在项目启动的时候就执行,这种代码是主动执行的(当类被载入时, ...
- Java虚拟机类加载机制——案例分析
转载: Java虚拟机类加载机制--案例分析 在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...
- java面向对象--类加载器及Class对象
类加载器 jvm 和 类的关系 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程.同一个jvm的所有线程.所有变量都处于同一个进程里,都使用该jvm进程的内存区. jvm进程终 ...
- Java 的类加载机制
Java 的类加载机制 来源 https://www.cnblogs.com/xiaoxi/p/6959615.html 一.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
- Java 的类加载顺序
Java 的类加载顺序 一.加载顺序:先父类后子类,先静态后普通 1.父类的静态成员变量初始化 2.父类的静态代码块 3.子类的静态成员变量初始化 4.子类的静态代码块 5.父类的普通成员变量初始化 ...
- 深入理解Java虚拟机---类加载机制(简略版)
类加载机制 谈起类加载机制,在这里说个题外话,当初本人在学了两三个月的Java后,只了解了一些皮毛知识,就屁颠屁颠得去附近学校的招聘会去蹭蹭面试经验,和HR聊了一会后开始了技术面试,前抛出了两个简单的 ...
- java:java静态代理与动态代理简单分析
java静态代理与动态代理简单分析 转载自:http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动 ...
- 我竟然不再抗拒 Java 的类加载机制了
很长一段时间里,我对 Java 的类加载机制都非常的抗拒,因为我觉得太难理解了.但为了成为一名优秀的 Java 工程师,我决定硬着头皮研究一下. 01.字节码 在聊 Java 类加载机制之前,需要先了 ...
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ...
随机推荐
- java byte[]和base64互相转换
1.方式一 import java.io.UnsupportedEncodingException; import java.util.Base64; // byte[]转base64 Strin ...
- Elasticsearch由浅入深(二)ES基础分布式架构、横向扩容、容错机制
Elasticsearch的基础分布式架构 Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式系统,分布式是为了应对大数据量. Elasticsearch ...
- 初始socket模块和巧解粘包问题
1.什么是socket? 两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大 ...
- Java-volatile底层实现原理
一.volatile 代码 package jvm; public class VolatileVisibilityTest { private static boolean initFlag = f ...
- [解決方案]IIS配置后报错500.21
如果报错这个信息,那么就是aspnet未注册造成的,需要安装一下 步骤: 1.打开CMD 2.输入cd %windir%\Microsoft.Net\Framework\v4.0.30319 3.执行 ...
- 阿里云虚拟空间.net 网站错误
Web.config 文件的 <compilation> 元素中的“targetFramework”特性仅用于目标 .NET Framework 版本 4.0 或更高版本(例如“< ...
- Aliplayer视频点播加密播放
Aliplayer视频播放器填坑 aliplayer视频点播分为Flash和HTML5两个版本,移动端不支持Flash播放器.Flash播放器兼容IE8+,HTML5播发器支持比较新的浏览器,对浏览器 ...
- Android ADB 实用总结
一.背景 从系统架构上来说,Android是基于Linux系统基础上,做了进一步的定制与修改,并融入了自身的特有功能,且向应用层提供应用程序接口,供开发者使用.系统内核层面,主体依然是Linux内核. ...
- 互联网基础知识------OSI七层网络模型梗概
OSI七层模型 七层网络结构: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 一般也作五层 应用层.传输层.网络层.数据链路层.物理层(实体层) 引申问题:TCP/IP协议与http协议 ...
- Java Automic包下的AtomicInteger
感谢这两位博主的文章,文章源于: https://www.cnblogs.com/chenpi/p/5375805.html https://blog.csdn.net/fanrenxiang/art ...