Java基础知识(十五)(面向对象--6)抽象类与多态

1、抽象类

      我们把一个不具体的功能,叫做抽象方法,而如果一个类中有抽象方法,

      我们就把这个类称之为抽象类。

2、抽象类的特点:
      (1)抽象类和抽象方法都要用一个关键字修饰:abstract
                    修饰一个类 放在class的前面
                        举例: abstract class Animal3{}
                    修饰一个方法 一般是放在权限修饰符后面
                        定义一个抽象的show方法
                        举例:public abstract void show();
     (2)有抽象方法的类一定要是抽象类,抽象类不一定要有抽象方法,具体的类中不能有抽象方                法,抽象类中既可以存在抽象方法,也可以存在有方法体的方法。
     (3)抽象类不能被实例化
                    既然不能被实例化,那写在抽象类中的方法如何被调用呢?
                    抽象类如何创建呢?
                    通过多态的形式,使用具体的子类去实例化调用方法,专业术语称之为:抽象多态
   (4)如果继承抽象类的是一个具体的子类,需要重写该抽象类中所有的抽象方法
       如果继承抽象的也是一个抽象类,可以不去重写父类中的抽象方法,也可以选择性的去重写。

//定义了一个抽象类,叫Animal3
abstract class Animal3{
    //注意:
    //抽象方法没有方法体{},连大括号都没有,直接以分号结尾
    //java: 抽象方法不能有主体
//    public abstract void eat(){};
    public abstract void eat();

    public abstract void drink();
}

class Dog3 extends Animal3{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public void drink() {
        System.out.println("狗喝水");
    }
}

//class Demo2{
//    public abstract void fun1();
//}

abstract class Demo2{
    public abstract void fun();
    public abstract void fun2();
}

abstract class Demo3 extends Demo2{
    @Override
    public void fun() {
        System.out.println("抽象类Demo3中重写了fun方法");
    }
}

public class AbstractDemo1 {
    public static void main(String[] args) {
        //java: com.shujia.wyh.day11.Demo2是抽象的; 无法实例化
//        Demo2 demo2 = new Demo2();

        //利用具体子类多态形式创建对象
        //抽象多态的形式
        Animal3 a = new Dog3();
        a.eat();
        a.drink();


    }
}

3、抽象类的成员的特点:
        (1)成员变量:
            既可以是变量,也可以是常量
        (2)构造方法:
            可以存在构造方法,我们上一个程序中,才总结出抽象类不能被实例化,这里构造方法意               义是什么?
            我们之前在继承中还说过要想初始化子类,必须先初始化父类,所以这里构造方法是提供              初始化父类的作用
       (3)成员方法:
            可以是抽象方法,但是具体的子类必须要重写该方法
            也可以不是抽象方法,提高代码的复用性。

abstract class Animal4{
    int a = 20;
    final int b = 100;
    Animal4(){
        System.out.println("这是Animal4中无参构造方法");
    }

    public abstract void eat();

    public void show(){
        System.out.println("父类中不是抽象方法的show");
    }

}

class Cat4 extends Animal4{

    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

public class AbstractDemo2 {
    public static void main(String[] args) {
        Animal4 a = new Cat4();
        System.out.println(a.a);
        System.out.println(a.b);
        a.eat();
        a.show();
    }
}

4、 (1)一个类如果没有抽象方法,也可以定义为抽象类
      (2)抽象类中可以没有抽象方法
      (3)抽象类不能被实例 

      (4)抽象类中可以存在哪些关键字?
        abstract关键字不能和哪些关键字共存?
            private
            static
            final

abstract class YeTi{
    //Java中的所有的类都有一个共同的父类:Object
//    YeTi(){
//        // super()
//    }

    //abstract可以和public关键字共存
    public abstract void show();


    //private和abstract关键字冲突
//    private abstract void show2(); // java: 非法的修饰符组合: abstract和private

    //static和abstract关键字冲突
//    static abstract void show3();  // java: 非法的修饰符组合: abstract和static

