转载请标明出处:
http://blog.csdn.net/lxy_cn/article/details/52788145;
本文出自:【李晓阳的博客】
1.static关键字
static简介
static是静态的意思,是一个修饰符,能够用于成员变量和成员属性。
特点
能够通过类名直接进行调用,被static修饰的成员属性变成了类属性,被static修饰的成员方法变成了类方法, 类属性 和 类方法能够不用创建对象直接被调用
//普通类
public class Persion {
//static修饰后成为类属性
public static String str="hello,sttaic";
//static修饰后成为类方法
public static void sleep(){
System.out.println("好吧!,我睡了");
}
}
//Main主线程
public static void main(String[] args) {
//能够不用创建对象直接调用
//类名.成员变量
String aa=Persion.str;
//类名.成员方法
Persion.sleep();
}
静态属性被该类的说有对象所共享
静态变量(类变量)和非静态变量(实例变量)的区别
a.内存中的位置
类变量随着类的加载而存在于方法区中
实例变量随着对象的创建而存在于堆内存中b.生命周期
静态变量的生命周期最长,随着类的加载而加载,随着类的消失而消失;实例变量的生命周期随着对象的创建而产生,消失而消失,静态属性要早于对象而存在。
c.所属关系不同
类变量所属于整个类,被类的所有对象所共有。
实例变量是对象的特有数据,仅仅属于某个对象。
优缺点
优点: 对于对象的共享数据提供单独的存储空间,节省了控件,没必要所有对象都存储一份。
缺点: 生命周期过于长,访问有一定的局限性,(静态方法只能访问静态属性)
2.代码块
说明
代码块就是被{ }包裹的部分,Java中的代码块分为:
普通代码块,又称为局部代码块,存在于方法体中构造代码块,又称为初始化代码块,在使用new关键字创建对象时执行,且先于构造方法执行
静态代码块,被static直接修饰的代码块,在类被加载时就执行,只执行一次
public class CodeBlock {
//1.静态代码块 类加载的时候进行执行
static{
System.out.println("这是静态代码块");
}
//2.构造代码块 创建对象的时候执行
{
System.out.println("这是构造代码块(初始化代码块)");
}
public CodeBlock(){
System.out.println("这是构造方法");
}
public void hello(){
//局部代码块 当方法被调用的时候开始执行
{
int i=100;
System.out.println("这是普通代码块(局部代码块)");
}
int i=1;
}
//主函数
public static void main(String[] args) {
//1.在创建对象前 静态代码块首先执行
//2.在创建对象时 构造代码块开始执行
//3.在创建对象时 构造代方法开始执行(构造代码块先于构造方法执行)
CodeBlock cb1=new CodeBlock();
//4.方法被调用时 普通代码块执行
cb1.hello();
System.out.println("-------割-------");
//静态代码块只在加载类的时候调用且只调用一次
CodeBlock cb2=new CodeBlock();
cb2.hello();
}
}
当执行CodeBlock p = new CodeBlock(); 时,内存变化情况
1,将Person.class文件加载进内存
2,在方法区为静态属性分配内存并进行默认初始化
3,执行静态代码块,静态方法进方法区
4,p是对象(变量),那么在栈内存中开辟一个变量空间p
5,在堆内存中给对象分配空间,并分配内存地址值
6,普通方法进方法区
7,非静态属性进堆内存,并进行默认初始化
8,调用构造代码块(初始化代码块)
9,调用对应的构造方法进行对象初始化,对象初始化完毕
10,将对象内存地址赋值给p变量,让p变量指向该对象
3.Main方法
main方法是一个特殊的方法,作为程序执行的入口可以被JVM识别。
main方法是静态的,所以可以被JVM直接调用,非常方便。
main不是Java关键字,但用来被JVM识别为程序执行的入口。
4.匿名对象
- 没有名字的对象
CodeBlock p=new CodeBlock(); p只是一个对象的名字(引用), newCodeBlock()才是创建出来的对象
new Person().eat();
缺点:同一个对象只能调用一次方法作用:传参
a.自定义的类型也可以作为参数的类型去使用
b.形参的类型是Person,那么实参的类型也必须是Person
c.实参在传参时可以匿名
d.实参这个对象传到方法中后,可以在方法里调用它的方法