1.static关键字
2.abstract关键字
static关键字的使用
static :静态的,Java中所有跟静态相关的,都是用static修饰
1) 用static修饰的变量--------静态变量
1.1) 属于类,不属于某个对象,无论创建多少个对象都只有一份,全体对象共享这同一份 , 每当执行Java程序的时候,会自动把.class字节码文件加载到方法区中
1.2) 常常通过类名点来访问
1.3) 何时用: 所有对象所共享的数据(图片、音频、视频等)
变量之间的关系:
成员变量:在类中声明的变量
成员变量分类:
1.实例变量:属于每个对象共有的属性
2.静态变量:是属于类的,只有一份,全体对象共享这同一份
3.常量:是一个不变的常数
2) 用static修饰的方法--------静态方法
2.1) 属于类的,存储在方法区中,只有一份
2.2) 常常通过类名点来访问
2.3) 静态方法是属于类的,不属于对象,所以在静态方法中没有隐式的this关键字,使用静态方法不能访问实例变量
main方法也是个静态方法,所以在main方法中也不能直接访问实例变量
2.4) 何时用: 方法的操作与对象无关
3)用static修饰的代码块--------静态块
结构: static{}
3.1) 在类被加载期间自动执行,因为类只被加载一次,所以静态块只执行一次
3.2) 何时用: 初始化/加载静态资源(图片、音频、视频等)
4)用static final修饰的变量-------静态常量
常量一般用于声明不会改变的量
在开发中一般把一个固定 不变的值声明为静态常量
静态常量必须用static和final同时定义
4.1) 必须声明同时初始化
4.2) 通过类名点来访问,不能被改变
4.3) 建议: 常量名所有字母都大写,多个单词之间用_ 分隔
static final int NUM=18;
4.4) 编译器在编译时会将常量直接替换为具体的值,效率高
4.5) 何时用: 数据永远不变、经常使用
abstract关键字的使用
1) 用abstract修饰的类--------抽象类
1.1) 如果一个类中没有包含足够的信息来描述一个具体的对象,那么这个类就是个抽象类
1.2) 抽象类不能被实例化
1.3) 抽象类是需要被继承的
1.3.1) 派生类要重写所有抽象方法----------变不完整为完整
1.3.2) 派生类也声明为抽象类---------------不常用
2) 用abstract修饰的方法--------抽象方法
2.1) 如果在父类中的方法功能不明确,不完整,那么就可以把这个方法定义为抽象方法
2.2) 抽象方法没有方法体,连大{}都不能写
修饰符 abstract 返回值类型 方法名();
2.3) 抽象方法必须放在抽象类中,因为抽象方法是不完整的,所以抽象方法所在的类也必须定义为抽象类
2.4) class 类名 继承抽象类: 由于抽象类是不完整的,所以抽象类需要被继承,子类继承后必须重写父类中的方法,给一个具体的实现
3)抽象类的意义:
3.1) 封装派生类所共有的属性和行为------代码复用
3.2) 为所有派生类提供统一的类型---------向上造型
3.3) 抽象类中包含抽象方法,为所有子类提供了了统一的入口(能点出来),派生类的具体实现不同,但入口是一致的
知识点补充:
1.
问: 派生类既然还是需要重写的,那还要抽象方法step()干什么?
答: 当向上造型的时候,通过超类的引用能点出来---------但是最终调用的还是派生类重写之后的
问: 不设计成抽象方法,就设计为普通方法,为什么不可以?
答: 若把step()设计为普通方法,则派生类中可以重写也可以不重写,这样就达不到统一的效果的
很多时候做抽象方法是目的就是为了加限制、做统一
2.代码设计规则:
设计规则:
1.1 将所有派生类所共有的属性和行为,抽到超类中
2.2 所有派生类的行为都一样,设计普通方法
所有派生类的行为都不一样,设计为抽象方法
3.3 将部分派生类所共有的行为,抽到接口中
接口是对继承的单根型的扩展-------------实现多继承
3.
堆: new出来的对象(包括实例变量)
栈: 局部变量
方法区: .class字节码文件(包括方法、静态变量)
成员变量:
实例变量: 没有static修饰,属于对象的,存储在堆中,有几个对象就有几份,通过对象点来访问
静态变量: 有static修饰,属于类的,存储在方法区中,只有一份,通过类名点来访问