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();
}
}
一个篮球教练的测试类:
运行结果:
一个乒乓球运动员的测试类:
运行结果: