SentralLiu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

生活中的抽象:从网上搜索动物类,可以具体化子类对象;但是不能具体化动物的对象

程序中的抽象类:有一个类不能够具体化出来对象,这个类就是抽象类
程序中的抽象方法:往往在抽象类中,有这个方法但不能具体实现,这个方法叫做抽象方法

例如: 动物类不能具体化,这个动物类就是抽象类;
       动物类一般都有叫的方法,但不能具体实现,叫的方法我们可以设置为抽象方法; 
       抽象方法用处:作为一个模板,该抽象类的子类必须完成抽象方法的重写

案例: 动物类都有叫的方法,狗类,猫类(子类)完成具体实现
抽取多态: 狗,猫是动物,具备叫的行为      

===========================抽象类概述===========================

抽象类: 限制该类不能被具体化
抽象类的好处:1.作为模板使用, 2.更自然的使用多态

抽象类的特点整理:
1.抽象类能否实例化对象?    不能
2.能否有构造方法?                可以有
3.抽象类中能否有非抽象方法?   可以有
4.抽象类中能否没有抽象方法?   可以,但一般都要写抽象方法
5.父类是抽象类,子类必须重写父类方法吗?    不是必须的,可以把自身变为抽象类
6.有抽象方法的类必须是抽象类吗?  是的

abstract class Animal{
    public Animal() {}  //可以有构造方法,交给子类调用
    
    public void eat(){}  //有非抽象方法
    
    //抽象类中的一些方法,往往有这个方法,但没法实现,这样的方法设置为抽象方法
    //抽象方法作为模板
    public abstract void bark();
    
}

 //The type Dog must implement the inherited abstract method Animal.bark()
//父类为抽象类,子类有两种处理方案
//1.子类要重写父类的方法
//2.将子类也变为抽象类,交给Dog子类去完成
class Dog extends Animal{

    @Override
    public void bark() {
        System.out.println("狗正在旺旺旺地叫...");
    }
    
    public void run() {
        System.out.println("狗正在跑...");
    }
}

abstract class Cat extends Animal{
}

public class Test1 {
    public static void main(String[] args) {
        //Animal animal = new Animal();  //不合适
        
        //抽象类实现多态: 抽象类指向子类对象,即可调用子类重写方法
        //Dog dog = new Dog();  //? 
        Animal animal = new Dog();  //多态,扩展性,维护性更强
        animal.bark();
        //animal.run();  //不能调子类独有方法(当次动物看待,只能调动物的方法或子类重写的)
    }
}

===========================抽象类案例===========================
 案例: 老师开着法拉利牌自行车去上班

改造: 自行车,汽车,地铁,飞机等都是交通工具,都具备运转功能
将交通工具类变为抽象类,通过抽象类实现多态
分析: 交通工具类不能具体化---抽象类
       交通工具的运行功能---有这个功能,但不知道如何实现,抽象方法
 

abstract class JiaoTongTool{
    public abstract void run();
}

class Bike extends JiaoTongTool{
    @Override
    public void run() {
        System.out.println("自行车运转: 轮子转啊转,以每小时50公里速度~");
    }
}

class Car extends JiaoTongTool{
    @Override
    public void run() {
        System.out.println("汽车运转:以每小时100公里速度前进~");
    }
    
}

class Teacher{
    //以传参形式通过抽象类实现多态:
    public void start(JiaoTongTool tool) {
        tool.run();  //不要看谁调的,要看谁传的
    }

}

public class Test2 {
    public static void main(String[] args) {
        //抽象类实现多态
        Teacher teacher = new Teacher();
        teacher.start(new Bike());  //1.老师开自行车
        teacher.start(new Car());     //2.老师开汽车

    }
}

posted on 2021-10-27 17:34  SentralLiu  阅读(81)  评论(0)    收藏  举报