1.用static修饰的属性就叫做静态属性
2.静态属性的访问权限和普通属性的权限是一样的
3.静态属性可以通过类名.属性名字调用
4.静态属性类加载的时候就创建好了
5.同一个对象的多个实例化调用的静态属性是同一个
6.JDK 1.8之前静态属性存在在JVM中的方法区中的静态域中,1.8之后存在堆中
7.静态属性和普通属性的区别,普通属性每次new对象都会重新创建一个的,静态属性不会创建新的每次调用的都是同一个
public class A{
// 静态属性
public static String name = "";
// *重点 静态属性的访问权限和普通属性一直
}
public class B{
// 可以通过对象的实例化调用静态属性
A a = new A();
a.name;
// 也可以通过类名.属性名调用 静态属性
A.name
}
类方法(静态方法)
1.静态方法的和静态属性差不多,同上一致
2.静态方法中不能使用this ,super
3.静态方法中只能访问静态变量和静态方法(如果要使用非静态方法或者成员只能new一个对象再调用)
4.重点*,类什么时候被加载(类只会被加载一次)
5.当创建一个对象实例的时候,类会被加载(new 对象的时候)
6.创建子类对象实例的时候父类也会被加载
7.使用类的静态成员变量或者静态成员方法的时候,类会被加载(类名.属性名/类名.方法名)
8.代码块
9.代码块分为静态代码块和普通代码块
10.代码块可以减少代码的冗余(将一些重复的代码卸载代码块中)
代码块:
public class A{
{
System.out.println("我是普通代码块");
}
}
class B{
A a = new A(); // 每次对对象进行实例化的时候(new对象的时候)都会调用普通代码块
}
静态代码块:
public class A{
static{
System.out.println("我是静态代码块");
}
}
class B{
A a = new A(); // 静态代码块每次类加载的时候才会调用,只会执行一次
/*
类加载的几种情况
1. 对象进行实例化的时候进行类加载(也就是new的时候)
2. 使用静态成员变量或者静态成员方法的时候类会被加载
3. 创建子类对象实例的时候父类也会被加载
*/
}
难点*
public class A{
static {
System.out.println("我是父类的静态代码块");
}
}
class B extends A{
public static String num = "100";
static{
System.out.pritln("我是子类的静态代码块");
}
}
class Test{
public void static main(String [] args){
B b = new B();
/*
输出的语句是:
我是父类的静态代码块
我是子类的静态代码块
*/
// 上面的注释掉使使用类名.属性方式进行类加载
B.num; // 这里也会调用静态代码块的语句 输出方式也是先父类然后再子类
}
}
java代码块的使用
1.代码块分为普通代码块(不带static)和静态代码块(带static)两种
2.普通代码块会随着每次对象实例化而调用,静态代码块只会随着类的加载而调用,类加载只会进行一次
3.普通代码块和静态代码块的执行顺序,静态属性、静态代码块优先执行,静态的按照顺序执行,最后执行构造方法
普通代码块
// 普通代码块
public class A{
public String name = "fanfan";
{
// 这个就是普通代码块
System.out.println("我是普通代码块!");
}
}
class B{
public static void main(String [] args){
A a = new A();
System.out.println(a.name);
// 普通代码块每次对象实例化的时候都会进行调用,也就是每次new对象的时候
// 输出结果
// 我是普通代码块! fanfan
}
}
静态代码块
// 静态代码块
public class A{
public static String name = "fanfan";
static{
// 这个就是静态代码块
System.out.println("我是静态代码块!");
}
}
class B{
public static void main(String [] args){
System.out.println(A.name); // A类的静态属性调用 这里会进行类的加载
// 输出结果 fanfan 我是静态代码块!
}
}
执行顺序:
1.如果普通方法、静态方法、普通代码块、静态代码块同时存在一个类中,优先执行静态的东西,静态的也按照代码顺序来执行
public class A{
public String name = "fanfan"; // 3
public static String sex = "女"; // 1
{ // 4
System.out.println("我是普通代码块!");
}
static{ // 2
System.out.println("我是静态代码块!");
}
public A(){ // 5
System.out.println("我是构造方法!");
}
}
2.如果存在父子类关系优先加载父类的
3.构造方法里面隐藏了一个super()方法和一个调用普通属性的方法