面向对象
专业术语
OOA: 面向对象分析(Object Oriented Analysis), 以面向对象的角度
对需求文档、原型图进行分析, 抽象出更高层次的类、对象、关系、功能
等维度, 属于分析层面的概念。
OOD:面向对象设计(Object Oriented Design),基于面向对象分析
的类、关系进行细化,根据封装、继承、多态等思想设计出具体的结构、
关系、层级等具体细节,通过UML一类的类图进行展示,属于设计层面的
概念。
OOP: 面向对象编程(Object Oriented programming),基于面向对
象设计的内容使用具体的编程语言进行实现,属于编码层面的概念。
特性
封装:
封装的含义有两个:
把对象的字段和方法存放在一个独立的模块中(类);
信息隐藏,尽可能隐藏对象的数据和功能的实现细节。
封装的好处:
1. 提高组件的重用性,把公用功能放到一个类中,谁需要该功能,直接调用即可
2. 保证数据的安全性, 防止调用者随意修改数据
JavaBean规范
1. 类必须使用public修饰
2. 必须保证有公共无参构造器
3. 字段使用private修饰(私有化)
4. 每个字段提供一对getter和setter方法
重载
发生在同一个类中,方法名必须相同,参数类型不同、参数个数不同、参数顺序不同,方法的返回值和访问修饰符可以不同。
继承:
面向对象的继承思想,可以解决多个类存在共同代码的问题。
被继承的类称为父类,继承父类的类称为子类。
父类:存放多个子类共同的字段和方法。
子类:存放自己独有的字段和方法。
子类继承父类的非私有成员(字段和方法),构造器除外。
子类可以拥有自己的字段和方法, 即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法(方法重写)。
抽象类
使用abstract修饰的类,称为抽象类。
一般的,抽象类以Abstract作为类名前缀,一眼就能看出是抽象类。
抽象类特点:
1. 抽象类不能创建对象,调用没有方法体的抽象方法没有任何意义。
2. 抽象类中可以同时拥有抽象方法和普通方法
3. 抽象类要有子类才有意义,子类必须覆盖父类的抽象方法,除非子类也是抽象类。
super
在子类方法中,调用父类被覆盖的方法,此时必须使用super;
super关键字表示父类对象,子类要访问父类成员时一定要使用super;
super只是一个关键字,内部没有引用(地址)。
super访问父类构造方法:
总结:
1. super调用构造方法必须写在子类构造方法的第一句。
2. 如果子类构造方法没有显示调用父类任何构造方法时,那么jvm会默认调用父类的无参构造super()
重写
是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同,返回值范围小于等于父类,方法修饰符大于等于父类,抛出的异常范围小于等于父类。另外,如果父类方法访问修饰符为private则子类就不能重写该方法。也就是说方法提供的行为改变,而方法的外貌并没有改变。
多态
顾名思义,表示一个对象具有多种状态,具体表现为父类的引用指向子类的实例。
多态特点:
1. 多态的前提,可以是继承关系(类与类),也可以是实现关系(接口和实现类),在开发中,一般都指接口和实现类之间的关系。
2. 引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;
3. 多态不能调用“只在子类存在但在父类不存在”的方法;
4. 如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。
接口
1. 接口表示一种规范,接口中定义了一系列抽象方法,接口可以被多个类实现
2. 实现类实现接口,必须实现接口中的所有抽象方法。
static
静态变量
在类中,用static关键字修饰的成员变量称为静态变量,归类所有,也称为类变量,类的所有实例/对象都可以访问,被类的所有实例或对象所共享。
静态变量的访问:
1. 类名.静态变量(推荐写法)
2. 对象/实例.静态变量
静态方法
static也可以修饰方法称为静态方法,归类所有,也称类方法。
静态方法访问方式:
类名.静态方法() (推荐)
对象.静态方法()
静态方法特性:
1. 静态方法中可以访问静态变量和类的其他静态方法
2. 实例方法中可以访问静态成员(静态变量和静态方法);静态方法不能访问实例成员
静态代码块
被static关键字修饰的代码块称为静态代码块。
静态代码块位于类的内部、方法的外部。
静态代码块只执行一次(jvm加载xx.class时执行),在构造代码块、构造方法前执行。
当类的字节码被加载到内存时,此时程序需要加载一些资源(读取资源文件、读取配置文件等),可以使用静态代码块,此时被加载进来的资源一般都可以被多个实例所共享。
枚举类
枚举是一种特殊的类,专门用于声明可罗列的常量值,定义格式:
public enum 枚举类名{
常量对象A,
常量对象B,
常量对象C;
}
我们自定义的枚举类在底层都是直接继承了java.lang.Enum类的。
public enum ClothType{
MEN, WOMEN, NEUTRAL;
}
枚举中都是全局公共的静态常量,可以直接使用枚举类名调用。
ClothType type = ClothType.MEN;
因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法。
String name = 枚举对象.name(); // 返回枚举对象的常量名称
int ordinal = 枚举对象.ordinal(); // 返回枚举对象的序号,从0开始
int ordinal = 枚举对象.ordinal(); // 返回枚举对象的序号,从0开始
注意:枚举类不能使用创建对象
public class EnumDemo{
public static void main(String[] args){
int ordinal = ClothType.MEN.ordinal();
String name = ClothType.MEN.name();
System.out.println(ordinal);
System.out.println(name);
new ClothType(); // 语法报错
}
}
引用类型
强引用:无论JVM内存是否足够,只要引用存在,都不会别回收。
软引用:SoftReference<引用类型>
在进行垃圾回收时,如果内存不够,标识为软引用的对象会被垃圾回收。
弱引用:WeekReference<引用类型>
只要进行垃圾回收,就会回收弱引用对象。
虚引用