抽象类和接口

什么是抽象类
一个类中如果有抽象方法,那么这个类就必须是一个抽象类
什么是抽象方法
抽象方法指的是没有具体的方法实现
如何定义抽象类和抽象方法
使用abstract关键字来修饰类和方法

抽象类的特点
1.抽象类和抽象方法必须使用abstract关键字修饰
public abstract class 类名{}
public abstract 返回值类型 方法名();
2.抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
3.抽象类不能实例化,但是可以通过多态的方式创建子类对象
4.抽象类的子类
要么重写抽象父类中所有的抽象方法
要么子类本身也是一个抽象类

/*
抽象类
 */
public abstract class Animal {
    //抽象方法
    public abstract void eat();
    public void sleep(){
        System.out.println("睡觉");
    }

}
public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}
/*
    测试类
 */
public class AnimalDemo {
    public static void main(String[] args) {
//        Animal a =new Animal();
        Animal a = new Cat();
        a.eat();
        a.sleep();
    }
}

猫吃鱼
睡觉

需求:
猫狗案例抽象类版重点步骤
1.定义动物类Animal
成员变量:name age
构造方法:无参、带参
成员方法:get/set方法、抽象eat()
2.定义猫类Cat,继承Animal
构造方法:无参、带参
成员方法:重写eat()方法
3.定义狗类Dog,继承Animal
构造方法:无参、带参
成员方法:重写eat()方法
4.定义测试类,创建猫狗对象并赋值。调用方法

   1.定义动物类Animal
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();
}

2.定义猫类Cat,继承Animal

public class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃老鼠");
    }

    public Cat() {
    }

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

3.定义狗类Dog,继承Animal

public class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public Dog() {
    }

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

4.定义测试类,创建猫狗对象并赋值。调用方法

public class AnimalDemo {
    public static void main(String[] args) {
        //多态
        Animal a = new Cat();
        a.setName("加肥猫");
        a.setAge(5);
        System.out.println(a.getName()+","+a.getAge());
        a.eat();
        System.out.println("---------");

        a= new Cat("加肥猫",5);
        System.out.println(a.getName()+","+a.getAge());
        a.eat();
        System.out.println("--------------");
        Animal a1 =new Dog();
        a1.setAge(2);
        a1.setName("金毛");
        System.out.println(a1.getName()+","+a1.getAge());
        a1.eat();
        System.out.println("=======");
        a1 = new Dog("二哈",2);
        System.out.println(a1.getName()+","+a1.getAge());
        a1.eat();

    }
}

打印结果:

加肥猫,5
猫吃老鼠
---------
加肥猫,5
猫吃老鼠
--------------
金毛,2
狗吃骨头
=======
二哈,2
狗吃骨头

接口
接口就是一种公共的规范标准,只要符合规范标准,都可以使用
java中的接口更多的体现在对行为的抽象
接口的特点
1.如何定义接口
public interface 接口名{}
2.如何实现接口
public class 类名 implements 接口名{}
3.接口不能被实例化,可以通过多态形式创建实现类对象
4.接口的实现类
要么重写接口中所有的抽象方法
要么实现类定义为抽象类
需求:
定义接口Jumping,提供抽象jump方法
定义猫类Cat,实现Jumping接口。重写jump方法
通过多态创建对象,调用方法

//定义了一个接口
public interface Jumpping {
    public abstract void jump();
}
public class Cat implements Jumpping {
    @Override
    public void jump() {
        System.out.println("猫可以挑搞了");
    }
}
public  class Dog implements Jumpping {
    @Override
    public void jump() {
        System.out.println("狗可以跳高了");
    }
}

/*
    测试类
 */
public class JumppingDemo {
    public static void main(String[] args) {
        Jumpping j = new Cat();
        j.jump();

        Jumpping j1 = new Dog();
        j1.jump();
    }
}

打印结果:
猫可以挑搞了
狗可以跳高了

接口的成员特点
1.成员变量
只能是常量,默认修饰符为:public static final
2.构造方法
接口中没有构造方法
3.成员方法
接口中可以有抽象方法,默认修饰符为:public abstract
JDK8以后可以有静态方法
JDK9以后可以有默认方法

//接口
public interface Inter {
    public int num = 10;//成员变量
    public final int num2 = 20;//final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
    int num3 = 30;//成员变量
//    public inter(){}   不能1有构造方法
//    public  void  show(){}  接口里不能用非抽象方法
    public abstract void method();//只能1抽象的
    void  show();//接口里的方法默认带有  public abstract 修饰符
}
//接口的实现类
//public class InterImpl implements Inter{
public class InterImpl extends Object implements Inter{
    @Override
    public void method() {
        System.out.println("method");
    }

    @Override
    public void show() {
        System.out.println("show");
    }

    public  InterImpl(){
        super();

    }

}
/*
    测试类
 */
public class InterfaceDemo {
    public static void main(String[] args) {
        Inter i = new InterImpl();
        System.out.println(i.num);

        System.out.println(i.num2);
        System.out.println(Inter.num);

    }
}

结果:

10
20
10

需求:
接口版猫狗案例主要步骤
1.定义接口Jumping,提供抽象方法跳高jump
2.定义动物类Animal
成员变量:name age
构造方法、get和set方法
抽象eat方法
3.定义猫类Cat,继承Animal,实现Jumping
重写两个抽象方法
4.定义狗类Dog,继承Animal,实现Jumping
重写两个抽象方法
5.定义测试类,完成代码测试

1.定义接口Jumping,提供抽象方法跳高jump

public interface Jumpping {
    public abstract void jump();
}

