static修饰符
一、static修饰符(modifier)。static修饰符可以修饰方法、成员变量和代码块。表示静态的。
static修饰变量:static修饰的成员变量表示静态变量,可以通过类名.直接访问; 成员变量:定义在类里面、方法外面的变量,分两种: a. 实例变量 b. 静态变量:形式和实例变量类似,在实例变量面前加static关键字 static变量和实例变量的区别: 1、static 变量对于每个类而言在内存中只有一个,能被类的所有实列所共享;实例变量对于每个类的每个实例都有一份,它们之间互不影响。 2、java虚拟机在加载类的过程中为static变量分配内存,实例变量在加载完类后创建对象时分配内存。 3、static变量存在方法区,实例变量存在堆区 4、static变量可以直接通过类名访问,实例变量通过引用类型变量访问; 5、对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在类加载的过程中分配 static方法:用static修饰的方法叫静态方法,或类方法。静态方法也和静态变量一样,不需要创建类的实例,可以直接通过类名来访问。 1、不能使用this关键字,super关键字 2、静态方法必须被实现。静态方法用来表示某个类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。既然如此,当前类必须为静态方法提供实现 public void add(){} 此方法是一个实现的方法,只不过方法的方法体为null public void add(); 此方法是没有被实现的方法。只能出现在抽象类或者接口中 3、父类的静态方法不能被子类覆盖为非静态方法。 static代码块:会在当前类被类加载时执行一次;区别于匿名代码块:只能执行一次,和构造器一样;创建对象的时候做初始化 工作。 类中可以包含静态代码块,它不存在与任何方法中。在java虚拟机中是加载类时会执行这些静态代码块。如果类中包含过个静态代码块,那么java虚拟机将按照他们在类中出现的顺序依次执行它们,每个代码块只会被执行一次。二、final修饰符:final具有“不可改变的”含义,它可以修饰非抽象类、非抽象成员方法和变量。
final修饰类:可以和static一起用,final修饰的类不能被继承,没有子类。 1、继承关系的弱点是打破封装,子类能够访问父类的实现细节,而且能以方法覆盖的方式修改实现细节。在以下情况下可以考虑把类定义为final类型,使得这个类不能被继承。 a、子类有可能会错误地修改父类的实现细节 b、出于安全,类的实现细节不允许有任何改动 c、在创建对象模型时,确信这个类不会再被扩展。 final修饰方法:在某些情况下,出于安全原因,父类不允许子类覆盖某个方法,此时可以把这个方法声明为final类型。例如:在java.lang.Object 类中,getclass()方法为final类型。返回的类类型。 final修饰变量:final可以修饰静态变量、实例变量、局部变量; a、final变量都必须显示初始化,否则会导致编译错误; 1)静态变量:如果没有static代码块只能在定义变量时进行初始化,如果有static代码块可以将初始化放入到static代码块中 2)实例变量:可以在定义变量时,或者构造方法中初始化。 b、final变量只能赋值一次。三、abstract修饰符:定义标准;可以修饰类和成员方法。不能与final、static、以及构造方法并存 标准:举个列子,为什么每个国家都会储备美元,因为只有美元知道一桶石油多少钱,人民币不知道,所以都要和美元比较汇率;还有U盘的U口;都是一种标准。
abstract修饰类:用abstract修饰的类表示抽象类,抽象类不能实例化,即不允许创建创想类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。
abstract修饰方法:抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现方法。
没有abstract修饰的方法称为具体方法,具体方法具有方法体。
a、子类继承抽象的父类:如果父类中包含抽象方法子类在继承时有没有重写父类的抽象方法,此时子类必须也声明称抽象类,否则会报错。
b、存在抽象方法一定是抽象类,抽象类不一定包含抽象方法;抽象类只有被继承才能被使用
c、构造方法不能重写,不能被继承;final修饰的方法也不能被重写;
d、抽象类以及抽象方法不能被final修饰符修饰。