java_三个修饰符
static final abstract
一、static
static 修饰符(静态修饰符)
可修饰:属性、方法、初始化代码块(修饰三个不同的组建,分别代表不同的含义)
静态属性
static修饰属性。静态属性是全类公有的属性,可以用类名直接访问
(实例属性是属于某个对象,是各自持有的)
每个对象的静态属性都指向同一块内存区域,这个属性不属于特定的对象,而属于“类”
静态属性是整个类共同持有的共享空间(只有一份),任何对象的修改,都会影响其他对象
public class Test{
public static void main(String[] args){
MyClass mc1 = new MyClass();
mc1.b = 100;
MyClass mc2 = new MyClass();
mc2.b = 200;
System.out,println(mc1.b); //打印200
System.out,println(mc2.b); //打印200
}
}
public MyClass{
static int b; //静态属性
}
静态—>不必创建对象,可直接通过类名访问
静态属性的初始化,早于成员变量
静态方法
静态方法中只能访问类的静态成员,不能出现this和super.
静态方法不能直接访问非静态成员。
(时间原因:先加载类,之后才可以创建对象,实例属于对象。空间原因:所属位置不同,类的相关信息保存在方法区中,对象的创建实在堆中)
静态方法没有多态。(只根据引用类型,调用相应的静态方法)
public class TestStaticMethod{
public static void main(String[] args){
//可在其他类中,通过"类名.方法名"访问
MyClass.method1();
}
}
class MyClass{
public static void method1(){
System.out.println("static void method1()");
method2(); //可在本类中,通过"静态方法名"访问
}
//由static修饰的静态方法
public static void method2(){
System.out.println("static void method2()");
}
}
已知的静态方法:
Arrays.copyOf();
Arrays.sort();
Math.random();
Math.sqrt();
均使用类名调用
动态代码块
创建对象时,触发动态代码块的执行
执行地位:==初始化属性之后,构造方法代码之前==
作用:可为实例属性赋值,或必要的初始行为
初始代码块
创建对象:分配空间–>初始化属性(执行初始化代码块)–>调构造方法
静态初始代码块
static 修饰的代码块
静态初始代码块,在类加载的时候执行
类加载
类加载过程:
JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件
将.class 文件中对类的描述信息加载到内存中,进行保存
如:包名、类名、父类、属性、方法、构造方法…
加载时机:
1、创建对象
2、创建子类对象
3、访问静态属性
4、调用静态方法
5、Class.forName(“全限定名”);
abstract
1、抽象类:abstract修饰的类为抽象类,被修饰的类可以声明引用,不能创建对象
2、抽象方法:只有声明,没有实现的方法
abstract class Animal{
public abstract void eat();
}
如果一个类拥有抽象方法,那么这个类必须是抽象类;抽象类未必有抽象方法
写抽象类的目的是让子类去继承;
子类实现父类的抽象方法(子类覆盖父类的抽象方法)
子类去继承一个抽象类,如果子类不希望成为抽象类,就必须实现父类中所有的抽象方法
小结
1、abstract修饰类:不能new 对象,但可以声明引用
2、abstract修饰方法:只能方法声明,没有方法实现。(需包含在抽象类中)
3、抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
4、子类继承抽象类后,必须覆盖父类所有的抽象方法,否则子类还是抽象类
final
概念:最后的,不可更改的
final 修饰的内容:类(最终类)、方法(最终方法)、变量(最终变量)
final类
final修饰类:此类不能被继承
String、Math、System均为final修饰的类,不能被继承
final修饰的方法:此方法为最终方法,不能被覆盖
意为最终方法,不支持子类以覆盖的方式修改
final变量
final修饰变量:此变量值不能改变(常量)
final修饰的变量只能赋值一次,没有默认值
赋值节点:显示初始化、动态代码块、构造方法(如果有多个构造方法每个构造方法都需要给final 修饰的变量赋值初始化,即需要多条路径都可行)
静态常量
static final 变量名;类加载结束前需赋值,不提供默认值,手动赋值。
赋值节点:静态代码块、显示初始化。