    //final和abstract关键字冲突
//    final abstract void show4();  // java: 非法的修饰符组合: abstract和final




}

public class AbstractDemo3 {
    public static void main(String[] args) {

    }
}

5、抽象类改进猫狗案例

abstract class Animal5{
    //定义一个吃饭的抽象方法,不给出具体的实现
    public abstract void eat();

    //定义一个睡觉的抽象方法,不给出具体的实现
    public abstract void sleep();
}

//alt+enter
class Dog5 extends Animal5{

    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public void sleep() {
        System.out.println("狗侧着睡");
    }
}

class Cat5 extends Animal5{

    @Override
    public void eat() {
        System.out.println("猫吃🐟");
    }

    @Override
    public void sleep() {
        System.out.println("🐱趴着睡");
    }
}

public class AbstractTest1 {
    public static void main(String[] args) {
        //抽象多态创建一个对象
        Animal5 a = new Dog5();
        a.eat();
        a.sleep();

        //抽象多态创建第二个对象
        Animal5 c = new Cat5();
        c.eat();
        c.sleep();

    }
}

6、老师案例
            具体事物:十五期老师,十四期老师
            共性:姓名,年龄,讲课。

abstract class Teacher{
    private String name;
    private int age;

    public Teacher() {
    }
    public Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public abstract void teach();
}

class FourteenTeacher extends Teacher{

    public FourteenTeacher() {
    }

    public FourteenTeacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("教Hive知识");
    }
}

class FifteenTeacher extends Teacher{
    public FifteenTeacher() {
    }

    public FifteenTeacher(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("教JavaSE");
    }
}



public class AbstractTest2 {
    public static void main(String[] args) {
        //多态创建14期老师对象
        Teacher t1 = new FourteenTeacher("阿杰",20);
        t1.teach();

        //多态创建15期老师对象
        Teacher t2 = new FifteenTeacher("阿豪",18);
        t2.teach();
    }
}

7、学生案例
                具体事务:14期学员,15期学员
                共性:姓名,年龄,班级,学习,吃饭

abstract class Student2{
    private String name;
    private int age;

    public Student2() {
    }

    public Student2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //将学习定义为抽象方法
    public abstract void study();

    //吃饭是具体的方法
    public void eat(){
        System.out.println("吃米饭");
    }

}

class FifteenStudent extends Student2{
    public FifteenStudent() {
    }

    public FifteenStudent(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("学习JavaSE");
    }
}

class FourteenStudent extends Student2{
    public FourteenStudent() {
    }

    public FourteenStudent(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("学习Hive知识");
    }
}

public class AbstractTest3 {
    public static void main(String[] args) {
        //多态创建第一个对象
        Student2 s1 = new FifteenStudent("阿杰",18);
        s1.study();

        Student2 s2 = new FourteenStudent("阿豪",19);
        s2.study();

    }
}

8、假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
            经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
            请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。

            分析:
                普通员工:
                    成员变量:姓名,工号,工资
                    成员方法:工作(敲代码)
                经理
                    成员变量:姓名,工号,工资,奖金
                    成员方法:工作(做PPT)

abstract class Staff{
    private String name;
    private String id;
    private int salary;

    public Staff() {
    }

    public Staff(String name, String id, int salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public abstract void work();
}

class CommonStaff extends Staff{
    public CommonStaff() {
    }

    public CommonStaff(String name, String id, int salary) {
        super(name, id, salary);
    }

    @Override
    public void work() {
        System.out.println("敲代码");
    }
}

class Manager extends Staff{
    //特有的属性 奖金
    private int bonus;

    public Manager(int bonus) {
        this.bonus = bonus;
    }

    public Manager(String name, String id, int salary, int bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void work() {
        System.out.println("做PPT");
    }
}


public class AbstractTest4 {
    public static void main(String[] args) {
        //创建第一个对象
        Staff s1 = new CommonStaff("阿杰","KZ0080",100000);
        s1.work();

        //创建第二个对象
        Staff s2 = new Manager("阿豪","SJ00030",200000,1000000);
        s2.work();

    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值