2.定义动物类Anima

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();
}

3.定义猫类Cat,继承Animal,实现Jumping
重写两个抽象方法

public class Cat extends Animal implements Jumpping {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void jump() {
        System.out.println("猫可以调高了");
    }

    public Cat() {
    }

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

4.定义狗类Dog,继承Animal,实现Jumping
重写两个抽象方法

public class Dog extends Animal implements Jumpping {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    @Override
    public void jump() {
        System.out.println("狗可一套高了");
    }

    public Dog() {
    }

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

5.定义测试类,完成代码测试

public class AnimalDemo {
    public static void main(String[] args) {
        //先用接口
        Jumpping j =new Cat();
        j.jump();

        System.out.println("---");

        Animal 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();
        System.out.println("----------------");
        Jumpping j1 = new Dog();
        j1.jump();
        System.out.println("===");
        Animal a1 = new Dog();
        a1.setName("金毛");
        a1.setAge(5);
        System.out.println(a1.getName()+a1.getAge());
        a1.eat();
        System.out.println("====");
        Dog d = new Dog();
        d.setName("金毛");
        d.setAge(5);
        System.out.println(d.getName()+","+d.getAge());
        d.eat();
        d.jump();
    }
}

输出结果

猫可以调高了
---
加肥猫,5
猫吃鱼
=======
加肥,5
猫吃鱼
猫可以调高了
----------------
狗可一套高了
===
金毛5
狗吃肉
====
金毛,5
狗吃肉
狗可一套高了

类和类之间的关系
继承关系,可以单继承,不能多继承,但是可以多层继承
类和接口之间的关系
实现关系,可以单实现,也可以多实现
还可以继承一个类的同时,再实现多个接口
接口和接口之间的关系
继承关系,可以单继承、也可以多继承

抽象类和接口的区别
1.成员区别
抽象类:变量、常量、构造方法、普通方法、抽象方法
接口:常量、抽象方法
2.关系区别
类和类:继承关系,单继承
类和接口:实现关系,单实现、多实现
接口和接口:继承关系,单继承、多继承
3.设计理念区别
抽象类:完成的是一些共性功能的抽取
接口:完成的是一些特性功能的抽取

运动员和教练案例的重要步骤
定义说英语接口 成员方法:说英语();
定义抽象人类 成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();
定义抽象教练类,继承人类 构造方法:无参,带参;成员方法:教();
定义抽象运动员类,继承人类 构造方法:无参,带参;成员方法:学习();
定义具体篮球教练类,继承教练类 构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…}
定义具体乒乓球教练类,继承教练类,实现说英语接口
构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…},重写说英语(){…}
定义具体篮球运动员类,继承运动员类 构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…}
定义具体乒乓球运动员类,继承运动员类,实现说英语接口
构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…},重写说英语(){…}
定义测试类,写代码测试

定义说英语接口 成员方法:说英语();


//说英语的接口
public interface SpeakEnglish {
    public abstract void speak();
}

定义抽象人类 成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();

//抽象人类
public abstract class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(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 abstract class Coach extends Person {
    public Coach() {
    }

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

    public abstract void teach();
}

定义抽象运动员类,继承人类 构造方法:无参,带参;成员方法:学习();


//抽象运动员类
public abstract class Player extends Person {
    public Player() {
    }

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

    public abstract void study();
}

定义具体篮球教练类,继承教练类 构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…}

public class BaskerballCoach extends Coach {
    @Override
    public void teach() {
        System.out.println("篮球教练教如何运球");
    }

    @Override
    public void eat() {
        System.out.println("篮球教练吃盒饭");
    }

    public BaskerballCoach() {
    }

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

定义具体乒乓球教练类,继承教练类,实现说英语接口
构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…},重写说英语(){…}

public class PingPangCoach extends Coach implements SpeakEnglish {
    @Override
    public void teach() {
        System.out.println("乒乓球教练教握拍");
    }

    @Override
    public void eat() {
        System.out.println("乒乓球教练吃大餐");
    }

    @Override
    public void speak() {
        System.out.println("乒乓球教练学习英语");
    }

    public PingPangCoach() {
    }

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

定义具体篮球运动员类,继承运动员类 构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…}

public class BasketballPlayer extends Player  {
    @Override
    public void study() {
        System.out.println("篮球运动员学习运球");
    }

    @Override
    public void eat() {
        System.out.println("篮球运动员吃牛肉");
    }

    public BasketballPlayer() {
    }

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

定义具体乒乓球运动员类,继承运动员类,实现说英语接口构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…},重写说英语(){…}

public class PingPangPlayer extends Player implements SpeakEnglish {
    @Override
    public void eat() {
        System.out.println("乒乓球运动员吃大白菜");
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员学习握拍");
    }

    @Override
    public void speak() {
        System.out.println("乒乓球运动员学习英语");
    }

    public PingPangPlayer() {
    }

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

定义测试类,写代码测试

public class Demo {
    public static void main(String[] args) {
        //创建对象
        PingPangPlayer ppp = new PingPangPlayer();
        ppp.setName("马龙");
        ppp.setAge(35);
        System.out.println(ppp.getName()+","+ppp.getAge());
        ppp.speak();
        ppp.eat();
        ppp.study();

        PingPangCoach ppc = new PingPangCoach("刘国梁",50);
        System.out.println(ppc.getName()+","+ppc.getAge());
        ppc.speak();
        ppc.eat();
        ppc.teach();



    }
}

乒乓球运动员学习握拍
刘国梁,50
乒乓球教练学习英语
乒乓球教练吃大餐
乒乓球教练教握拍

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值