基本概念:对象、类、参数和方法
一个对象由一组状态和行为构成。状态指一个对象中包含的数据,在Java中指对象的字段。行为指一个对象所支持的行动,在Java中称为方法(方法是函数的面向对象说法)。
一个类定义了方法和字段。方法和对象统称为成员。
类定义了类型和实现,类型决定了它将会在哪里使用,实现定义了这个对象的行为方式。粗略地说,一个类的方法就是它的API,定义了用户如何与实例进行交互。
接口
Java中的接口是一个实现ADT的十分有用的语言机制。Java中的接口是一个方法签名的列表,不包含任何方法体或者字段。一个实现接口的类需要提供接口中所有方法的方法体。一个类可以有多个实现接口,一个接口可以有多个实现类。
接口可以确定ADT的规约,类用于实现ADT。实际中尽量使用接口来定义变量,例如:
Set<Criminal> senate = new HashSet<>();//正确写法
HashSet<Criminal> senate = new HashSet<>();//不要这样做
使用接口定义变量和参数,除非你确切地知道一种实现已经足够了。
这样做能够支持实现的修改,防止对实现细节的依赖。
封装和信息隐藏
区分一个设计良好的模块和设计较差的模块的重要因素是是否对其他模块隐藏了其内部信息与实现细节。
我们要求:
- 使用接口类型定义变量。
- 客户端仅使用接口中定义的方法。
- 客户端代码无法直接访问属性。
继承和重写
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
多个类可以称为子类,单独这个类称为父类、超类或者基类。子类可以直接访问父类中的非私有的属性和行为。通过 extends 关键字让类与类之间产生继承关系。
class Student extends Person{} //Student是子类,Person是父类
继承的作用:
- 提高代码的复用性。
- 让类与类之间产生了关系,是多态的前提。
子类中出现与父类一模一样的方法时(除了权限修饰符,权限修饰符大于等于不包括private,返回值类型,方法名和参数列表相同),会出现覆盖操作,也称为重写或者复写。
父类私有方法,子类看不到,因此父类私有方法的重写也就无从谈起。
覆盖注意事项:
- 覆盖时,子类方法权限一定要大于等于父类方法权限;
- 静态只能覆盖静态。
覆盖的使用场景:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。
方法重写和重载有什么区别?
方法的重写用在子类方法与父类方法一模一样时,除权限修饰符,返回值类型,方法名和参数列表都是相同的。
重载用在同一个类中各方法方法名相同,参数列表不同(与返回值类型没有关系)的情况。
class Shape{
public void draw(){
System.out.println("绘制图形");
}
}
class Cycle extends Shape{
@Override
public void draw() {//子类Cycle对父类Shape的draw方法的重写
System.out.println("圆形");
}
}
class Rect extends Shape{
@Override
public void draw(){//子类Rect对父类Shape的draw方法的重写
System.out.println("长方形");
}
public void draw(int a){//子类Rect中对draw方法的重载
System.out.println("长方形,边长为" + a);
}
}