一、抽象类
1、引入
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
注意:
(1)抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
(2)由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
抽象方法定义格式:
public abstract 返回值类型 方法名(参数);
抽象类定义的格式:
abstract class 类名{
}
抽象类需要注意以下几点:
(1)abstract放在class前,指明该类是抽象类
(2)abstract放在方法声明中,则该方法是抽象方法,抽象方法没有方法体
(3)一个抽象类可以含有多个抽象方法,也可以含有已实现的方法
(4)抽象方法必须在子类中被实现,除非子类是抽象类
例如:代码是错误的:
Shape circle= new Shape(3); //抽象类不能实例化
可以通过如下方式来实例一个抽象类:
Shape someShape;
//引用Circle类的实例对象
someShape = new Circle(5);
someShape.callArea();
2、final
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。
主要用法:
(1)修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
(2)修饰方法参数,表示在变量的生存期中它的值不能被改变;
(2)修饰方法,表示该方法无法被重写;
(3)修饰类,表示该类无法被继承。
例如:
final String home ="南极";
public final void print () {
//…
}
public final class Penguin extends Pet {
//…
}
二、多态
1、引入
面向对象编程有三大特性:封装、继承、多态。
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。
对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。
继承是为了重用父类代码。,同时继承也为实现多态做了铺垫。
所谓多态就是多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不
同的实例而执行不同操作
多态的优点
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
多态存在的三个必要条件
1. 继承
2. 重写
3. 父类引用指向子类对象
2、示例
1.创造动物类:
// 动物类
class Animal {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 动物类里面有叫和吃两个方法
public void cry() {
System.out.println("我不知道叫什么");
}
public void eat() {
System.out.println("我不知道吃什么");
}
}
2.分别创造猫类和狗类(他们继承于动物类):
// 狗类继承于动物类
class Dog extends Animal {
// 覆盖(重写)方法
public void cry() {
System.out.println("旺旺");
}
public void eat() {
System.out.println("我是狗,我爱吃骨头");
}
}
// 猫类继承于动物类
class Cat extends Animal {
// 覆盖(重写)方法
public void cry() {
System.out.println("喵喵");
}
public void eat() {
System.out.println("我是猫,我爱吃鱼");
}
}
3.创建食物类:
// 食物类
class Food {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 食物类里面让它有一个方法
public void showName() {
}
}
4.猫和狗都有自己不同的爱吃的食物(他们继承于食物类):
// 鱼(食物的一种)继承于食物
class Fish extends Food {
public void showName() {
System.out.println("食物:鱼");
}
}
// 骨头(食物的一种)继承于食物
class Bone extends Food {
public void showName() {
System.out.println("食物:骨头");
}
}
5.主人类(就可以将动物和对应的食物统一起来):
// 主人类 存在一種餵食方法
class Master {
// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
// 有了多态,以后即使再来好多动物,用这一个函数就可以了
public void feed(Animal an, Food f) {
an.eat();
f.showName();
}
}
6.最后,方法的调用(测试):
public class DuoTaiDemo {
public static void main(String args[]) {
Master master = new Master();
master.feed(new Dog(), new Bone());
// hin方便,可以再试试
master.feed(new Cat(), new Fish());
}
}
结果: