抽象类

Posted wyj96

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象类相关的知识,希望对你有一定的参考价值。

 

4、抽象类案例 

需求:开发团队中有程序员和经理两种角色,他们都有姓名、工资、工号等属性,都有工作的行为,经理还有奖金属性,请使用继承思想设计出上述需求的类,并分别创建对象使用。

package com.wang.duixiang;

public class AbstractDemo03 {
    public static void main(String[] args) {
      TeamWorker t=new ItWorker();
      t.setID("123456");
      t.setName("王迎婧");
      t.setSalary(7000);
      t.work();
        System.out.println("-----------------------------------------");
      Manager manager=new Manager();
      manager.setID("654321");
      manager.setName("fewof");
      manager.setSalary(10000);
      manager.setBonus(3000);
      manager.work();
        System.out.println("---------------------------------------------");
      //快速实例化
        ItWorker itWorker1=new ItWorker("张三",8000,"009");
        System.out.println("姓名:"+itWorker1.getName());
        System.out.println("工资:"+itWorker1.getSalary());
        System.out.println("工号:"+itWorker1.getID());
        Manager manager1=new Manager("李四",30000,"001",5000);
        System.out.println("姓名:"+manager1.getName());
        System.out.println("工资:"+manager1.getSalary());
        System.out.println("工号:"+manager1.getID());
        System.out.println("奖金:"+manager1.getBonus());
}}
class ItWorker extends TeamWorker{
    public ItWorker(){}
    public ItWorker(String name,int salary,String ID){
        super(name, salary, ID);
    }
    @Override
    public void work(){
        System.out.println(getName()+"负责开发程序,他的月工资为"+getSalary()+"");
    }
}
class Manager extends TeamWorker{
     private int bonus;//奖金

    public void setBonus(int bonus) {
        this.bonus = bonus;
    }

    public int getBonus() {
        return bonus;
    }
    //在实际开发中,子类一般都有两个构造方法
    //子类的空参构造访问父类的空参构造,子类的全参构造访问父类的全参构造
public Manager(){}
    public Manager(String name,int salary,String ID,int bonus){
        super(name, salary, ID);
        this.bonus=bonus;
    }
    public void work(){
        System.out.println(getName()+"是一名经理,负责管理,月工资为:"+getSalary()+"元,奖金为"+getBonus());
    }
}
abstract class TeamWorker{
    private String name;
    private int salary;
    private String ID;
    public TeamWorker(){}
    public TeamWorker(String name,int salary,String ID){
        this.name=name;
        this.salary=salary;
        this.ID=ID;}
public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public int getSalary() {
        return salary;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getID() {
        return ID;
    }
public abstract void work();
}

 

1、概念

包含抽象方法的类,用abstract修饰。

只有方法声明,没有方法体的方法就是抽象方法

当需要定义一个方法,但是不明确具体实现时,可以将方法定义为abstract,具体实现延迟到子类

public abstract class Animal{//因为包含抽象方法,所以它是抽象类
    private String name;
    public abstract void eat()//抽象方法。因为是动物就一定得吃饭,所以{}中是否写东西无所谓就去掉了
}
public class AbstractDemo01 {
    public static void main(String[] args) {
       Dog5 dog5=new Dog5();
       dog5.setName("哈士奇");
       dog5.eat();
        System.out.println("-----------------------------------------");
        //通过多态进行测试
        Animal5 animal5=new Dog5();
        animal5.setName("huahua");
        animal5.eat();
    }
}
class Dog5 extends Animal5{
    @Override
    public void eat(){
        System.out.println(getName()+"吃骨头");
    }}
abstract class Animal5{
    private String name;

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

    public String getName() {
        return name;
    }
    //抽象方法:要求子类必须重写
    public abstract void eat();
}

2、抽象类的特点

①修饰符:必须用abstract关键字修饰    修饰符 abstract class 类名{}

②抽象类不能被实例化,即不能new,只能创建子类对象

③抽象类子类的两个选择:重写父类的所有抽象方法或者也定义为抽象类

3、抽象类成员的特点:

①可以是普通的成员变量也可以是成员常量final

②可以有普通方法也可以有抽象方法

③像普通类一样有构造方法,且可以重载

 

public class AbstractDemo02 {
    public static void main(String[] args) {
        //Animal6 animal6 = new Animal6();这样写是错误的,因为Animal6是抽象类,不能实例化
        Animal6 animal6= new Dog6();
        animal6.setName("哈士奇");
        //animal6.AGE=70;常量值不能发生改变
        System.out.println(animal6.AGE);

    }
}
abstract class Cat1 extends Animal6{//不重写父类抽象方法时可以把子类也写成抽象类

}
class Dog6 extends Animal6{
    @Override
    public void eat(){
        System.out.println(getName()+"吃骨头");
    }
    @Override
    public void sleep(){
        System.out.println(getName()+"正在睡觉");
    }
}
abstract class Animal6{
    private String name;
    //成员常量
    final int AGE=30;
    //构造方法
    public Animal6(){}
    public Animal6(String name){
        this.name=name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
return name;
    }
    //抽象方法
    public abstract void eat();
    public abstract void sleep();
    //非抽象方法
    public void call(){
        System.out.println("动物会叫");
    }
}

抽象类比普通类多一种抽象方法

以上是关于抽象类的主要内容,如果未能解决你的问题,请参考以下文章

查看发票组代码后的总结和有感

使用 Git 来管理 Xcode 中的代码片段

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

记一次抽象类中定义的静态变量,多个子类继承后,在方法中被重写引起的问题

Java 封装