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

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

      }

}

一个篮球教练的测试类:

运行结果:

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

运行结果:

发布了75 篇原创文章 · 获赞 164 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_41679818/article/details/90545145
今日推荐