Java中的抽象类和接口

接口和抽象类是对多态的一个补充,由于有的类不能初始化,只适合作为一个抽象的概念蓝图,要限制这些类的子类才能被初始化,因此接口和抽象类的概念被提出

抽象类

在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类,抽象类的关键字是==abstract==

不能直接new一个抽象类

抽象类和抽象方法的定义

抽象方法没有方法体,是为了标记多态而存在的。

抽象方法放宽了抽象父类的限制,让父类能够更方便的从所有子类中抽象出共性代码

//抽象类的定义
public abstract class 类名 {}

//抽象方法的定义
public abstract void eat();

抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

在创建一个抽象类时,需要对类中的所有抽象方法进行重写

Object类

Object类是Java中所有类的父类,但是Object类不是抽象类,没有必须被覆盖的方法,Object中的部分方法可以进行重写。

这里主要注意以下几个问题:

  • 为什么允许创建Object对象?

    因为有时候会需要创建一个通用的对象,一般在线程同步化上可能用到

  • 设置Object类的目的是什么?

    • 作为多态让方法可以应付多种类型的机制
    • 提供Java执行期间对象通用的一些方法
  • 为什么不把所有参数都定义为Object?

    面向对象三大特征详解一文中介绍过多态的向上转型和向下转型,如果将所有参数都定义为Object那么相当于是一种向上转型,所以在调用成员方法时只能调用Object中的声明过的成员方法

    下面两张图可以帮助理解Object中的多态问题:

    向上转型
    在这里插入图片描述

​ 向下转型

在这里插入图片描述

接口

接口是一种公共的规范标准,可以用于解决多重继承问题,接口定义的关键字是interface,接口实现的关键字是implements

接口中的所有方法都是抽象方法,所以接口是一种抽象类。

// 接口定义
public interface 接口名 {} 

// 接口实现
public class 类名 implements 接口名 {}

需要注意的是:在Java中,一个子类只能继承一个父类,但是可以同时实现多个接口

代码实例

  • 案例需求

      对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。
    
      请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
    
  • 代码实现

    • 动物类
    public abstract class Animal {
        private String name;
        private int age;
    
        public Animal() {
        }
    
        public Animal(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 eat();
    }
    
    • 跳高接口
    public interface Jumpping {
        public abstract void jump();
    }
    
    • 猫类
    public class Cat extends Animal implements Jumpping {
    
        public Cat() {
        }
    
        public Cat(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void eat() {
            System.out.println("猫吃鱼");
        }
    
        @Override
        public void jump() {
            System.out.println("猫可以跳高了");
        }
    }
    
    • 测试类
    public class AnimalDemo {
        public static void main(String[] args) {
            //创建对象,调用方法
            Jumpping j = new Cat();
            j.jump();
            System.out.println("--------");
    
            Animal a = new Cat();
            a.setName("加菲");
            a.setAge(5);
            System.out.println(a.getName()+","+a.getAge());
            a.eat();
    //        a.jump();
    
            a = new Cat("加菲",5);
            System.out.println(a.getName()+","+a.getAge());
            a.eat();
            System.out.println("--------");
    
            Cat c = new Cat();
            c.setName("加菲");
            c.setAge(5);
            System.out.println(c.getName()+","+c.getAge());
            c.eat();
            c.jump();
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值