java类加载与static
一.类加载
当jvm去运行一个类时,会先加载该类,把该类在硬盘上字节码加载到jvm的内存。
java HelloWorld
>字节码会被加载到代码段中
>加载过程中会有一些静态的常量,这部分会事先存放到数据段中
类加载与static的关系
类加载会去初始化static修饰的变量
类加载会去执行静态的代码块
类加载实际上由类加载器加载,这个加载器是ClassLoader
二.static
(1)修饰变量
用static修饰变量,该变量成为类变量,用于给属于该类的所有对象共享。
1 内存位置 - 数据段
2 生命周期 - 从类加载开始就有了(实例变量生命周期从创建对象开始),static变量要比实例变量更早出现
3 使用范围 - 实例变量只能是拥有它的对象才能使用,类变量是所有对象共享
如何访问类变量
1)通过对象引用
Person p = new Person();
System.out.println(p.count);
2)通过类名(常用的方式)
System.out.println(Person.count);
(2)修饰方法
static修饰方法,该方法成为了类方法,通过类名访问。
(3)静态方法的使用场合
1 我们的工具类一般都不需要创建对象就可以调用它的方法,这些工具类的方法都声明为static,这样子就直接通过类名就能够调用了
/**
* 工具类
*/
class JdbcUtils{
public static Connection getConnection(){
return null;
}
public static void close(Connection conn){
}
} 2 在一些类似枚举场合(季节)
/**
* 季节
* 一般枚举变量用大写
* 1)固定个数
* 2)不变的
* 3)个数比较少
*/
class Season{
public static final Season SPING = new Season("春天");
public static final Season SUMMER = new Season("夏天");
public static final Season AUTUMN = new Season("秋天");
public static final Season WINTER = new Season("冬天");
private String season;
/**
* 构造方法私有化
* @param season
*/
private Season(String season){
this.season = season;
}
public String getSeason(){
return season;
}
}
enum Seasons{
SPING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
private String season;
private Seasons(String season){
this.season = season;
}
public String getSeason(){
return season;
}
} 3 单例模式
一个类只有一个对象(饿汉式,懒汉式)
/**
* 饿汉式,类加载就直接创建出对象,有可能造成启动慢
*/
class Singleton{
private static Singleton instance = new Singleton();
// 构造方法私有化
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
/**
* 懒汉式
*/
class Singleton{
private static Singleton instance =null;
// 构造方法私有化
private Singleton(){
}
public static Singleton getInstance(){
if(null==instance){
instance = new Singleton();
}
return instance;
}
} 4 工厂模式(静态)
屏蔽细节
/**
* 简单工厂
*/
class CarFactory{
public static Car createCar(){
Car c = new Car();
c.color = "red";
c.driver = "9缸";
c.decoration = "真皮";
return c;
}
}
class Car {
public String color;
public String driver;
public String decoration;
public void run(){
System.out.println(color+"的汽车在奔跑");
}
}
(4)语法限制
1 不能在静态的方法内部(静态的上下文)访问非静态的成员(属性和方法),除非创建一个对象,用对象名.实例方法名来调用。
但非静态的方法可以直接访问静态的变量和方法
public class TestStatic3{
int i = 8;//实例变量,对象变量
public static void main(String[] args){
//System.out.println(i);//编译出错,没有对象哪来的实例变量
System.out.println(new TestStatic3().i);
}
}
2 静态方法内部没有this(本实例)和super(父实例)引用
3 静态方法之间可以重载
4 静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。
5 静态的方法不能被非1静态的方法覆盖
6 非静态的方法不能被静态的方法覆盖
http://blog.csdn.net/ycb1689/article/details/17163273
父类的普通方法可以被继承和重写,不多作解释,如果子类继承父类,而且子类没有重写父类的方法,但是子类会有从父类继承过来的方法。
静态的方法可以被继承,但是不能重写。如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;这种父子类方法也不在存在多态的性质。《Java编程思想》中这样提到“只有普通的方法调用可以是多态的”。
(5)main方法
public static void main(String[] args){
}
这是程序入口方法,这是一个固定方法,只有args这个变量可以变。
为什么main必须是static?
jvm去运行一个类时,首先会加载这个类,然后运行main方法,此时是没有对象创建出来的。这时
main只有是static修饰才能去执行
main方法的参数是用来干吗的?
用来接收jvm的程序参数。我们运行一个类时,可以传一个参数值进去
(6)static的优劣
static的优势:
1)不用创建对象,节省空间
2)使用时通过类名调用,方便
static的劣势
没有办法使用多态
三.静态代码块
1 有何用
用来初始化静态的变量,例如jdbc中初始驱动类,url....
2 运行的时机
类加载的时候去运行
静态代码块和静态变量的初始化是同样的时机,是按照它们出现先后顺序去执行
四.实例代码块
实例代码块用来初始化实例变量
{
i = 9;
System.out.println("------------实例代码块-------");
}
运行时机
构造方法之前,与实例变量显示初始化是平级的,谁先谁后看它们在类中出现的顺序
五.对象创建过程
1 先加载类(先加载父类)
2 执行静态代码块或者初始化静态的变量
3 分配堆内存空间
4 默认初始化父类属性(实例变量)
5 执行实例代码块或显式初始化父类属性(实例变量)
6 调用父类的构造方法完成。
7 默认初始化自己类属性(实例变量)
8 显式初始化自己类属性(实例变量)
9 调用自己类的构造方法
总结:先执行静态属性和静态代码块,再执行属性,最后执行构造方法。
java类加载与static的更多相关文章
- Java类加载过程及static详解
类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类加载器的任务就是根据一个类的 ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- (转)Java中的static关键字解析
转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...
- Java中的static的使用
Java中的static使用之静态变量 神话丿小王子的博客主页 1.Java 中被static修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.且优先于对象 ...
- Java类加载和类反射回顾
今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...
- java中的static详解
如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象.static 成员的最常见的例子是main( ) .因为在程序开始执行时必须调用main() ,所以它被声 ...
随机推荐
- 一分钟使用Docker快速搭建Wordpress
1. apt install docker.io -y 2. pip install docker-compose 3. vim wordpress_stack.yml version: '3.1' ...
- Centos7防火墙开放8080端口
查看已经开发的端口: firewall-cmd --list-ports 开启端口: firewall-cmd --zone=public --add-port=8080/tcp --permanen ...
- iOS原生和React-Native之间的交互2
今天看下iOS原生->RN: 这里有个问题: * 我这里只能通过rn->ios->rn来是实现* 如果想直接ios-rn 那个iOS中的CalendarManager的self.br ...
- [JetBrains注册] 利用教育邮箱注册JetBrains产品(pycharm、idea等)的方法
我们在使用JetBrains的一些产品时,大多使用网上的一些key去注册或者pojie的,但是由于提供这些key的服务器并不能保证稳定可用,所以可能一段时间我们使用的ide又需要重新pojie. 这里 ...
- Python学习笔记第五周
目录 一.基础概念 1.模块定义 2.包的定义 3.导入包的本质 4.导入模块的本质 5.导入方法 6.import的本质 7.导入优化 8.模块分类 9.标准库介绍 1.time与datetime ...
- mysql 批量kill
select concat('kill ',id,';') t from information_schema.processlist order by t
- 了解数据模型、以及MySQL使用的数据模型
1.什么是数据模型? 数据模型是数据库系统的核心与基础,是关于数据与数据之间的联系.数据的语义.数据一致性约束的概念性工具的集合. 数据模型的三个组成部分: 数据结构.数据操作.完整性约束. 数据操作 ...
- Python之路,第二十篇:Python入门与基础20
python3 面向对象4 supper 函数 supper(type, obj) 返回绑定超类的实例(要求obj必须为type类型的实例) supper() 返回绑定的超类的实例,等同于(cl ...
- Autofac解耦事件总线
事件总线之Autofac解耦 事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线 ...
- CentOS安装LibreOffice
查找yum源的安装包$ yum search libreoffice 查看yum源上安转包基本信息$ yum info libreoffice可安装的软件包名称 :libreoffice架构 :x86 ...