abstract关键字
abstract抽象就是不具体,不完整的含义
abstract在程序中用来描述抽象的事物和抽象的行为。
例如: 动物、吃、睡、水果
为什么存在抽象?
当描述一类事物的过程中,不断的去提取父类,越往上,属性和行为就变得越模糊不具体,也就越抽象。
抽象类:
定义格式:
abstract class Animal{
// ...
}
特点:
不能实例化其本身对象。
可以声明引用,实例化其子类
作用:
可以作为父类存在,定义子类的共性行为和属性
可以作为引用,使用多态
组成成分
- 可以定义属性
- 可以定义构造器
- 可以定义方法
- 可以定义抽象方法
总结
普通可以定义什么,抽象类都可以,和抽象类相比,多了可以定义抽象方法的特点,少了可以创建对象的能力。
抽象方法
什么是抽象方法?
abstract 修饰的方法就是抽象方法,抽象方法只有方法声明,没有方法实现
因为无法给出方法的具体实现,是一种不完整的方法,所以唤作"抽象方法"。
定义格式
abstract class Animal{
public abstract void jiao();
public void other(){
System.out.println("other ... ");
}
}
特点
- 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类
- 抽象类的子类,必须重写 抽象父类中的全部抽象方法,除非自己也是抽象类。
例:
abstract class Animal{
public abstract void jiao();
public void other(){
System.out.println("other ... ");
}
}
class Dog extends Animal{
@Override
public void jiao(){
System.out.println("汪汪 ... ");
}
}
总结
普通可以定义什么,抽象类都可以,和抽象类相比,多了可以定义抽象方法的特点,少了可以创建对象的能力。
static 关键字
- 意为 静态的,可以修饰 属性和方法,修饰属性,称为静态属性,修饰方法称为静态方法。
class Tool{
public static PI=3.14; // 静态属性
public static void sum(int a,int b){
// 静态方法
sout(a+b);
}
}
- 静态的内容只有一份,全局唯一,每个对象共享,但不属于每个对象。
实例的每个都有一份,静态的只有一份,任何对象该,都会·影响到其他对象
- 静态属性在类加载时就完成 空间的开辟和初始化,不依赖与某个对象调用。
- 静态属性和方法通过类名调用 类名.属性 类名.方法
public static void main(String[] args){
Tool.sum(10,20)
sout( Tool.PI )
}
- 访问 、变量问题
静态方法中 不可 访问 实例属性 也不可使用 this super 关键字
实例方法中 可以访问静态 和 非静态的 属性
- 静态代码块
定义语法
static{
//
}
优先加载并且只加载一次(在JVM类加载的时候就创建了)
父子静态类继承:
父类静态 》 子类静态 》 父类动态 》 父类构造器 》子类动态 》子类构造器
静态代码块的作用 是用来初始化 静态变量的,在类加载时执行一次。以下情况会导致类加载:
- 创建对象
- 创建子类对象
- 调用静态属性和方法
- 强制加载 Class.forName(“类全名(包目录加类名)”)
扩展类加载:
jvm首次使用某个类,需要通过CLASSPATH查找该类的.clss文件。将.class文件中对类的描述信息加载到内存中,进行保存
从类加载到初始化:
特点:
- 静态方法允许直接访问静态方法
- 静态方法不能直接访问非静态成员
- 静态方法中不允许使用this或是super关键字
- 静态方法可以继承,不能重写,没有多态
总结:
静态方法为什么不能用非静态方法? - 实例方法是对象调用的方法,也就是对象已经存在。而静态的内容在类加载就完成了
- 静态 方式后调用的方法,此时对象为创建,实力变量不存在,this不存在,super不存在
扩展 动态代码块
语法:
{
//代码块
}
特点:
- 先于构造器执行
- 每加载一次执行一次
作用:
可以为实例属性赋值,或必要的初始行为
final常量
译为最终的 ,可以修饰 变量 方法 类。
- 修饰变量,定义一个常量
此变量不能被改变(常量)
final int a ;
a=101;
//a=202; 报错
- 修饰方法,最终方法不可以被重写
意为最终方法,不支持子类以覆盖的形式修改
class ABC{
public final void abc() {
System.out.println("abc");
}
}
class ABCSon extends ABC{
/* 重写报错 , 这个方法不允许被重写
* @Override public void abc() {
*
* }
*/
}
- 修饰类,不可被继承
String Math System均为final修饰的类,不能被继承
final class DEF{
public void abc() {
System.out.println("abc");
}
}
/* 继承报错,DEF 不允许被继承
* class DEFSon extends DEF{
*
* }
*/
注意
abstract 不可以和 private static final 连用
应用场景
实力常量:
- 实例常量不在提供默认值,必须手动赋予初始值。
- 赋值时机:显示初始化、动态代码块、构造方法
- 注意:如果在构造方法中为实力常量赋值,必须保证所有的构造方法为实例常量赋值
静态常量:
- 静态常量不在提供默认值,必须手动赋予初始值
- 赋值时机:显示初始化、静态代码块
对象常量:
- final 修饰基本类型,值不可变
- final修饰引用类型,地址不可变
- final修饰类不能被继承