栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面向对象—抽象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面向对象—抽象

目录

1.抽象类

1.1抽象类概述

1.2抽象类的特点

1.3抽象类的成员特点


1.抽象类

回想一下前面学习过的猫狗案例,我们提取出了一个动物类,这个时候我们可以通过Anima a = new Animal();来创建一个动物类对象。其实这个是不对的,因为我说一个动物,你不知道我说的哪个动物,只有看到了具体的动物才知道这是什么动物,所以动物本身并不是具体的一个事物,而是一个抽象的事物。只有真正的例如:猫、狗;它们才是具体的事物,所以说我们前面的设计是有问题的。同理我们也可以想一想不同的动物它吃的是不同的食物,所以呢我们也不应该在动物类中给出具体的吃的方法实现,只应该给出一个吃的方法声明,不给方法体。接下来就要说一下:

1.1抽象类概述

在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

直接代码演示:

public abstract class Animal {
    //1.动物类里面有一个eat方法
    //4.注释调eat方法
//    public void eat(){
//        System.out.println("吃东西");
//    }

    
    public abstract void eat();//抽象法不能有主体所以要分号结尾
}
class AnimalDemo {
    public static void main(String[] args) {


        //2.在测试类里面创建了动物对象,并调用了eat方法
        //6.定义好抽象方法后这里会报错,因为:动物类是抽象的;不能创建对象
//7.        Animal a = new Animal();(先了解一下,怎么改后面来说)
//7.        a.eat();//吃东西

        

    }
}

1.2抽象类的特点

先到程序中演示再小结:

public abstract class Animal {
    //2.类和方法都要加上abstract,才不会报错
    public abstract void eat();

    //3.再写一个方法
    public void sleep(){
        System.out.println("睡觉");
    }
    

    
}
class Cat extends Animal{
    //8.继承之后会报错,只要重写方法后就好了
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    

}
//14.让他继承自Animal
abstract class Dog extends Animal{
    

    
}



class AnimalDemo {
    public static void main(String[] args) {
        //6.类有了,创建对象
//        Animal a = new Animal();
        

        //9.现在创建对象就要采用多态的形式:
        Animal a = new Cat();
        //10.调用重写方法和动物类的非抽象方法
        a.eat();//猫吃鱼
        a.sleep();//睡觉

        

        
    }
}

小结抽象类的特点:

  • 抽象类和抽象方法必须使用abstract关键字修饰。

public abstract class类名 { }

public abstract void 方法名();

  • 抽象类中不一定有抽象方法,由抽象方法的类一定是抽象类
  • 抽象类不能实例化

抽象类如何实现实例化呢?

参照多态的方式,通过子类对象实例化,这叫抽象类多态。

  • 抽象类的子类

要么重写抽象类中的所有抽象方法。

要么是抽象类。

1.3抽象类的成员特点

先到程序中演示再小结:

public abstract class Animal {
    //1.研究抽象类里面可以有那些成员,看看抽象类和其他类是否一样
    private  int age = 20;//没问题
    private final String city = "北京";//也没问题
    

    
    public void show(){
        //4.在方法内来更改变量/常量的值
        age = 40;//没有问题,因为这里没用final修饰
//        city = "四川";//报错,因为city是常量
        System.out.println(age);
        System.out.println(city);
    }

    //5.来一个抽象方法
    public abstract void eat();//也是可以的,说明抽象类中也是包含抽象方法的
    //6.由此可见,抽象类中的方法可以是抽象的也可以是非抽象的。

    //7.验证抽象类里面是否可以有构造方法
    public Animal(){
        //8.没报错,说明它可以有构造方法
    }
    

    //10.写一个带参的构造方法
    public Animal(int age) {
        this.age = age;
    }

    

    //12.eat抽象方法有什么用呢?新建一个类→13.
}

class Cat extends Animal{
    //14.改写后就没有问题了
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
class AnimalDemo {
    public static void main(String[] args) {
        //15.创建一个对象,调用方法
        Animal a = new Cat();
        a.show();//这里输出的是Animal里非抽象方法show的内容
        a.eat();//这里输出的是Animal子类Cat中重写的eat方法
    }
}

小结抽象类的成员特点:

  • 抽象类可以有成员变量

可以是变量;

也可以是常量。

  • 抽象类可以有构造方法

有构造方法,但是不能实例化;

那么构造方法的作用是什么呢?

用于子类访问父类数据的初始化。

  • 抽象类可以有成员方法

可以有抽象方法:限定子类必须完成某些动作。

也可以有非抽象方法:提高代码复用性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874745.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号