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方法进入后,从上到下依次执行
在运行过程中如果发现了这个类第一次使用那么就会加载这个类
在运行过程中创建该类对象时
给属性赋初始值 先
执行该类的非静态代码块
执行调用的构造函数
总结: 先加载静态 然后非静态
问题: 继承关系中父类与子类都有静态与非静态的成员,执行的顺序应该是怎么样呢?
分析: 创建子类对象时会先创建父类对象
所以
加载父类
静态属性 静态方法 执行静态代码块
加载子类 静态属性 静态方法 执行静态代码块
创建父类 非静态属性 非静态方法 非静态代码块 父类构造函数
创建子类 非静态属性非静态方法 非静态代码块 子类构造函数
记忆: 父静,子静,父非静,父构造,子非静,子构造