java_三个修饰符

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 变量名;类加载结束前需赋值,不提供默认值,手动赋值。

​ 赋值节点:静态代码块、显示初始化。

猜你喜欢

转载自blog.csdn.net/qq_38928944/article/details/79763821