Java入门 第十节(一)抽象类

抽象类

1. 什么是抽象类 ?

  1. 抽象类也是一个类,设计上更简洁,体现的是一种 模板思想
  2. 并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
    • 有方法名没有方法体。
  3. 抽象类表达针对,是对一系列看上去不同,但是本质上相同的具体概念 的抽象。
    • 举个栗子: 动物的叫声这件事!
//1 . 还记得继承时怎么回事么?

class Animal{

}

class Tiger{

}

class Sheep{

}

2. 语法定义

  1. 被 关键字 abstract 修饰的,叫做抽象类。

  2. 被 关键字abstract 修饰的方法 叫做抽象方法。

    • 这种方法 只有相同功能声明,没有方法主体
  3. 具有抽象方法的类一定为抽象类。

    权限修饰符 abstract  返回值类型 方法名(参数列表.. );
    
  • 语法示例:
    	abstract class Animal{ //类需要被关键字  abstract 修饰
    	
    	   abstract public void call(); // 权限修饰符和抽象关键字位置可以任意!
    	   
    	}
    

2.1. 抽象类的特点

  1. 关键字 abstract 可以修饰的方法
  2. 抽象类,不能被实例化,即,不能被创建对象。
  3. 抽象类只有方法声明,没有方法体。
  4. 抽象类里 可以没有 抽象方法(可以有普通方法)。
  5. 子类(如果不是抽象类)继承抽象类之后,必须把所有方法重写!
    • 如果不想重写,那么需要 成为一个抽象子类。

3. 入门案例

  1. 抽象类,是其父类无法确定全部实现,而是由其子类提供,具体实现对象的类。

  2. 当方法名相同,方法体不同的时候,就可以 设计成 抽象类,提取抽象方法

  3. 例如: 一个系统必须有两种角色,一个是管理岗位,一个是用户。

    • 但是这两种角色都是属于 公司员工。
    • 提示:先定义管理员,使用者,然后抽取共同体。定义抽象类 角色
    public class Abstract_Test {
        public static void main(String[] args) {
            // 根据抽象类特点,new Role(); 抽象类不能创建实例对象
            Role role= new Java();
            //多态,编译看左边,执行看右边
            role.systeminfo(); //自己实现方法
            role.salary(); //调用父类方法
    
        }
    }
    
    /*
        根据设计定义抽象类角色
     */
    
     abstract class Role{ //这个类里有抽象方法时,该类就必须是抽象类。
        //1.当方法名称相同,方法体不同时,可以使用抽象类。
        //并提取抽象方法
        abstract public void systeminfo(); //方法体让子类自己实现
    
         /*2. 抽象类中也可以有非抽象方法
          */
         public void salary(){
             System.out.println("发薪水...");
         }
    }
    
    /*
        定义管理员
     */
    class Manger extends Role{
    
        //管理岗位对于系统来说是维护
        public void systeminfo(){
            System.out.println("维护系统... ");
        }
    }
    
    /*
        定义用户
     */
    class User extends Role{
        //用户对于系统来说,属于操作者
        public void systeminfo(){
            System.out.println("使用系统... ");
        }
    }
    
    /*
        新增,开发人员
     */
    class Java extends Role{
        @Override
        public void systeminfo() {
            System.out.println("开发系统... ");
        }
    
    }
    
    
  • 输出结果:

    开发系统... 
    发薪水...
    

4. 抽象类的用法

4.1 构造函数用法

  1. 思考一个问题,为啥? 既然抽象类无法实例化,为什么还有构造方法!?
  2. 思考二个问题,为啥? 抽象类虽然有构造器,但是抽象类不能创建对象!?
	public class Abstract_Test2 {
    public static void main(String[] args) {
         new User2();

    }
}

abstract class  Role2{
    //构造方法
    public Role2() {
        System.out.println("Role2 抽象类构造方法");
    }
}

class User2 extends Role2{

    //继承,空参构造方法第一行就是调用父类的构造方法super


}
  • 结果输出:

     Role2 抽象类构造方法
    

4.2 普通方法 和 属性的使用

  1. 抽象类抽象方法 可以用关键字 final 一起使用么!?
public class Abstract_Test2 {
    public static void main(String[] args) {
        Role2 role2 = new User2();
        System.out.println(role2.name);//多态的成员变量调用使用的是父类的。
        System.out.println(role2.TIME_VALUE);

        role2.salary(); // 可以使用父类的final方法,就是子类不能重写了。
        role2.eat();

    }
}

abstract class Role2{

    String name; //名称
    final String TIME_VALUE="1949-10-1";

    //1.就是一个普通方法
   final public void salary(){
        System.out.println("发薪水... ");
    }


    abstract public void eat();


}

class User2 extends Role2{
    @Override
    public void eat() {
        System.out.println("吃员工餐");
    }

}
  • 输出结果:

    null
    1949-10-1
    发薪水... 
    吃员工餐
    

5. 小结:

5.1 面向抽象类编程案例–师生

  1. 具体分类:学生,老师。
    • 共性特点: 学习
/**
 * 测试类
 */
public class Abstract_Demo {

    public static void main(String[] args) {
        /*
            创建对象
         */
        Teacher t = new Teacher();
        Student s  = new Student();

        t.study();
        s.study();

        t.setName("琼哥儿");
        t.setNum(10086);
        System.out.println(t.toString()); //输出结果
    }
}

//相同的属性和方法可以抽取共同的类
abstract class School_Person{
    //将学员和老师的共同属性方法抽取出来!
    //私有方法需要对外提供访问
   private String name;
   private int num;

    public String getName() {
        return name;
    }

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

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "School_Person{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }

    abstract  public void  study();

}


//老师类
class Teacher extends School_Person{

    @Override
    public void study() {
        System.out.println("备课,写教案");
    }
}

// 学生类
class Student extends School_Person{

    @Override
    public void study() {
        System.out.println("温故而知新");
    }
}
  • 输出结果:

    备课,写教案
    温故而知新
    School_Person{name='琼哥儿', num=10086}
    

5.2 面试题:什么时候使用抽象类?

  1. 当一个类需要继承 或者多态时,这个时候就会出现设计层面的思考,实例化本身是否有意义 ?
  2. 啥意思 ?在我们之前说过的案例,
    • 针对于系统来说, 角色有很多, 用户,管理,领导,组长, 都有对系统上操作权限的不同范围, 如: 查看,审核, 添加等操作,这时就需要定义一个父类 Role 。
  3. 是在父类中去实现 查看,审核,添加的具体实现没有意义,这些都需要交给不同的子类实现。所以父类只需要定义方法即可无需实现,即,让子类去重写方法,写具体内容,实例化它的子类才有意义,根据不同的操作权限去实例化不同的子类对象,这就是抽象类设计所在。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值