Java三个修饰符(abstract,static,final)(转载)

abstract

  • 抽象类,被其他类继承,不能new对象,但可以声明引用。

  • 抽象类的作用:

    1. 可被子类继承,提供共性属性和方法
    2. 可声明为引用,更自然的使用多态。
  • 抽象类特点

    1. 抽象类不能被实例化,包含构造方法。
    2. 抽象类中可以包含抽象方法,也可以包括非抽象方法。
    3. 包含抽象方法的类,一定是抽象类。
    4. 子类必须实现抽象类中的抽象方法,除非子类也是抽象类。
  • 抽象方法:只有方法声明,没有方法体实现。(需包含在抽象类中)。

  • 特点

    1. 抽象方法没有方法体。
    2. 包含抽象方法一定是抽象类
    3. 抽象方法必须被子类重写,除非子类也是抽象类。
  • 注意:抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。

  • 子类继承抽象类后,必须重写父类中所有的抽象类方法,否则子类还是抽象类。

static

  • 静态属性

  • 访问静态属性使用:类名.静态属性。

  • 访问静态方法使用:类名.静态方法。

  • 静态成员存在方法区(JDK1.7之前永久代,JDK1.8源空间)中

  • static 特点:

    1. 静态方法中可以直接访问静态属性,不能直接访问非静态属性和方法,不能使用this.super。
    2. 非静态方法可以直接访问静态属性,静态方法。
    3. ***静态方法可以继承,不能重写,没有多态,重写后自动隐藏父类的静态方法。***。
  • 常用静态类方法:Array,System,Math.

  • 特殊方法:由于Java开放性,使用对象访问静态属性和方法,不推荐这种写法

  • 三个代码块

    1. 局部代码块 :会缩小变量的使用范围,提前释放局部变量,节省内存。
    2. 动态代码块:定义在类中,创建对象时,触发动态代码的执行,可以为实例属性赋值。,执行顺序1.实例属性,2.动态代码块,3.构造方法{}
      1. 本质上没有动态代码,自动把代码块的内容优化放到构造方法中。把代码块放到类属性的前面,在代码块中输出属性,会报错,应该加this.
    3. 静态代码块(重点)
      1. 没有优化到构造方法。因为静态代码块不能访问类的非静态属性。

final

  • final可修饰的内容
    • 类(最终类) :没有子类,不可已被继承,
    • 方法(最终方法):不能被子类重写(override),当时可以被继承,可以使用。
    • 变量(最终变量)(常量)(不能被修改)
      • 字面常量:10,100
      • 符号常量:final int a=10;(a).
  • final赋值:
    • 1.修饰局部常量:声明并赋值,只能赋值一次。
    • 2.实例常量赋值
      • 声明是赋值。 final String name=“a”;
      • 2.构造方法中赋值 final String name; public constructor(String name){this.name=name;1}
    • 3.final 修饰类变量
      • 1.声明时赋值,
      • 2.在静态代码块赋值
  • final修饰类,地址不能修改,不可继承,但是属性可以修改。
  • 总结:
    • final修饰类:此类不能被继承。
    • final修饰方法:此方法不能被覆盖
    • final修饰变量:此变量值不能被改变。(无初始值,只允许赋值一次)
      • 局部常量:显示初始化。
      • 实例常量:显示初始化,动态代码块,构造方法
      • 静态常量:显示初始化,静态代码块
      • 基本类型常量:值不可变
      • 引用类型常量:地址不可变。

类加载

  • 类加载 .class从硬盘类加载到内存(按需加载) :String,Math,System均为final修饰的类。
  • 类加载会触发静态代码块的执行,仅此一次
    • 作用:可为静态属性赋值,或必要的初始行为。
  • 类加载时机:
    1. 创建对象
    2. 创建子类对象
    3. 访问静态属性
    4. 调用静态方法
    5. 主动加载:Class.forName(“全限定名”)

       

    6. Demo.show(); 首先会累加在Demo类,在堆中间开辟空间,首先为属性初始化,new

    7. Demo()=null,count1=0,count2=0;其次调用构造函数,count1 count2=1;其次从上至下执行静态属性,count2被覆盖为0,在调用show()所以count1=1,count=0;

      • abstract和final不可以一起使用
      • abstract和static不可以一起使用。
      • abstract和private不可以一起使用。
      • 抽象方法没有方法体,静态方法必须有方法体。
      • 静态方法可以继承,不能重写,没有多态

猜你喜欢

转载自www.cnblogs.com/lucky333/p/13403289.html