关键字
Static(静态)-修饰符-修饰变量、方法、代码块、内部类
修饰变量-静态变量,静态变量会随着类的加载而加载到方法区的静态区,类变量与类同级,对静态变量赋予系统默认初始值,提供了可以通过类名点(.)的形式调用,也可以通过对象调用静态变量,创建的所有对象都共享这个静态变量
方法区有静态常量池
静态变量不可以定义在普通方法中,方法只有被加载的时候才加载方法里的内容,静态变量是随着类的加载而加载(加载级别不同)
静态变量不可以定义在构造方法中,静态变量与类同级,构造方法与对象同级,类的级别高于对象的级别
修饰方法-静态方法,静态方法随着类的加载而加载到方法区的静态区,类方法与类同级,不会对静态方法赋予系统默认初始值,静态方法被调用的时候是被加载到栈中执行,可以被类名点(.)调用也可以通过对象调用
非静态方法,又名实例方法
静态方法中不可以定义静态变量,静态方法被调用的时候里面的内容才被加载执行
静态方法中不可以使用this,静态方法与类同级,this与对象同级
Main方法不可以直接使用、调用非静态变量、方法(都是创建对象后用eg:p.i,不能直接用)
(加static的才能直接调public static void m(){}→m();)
静态修饰的内容只能直接调用静态信息(与类同级),非静态的内容可以直接调用静态(先加载完了)和非静态信息
静态方法:System.arraycopy();Arrays.copyOf();Arrays.toString();Arrays.sort();
静态方法支持重载
静态方法不支持重写(重写-建父类子类,向上造型,调用走子类)静态方法与类同级,重写针对的是对象,级别不一样,所以没有重写。在父类子类中如果出现方法签名一致的方法,要么都是静态(不重写,走父类中的方法),要么都是非静态方法就是重写
@-注解,给计算机看的注释-eg:@override-下面的方法是重写方法
修饰代码块-静态代码块
在方法外类内-static{}
静态代码块与类同级,优先于对象先加载,且只加载一次
执行顺序-类(静态代码块、静态变量、静态方法)、对象(构造代码块、构造方法)
父子类之间的执行顺序-父类静态-子类静态-父类对象-子类对象
非静态属性的执行顺序和构造代码块的顺序一致,两者谁在前谁先执行
可以Eg:syso(new ST().i);
所有被static修饰的信息,都只加载一次
final(最终)
关键字,修饰符-数据、方法、类
修饰数据(最终值),如果修饰的是基本数据类型的数据,其值不能改变
如果修饰引用类型的数据,不能改变其地址值,但地址中的元素值可以改变-eg:数组被final修饰后其长度不能改变(arr.length)
被final修饰的成员属性在创建对象之前就要有值-应在1.构造代码块中给赋值,或2.在每个构造函数中给值(麻烦)
-被final和static共同修饰时(静态常量)保证在类加载完成之前给值-静态代码块给值
修饰方法(最终方法),可以重载,不可重写
修饰类(最终类),不可被继承(没有子类),可以有父类
Abstract(抽象)-用abstract修饰,并把方法体去掉(不需要{})就变成了抽象方法,即在父类中起目录作用的方法-eg:public abstract double getGirth();-前提,这个类也要+abstract变成抽象类(一个类中出现了抽象方法这个类就要变成抽象类)-eg:abstract class Shape{}
普通类继承抽象类,需要重写所有abstract方法,因为抽象方法没方法体没意义
如果不想重写所有抽象方法,就要把普通类变成抽象类(但之后总要有普通类要继承,跑不掉)
抽象类不一定有抽象方法
抽象类不可以创建对象(两个角度:底层C语言可以根据抽象类构造方法创建出对象,但这个对象拿不到;就算拿到(调用)也没意义)
抽象方法不可以被private/static/final修饰,因为抽象方法必须重写(被重写才会发挥理想作用)-抽象类不可被final修饰,因为抽象类需要可被继承
Abstract只能修饰类、方法
文件夹中Bin-binary a.二进制的
引用类型初始值NULL
创建一个对象,就走其构造方法
定义对象语句-左面需要给值=右面创建对象
子类构造方法第一行默认调用父类的无参构造方法
显式了构造方法,默认的无参调用,定义就都没有了(有时需要无参调用就要补上)
答疑
向上造型-即父类引用指向子类对象Super s=new Sub();
s.变量-编译是父类,运行是父类
s.方法-编译是父类,运行是子类(如果子类没有重写,还是父类)
高级父类是object
static不支持重写