Abstract

含义:

        抽象的

修饰的内容

:        类: 使用abstract修饰的类称为抽象类

          抽象类: 特点:不能直接创建对象

                 语法: 访问权限修饰符 abstract class 类名 extends 父类{ } 注意:除了不能创建对象以外,其他的与普通的类一样

         方法: 使用abstract修饰的方法称为抽象方法

                抽象方法: 特点:没有方法体 语法: 访问权限修饰符 abstract 返回值类型 方法名(形参列表);

        注意: 1,有抽象方法的类,一定是抽象类.抽象类不一定有抽象方法

                 2,子类继承与抽象类,要么重写所有抽象方法,要么自己也是抽象类

        Final

        含义:最终的不可修改的

        可以修饰:

                 类: final修饰的类,称为最终类

                变量: final修饰的变量,称为常量         

                        方法: final修饰的方法,不能被重写

                最终类: 特点:不能被其他类继承 语法: 访问权限修饰符 final class 类名 ...{ 属性 方法 构造函数 }

                修饰的变量: 特点:final修饰的变量不能被修改. 又名:final修饰的变量又名常量

                        成员变量(属性): 语法:访问权限修饰符 fianl 数据类型 属性名 = 值;

                                1,必须在声明时赋值

                                 2,属性值不能被修改

                        局部变量: 语法:fianl 数据类型 变量名 = 值;

                                1,可以将声明与赋值分开,但是只能赋值一次

        注意:常量名要使用全大写

        修饰方法:

                 特点:不能被重写

                语法: 访问权限修饰符 final 返回值类型 方法名(形参列表){ 方法体 }

STATIC

        含义:静态的,共有的

        可以修饰: 成员变量(属性) 方法 代码块 内部类

                修饰成员变量: 称为:静态属性

                        特点: 1,static修饰的属性属于该类的所有对象共有的

                                2,可以使用类名调用,也可以使用对象调用

                                语法: 访问权限修饰符 static 数据类型 变量名; 如: class A{ public static int num; public A(int num){ this.num = num; } public int getNum(){ return num; } } class Test{ public static void main(String[] args){ A a1 = new A(11); A a2 = new A(1); A a3 = new A(99); A a4 = new A(0); } }

                修饰方法: 称为:静态方法

                        特点: 1,可以使用类名直接调用,也可以使用对象名调用

                        语法: 访问权限修饰符 static 返回值类型 方法名(形参列表){ 方法体 }

                        注意: 1,静态方法中可以直接使用静态成员(静态属性与静态方法),不能直接使用非静态成员(非静态属性 或非静态方法)

                        2,静态方法中不能使用this或super关键字

                修饰代码块: 称为:静态代码块

                        特点: 在当前类被加载时执行一次 语法: static{ } 定义的位置:类中方法以外 注意: 一个类只会被加载一次

类的加载时机

1,首次创建该类对象时

2,未创建该类对象,但是首次创建其子类对象时

3,使用类名第一次调用该类中的静态属性或静态方式时

4,获取该类的类对象.使用反射技术对该类进行操作时(后期讲反射时说)

静态与非静态的区别

 静态属性

         1,属于该类的所有对象 2,可以使用类名直接调用,也可以使用对象名调用 3,随着类的加载而生成,随着类的销毁而销毁

 非静态属性

         1,属于该对象 2,只能使用对象名调用 3,随着对象的创建而生成,随着对象的销毁而销毁 静态方法与非静态方法

 静态方法:

        1,可以类名直接调用,也可以使用对象名调用 代码执行流程(了解) 2,方法体中不能直接使用非静态成员(静态方法与静态属性) 3,不能使用this与super关键字

非静态方法:

        1,只能使用对象名调用 2,方法体中能直接使用非静态成员(静态方法与静态属性) 3,能使用this与super关键字

静态代码块与非静态代码块

        静态代码块 类加载时调用

        非静态代码块 创建该类对象时被调用

代码执行流程

1,将java文件编译为class文件 编译

2,jvm加载class文件 加载

3,执行class文件中的代码 运行

步骤:

        1,编译

        2,加载         

                1,将class中的内容放到对应的内存区域 静态区,常量区,代码区,方法区,堆栈

                2,给类的静态属性赋初值

                3,执行静态代码块中的代码

        3,运行

                main方法进入后,从上到下依次执行

                在运行过程中如果发现了这个类第一次使用那么就会加载这个类

                在运行过程中创建该类对象时

                        给属性赋初始值 先

                        执行该类的非静态代码块

                         执行调用的构造函数

总结: 先加载静态 然后非静态

问题: 继承关系中父类与子类都有静态与非静态的成员,执行的顺序应该是怎么样呢?

分析: 创建子类对象时会先创建父类对象

         所以

        加载父类

                 静态属性 静态方法 执行静态代码块

        加载子类 静态属性 静态方法 执行静态代码块

        创建父类 非静态属性 非静态方法 非静态代码块 父类构造函数

        创建子类 非静态属性非静态方法 非静态代码块 子类构造函数

记忆: 父静,子静,父非静,父构造,子非静,子构造