8. abstract 、static 和final修饰符

8. abstract 、static 和final修饰符

8.1 abstract 抽象的

  • 类 抽象类

    抽象类 只能声明引用,不能创建对象

    供子类去继承

    生活中,抽象类时从不同子类中抽象出的父类,自身不存在对象 如:动物类,交通工具类

  • 方法 抽象方法

    只有方法声明,没有方法实现 方法实现部分用分号

    只声明了对象具有什么功能,没有定义对象如何实现该功能

8.1.2抽象类和抽象方法的关系

如果一个类具有抽象方法,那么这个类就必须是抽象类

抽象类中未必有抽象方法

子类继承抽象类,如果子类不希望成为抽象类,就必须实现父类中所有的抽象方法

一个引用可以调用其引用类型中声明的所有方法,包括抽象方法

声明和实现分离,声明在父类,实现留给子类 ------资料类的共性放在父类

8.1.3多态和抽象的作用

  1. 提高代码的弱耦合性

    8. abstract 、static 和final修饰符 

     

抽象类可以作为便准,约定了对象应该具备的方法 规格

隔离了标准的使用者和标准的实现这 从而实现弱耦合

8.2static 静态的

  • 成员变量(属性)静态属性

    全类共有 不属于任何对象

    可以直接用类名访问

  • 方法 静态方法

    可以直接用类名调用

    静态方法只能访问类的静态成员,不能访问类的非静态成员,不能出现this

    子类可以用静态方法覆盖父类的静态方法,没有多态

    如果我们对引用调用静态方法,编译器会将代码变为:对引用类型调用静态方法

    package day05;
    ​
    /**
     * @author 小白孙佳遥 想杨屎郡了
     * static 静态
     */
    public class textStatic {
        public static void main(String[] args) {
            Myclass mc1 =new Myclass();
            Myclass mc2 =new Myclass();
            mc1.a++;
            mc2.b++;
            System.out.println(mc2.a);
            System.out.println(mc2.b);//21
            System.out.println(Myclass.b);
            Myclass mc = new Myclass();
            mc.print();
            Myclass.print();//静态方法直接用类名调用
             ClassA a=new ClassB();
            a.method();//执行时变为 ClassA.method();
        }
    ​
    }
    class Myclass{
        int a=10;
        static int b= 20;
        public static void print(){
            //System.out.println(a);  error!静态方法只能访问类的静态成员,不能访问类的非静态成员
            System.out.println(b);
        }
    }
    class ClassA{
        public static void method(){
            System.out.println("ClassA method");
        }
    ​
    }
    class ClassB extends ClassA {
        public static void method(){
            System.out.println("Class B method");
        }
    }

  • 初始代码块 静态初始代码块

class A{
   static {
       Systerm.out.println("Init A");
   }
}
  • 在类加载的时候执行一次

    类加载:当JVM第一次使用一个类的时候,它需要将这个类对应的字节码文件读入JVM,从而获取这个类的全部信息(类的父类,有哪些属性,方法,构造方法等等),并保存起来。(保存在JVM的方法区) 在JVM运行的过程中,一个类只会加载一次。

    public class textStaticInitCode {
        public static void main(String[] args) {
            new A();
            new A();
    ​
        }
    }
    class A{
        static {
            System.out.println("Init A");
        }
        static int m =10;
        public A(){
            System.out.println("A()");
        }
    }
    // 输出   InitA  A()  A() 

什么时候会类加载?

第一次创建该类对象

第一次访问类的静态成员

加载子类时,也可能需要先加载父类

如果,仅仅是生命类的引用,不需要进行类加载

类加载的过程?

  1. 如有必要,先加载父类

  2. 为类的静态属性分配空间,分配默认值

  3. 按照代码的顺序,初始化静态属性,或是运行静态初始代码快

8.3final

  • 类 该类不能被继承 不能拥有子类

  • 方法 该方法不能被子类覆盖

  • 变量 成员变量 + 局部变量 常量 一旦赋值,不能改变

    当final修饰成员变量时,系统不提供默认值,就必须在初始化属性时或是构造方法中赋值一次。

    8.4 修饰符组合

private static final 都不能和 abstract 同时出现

上一篇:【Complex-YOLO: 点云实时目标检测】


下一篇:YOLO_V1总结