Java基础(抽象类与接口的理解)

    xiaoxiao2023-10-08  143

    1.抽象类和接口的特点。

    抽象类:定义共性功能,继承抽象类,那么抽象类中的抽象方法必须全部实现。

    抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中抽象类不可以直接创建对象(原因:调用抽象方法没有意义)只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。不然子类也要是抽象类。

    接口:用于拓展性。(谁需要这个功能,就给谁)

    包含了功能声明的特殊类。定义格式:public interface 接口名{}    使用格式:class A implements 接口名{}接口中可以定义成员变量,但变量只能是最终变量,并且是静态的。默认修饰符:public static final。接口中可以定义方法,但只能是抽象方法。接口中没有构造方法,不可以创建对对象。子类必须覆盖掉接口中所有的抽象方法,子类才可以实例化。

    2.细节问题

    抽象类

    抽象类一定是父类抽象类中可以不定义抽象方法(意义:静态方法可以直接让子类去使用)关键字不可以和private,final一起用。(final声明的类不允许有子类,private私有的不允许覆写)

    接口

    多个接口之间可以使用extends进行多继承类可以实现多个接口

    代码示例:

    package day0526; /** * 1、类可以实现多个接口 * 必须实现接口的所有抽象方法 * 注:可以实现部分方法,但该类必须是抽象类 * 2、接口可以实现多继承 */ //多实现 public class demo1 implements Inter1,Inter { public void show(){ } } //多继承 interface Inter extends Inter1,Inter2{ //定义变量默认修饰符public static final int a=10; //定义方法默认修饰符public abstract void show(); //接口中不允许有构造方法 } interface Inter1{ } interface Inter2{ }

    二者的选用

    优先选择接口,尽量少用抽象类需要定义子类的行为,又要为子类提供共性功能时才选用抽象类。

    3.案例:

    要想实现这些,首先我们先来分析一下。

    然后在画图分析他们之间的关系,每个对象之间的联系,以及他们的属性和方法。

    分析完之后,用代码来实现。

    //定义接口

    interface Learnenglish{

    public abstract void learnspeaking();

    }

    //公共的抽象类(人)

    abstract class Person1{

    private String name;

    private int age;

    public Person1(String name,int age) {

    this.name=name;

    this.age=age;

    }

    public void Print() {

    System.out.println(name+"---"+age);

    }

    public abstract void eat() ;

    public abstract void sleep();

    }

    //抽象类(运动员)

    abstract class Athlete extends Person1{

    public Athlete(String name,int age) {

    super(name,age);

    }

    public void eat() {

    System.out.println("吃健康的食物。");

    }

    public void sleep() {

    System.out.println("早睡早起");

    }

    public abstract void learn();

    }

    //抽象类(教练)

    abstract class Coach extends Person1{

    public Coach(String name,int age) {

    super(name,age);

    }

    public void eat() {

    System.out.println("合理膳食,保持身体");

    }

    public void sleep() {

    System.out.println("作息规律");

    }

    public abstract void teach();

    }

    //具体的类(运动员)

    class PingPong extends Athlete implements Learnenglish{

    public PingPong(String name,int age) {

    super(name,age);

    }

    public void learn() {

    System.out.println("学习乒乓球");

    }

    public void learnspeaking() {

    System.out.println("学习英语!");

    }

    }

    class Basketball extends Athlete{

    public Basketball(String name,int age) {

    super(name,age);

    }

    public void learn() {

    System.out.println("学习篮球");

    }

    }

    //具体的类(教练)

    class PingCoach extends Coach implements Learnenglish{

    public PingCoach(String name,int age) {

    super(name,age);

    }

    public void teach() {

    System.out.println("乒乓球教学");

    }

    public void learnspeaking() {

    System.out.println("学习英语!");

    }

    }

    class BasketCoach extends Coach{

    public BasketCoach(String name,int age) {

    super(name,age);

    }

    public void teach() {

    System.out.println("篮球教学");

    }

    }

    //测试类

    public class Myproject1 {

          public static void main(String[]args) {

          BasketCoach a=new BasketCoach ("yyy",20);

          a.Print();

          a.eat();

          a.sleep();

          a.teach();

          }

    }

    一个篮球教练的测试类:

    运行结果:

    一个乒乓球运动员的测试类:

    运行结果:

    最新回复(0)