面向对象的三大特征:封装、继承、多态。
有了封装,才有继承;有了继承,才能说多态。
一、封装
封装的作用
在代码级别上封装的作用:
一个类体当中的数据,假设封装之后,对于代码调用的人员来说,不需要关心代码的复杂实现,只需要通过一个简单的入口就可以访问了。另外,类体中安全级别较高的数据封装起来,外部人员不能随意访问,来保证数据的安全性。
总结:
- 保证内部结构的安全
- 屏蔽复杂,暴露简单
怎么进行封装
步骤:
- 属性私有化(使用private关键字进行修饰);
- 对外提供简单的操作入口:一个属性对外提供set和get两个方法。外部程序只能通过set方法修改属性,只能通过get方法获取属性的值。可以通过在set方法中设立关卡来保证数据的安全性。
强调:
-
set方法和get方法都是实例方法,不能带static;
不带static的方法都称为实例方法,实例方法的调用必须先new对象; -
set方法和get方法有严格的规范要求:
//set方法语法要求 public void set+属性名首字母大写(1个参数){ xxx = 1个参数; } //get方法格式要求 public 返回值类型 get+属性名首字母大写(无参){ return xxx; }
补充:实例方法和静态(static)方法
- 静态方法
静态方法是带static关键字的方法,是类的行为,调用方式:类名.方法
- 实例方法
不带static关键字的方法都称为实例方法,实例方法是对象的行为,它的调用必须先new对象,调用方式:引用.方法
java成员变量内存图
二、继承
继承的语法格式
java中继承的语法格式:
class 类名 extends 父类名{
类体;
}
继承的作用
- 基本作用:子类继承父类,代码可以得到复用。
- 主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。
继承的相关特性
-
B类继承A类,则称A类为超类(superclass)、父类、基类,B则称为子类(subclass)、派生类、扩展类;
-
Java不像C++支持多继承,Java只支持单继承,即Java中不允许这样写代码:
class C extends A,B{ }
。 -
虽然Java中不支持多继承,但可以通过多次继承间接继承多个父类。
class A{ } class B extends A{ } class C extends B{ } //C直接继承了B,还同时间接继承了A
-
Java中规定,子类继承父类,除构造方法不能继承之外,剩下的都可以被继承。但是父类的私有属性(private修饰的属性)无法在子类中直接被访问。
-
Java中的类没有显示的继承任何类,则默认继承object类。object类是Java语言提供的根类。
-
继承也有一些缺点:耦合度高。父类如果修改,子类会受牵连。
三、多态
//父类
public class Animal{
public void move(){
System.out.printlin("动物在移动");
}
}
public class Cat extends Animal{
//对move方法进行重写
public void move(){
System.out.printlin("cat走猫步");
}
//Cat子类特有的方法
public void catchMouse(){
System.out.printlin("猫会抓老鼠");
}
}
public class Bird extends Animal{
public void move(){
System.out.printlin("鸟儿在飞翔");
}
}
向上转型和向下转型
学习多态之前,需要先学习两个概念:
- 向上转型:子 —> 父(类似于自动类型转换 )
例如:Animal a = new Cat();
- 向下转型:父 —> 子(类似于强制类型转换)
例如:Cat c = (Cat) a;
什么时候使用向下转型:当要访问的是子类对象中“特有”的方法时,必须进行向下转型(c.catchmouse();
)。
注意:
Java中允许向上转型,也允许向下转型。无论是向上转型还是向下转型,两种类型之间必须有继承关系,没有继承关系编译器会报错。
什么是多态
多种形态,多种状态,编译和运行时有两个不同的状态。
- 编译期叫静态绑定。
- 运行期叫动态绑定。
例如:
Animal a = new Cat();
a.move(); //cat走猫步
分析:
- 编译的时候编译器发现a的类型是Animal,所以编译器会去Animal类中找move()方法。找到了,绑定,编译通过;
- 但是运行时和底层堆内存当中的实际对象有关,真正执行的时候会自动调用“堆内存中真实对象”的相关方法。
多态的典型代码:父类型的引用指向子类型的对象。
多态在开发中的作用
降低程序的耦合度,提高程序的扩展力。
public class Master{
public void feed(Dog d){}
public void feed(Cat c){}
}
//以上代码表示:Master和Dog以及Cat的关系很紧密(耦合度高),导致扩展能力很差
public class Master{
public void feed(Pet p){}
}
//以上代码表示:Master和Dog以及Cat的关系就脱离了,Master关注的是Pet类,这样Master和Dog以及Cat的耦合度就降低了,提高了扩展性